LDA降维和分类

阅读更多
LDA降维和分类




LDA可以降维和分类
LinearDiscriminantAnalysis(LDA):
就是将多维的样本数据集映射到一个坐标轴上(可以是多维的(以降维作为目的)),使得样本数据可以在这个坐标轴上就可以进行分类,和最小的类内距离,投影后使样本在新的子空间有最大的类间距离即样本在该空间中有最佳的可分离性。(即用这个坐标系就可以进行样本分类了,以达到计算简单,减小计算时间)
分类前的降维
LDA降维:是为了在坐标轴上的同类更集中,异类更分散

# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np


def main():
    np.random.seed(0)
    # 设置随机种子,不设置的话默认是按系统时间作为参数,因此每次调用随机模块时产生的随机数都不一样设置后每次产生的一样
    iris = datasets.load_iris()
    # 导入鸢尾花的数据集,iris是一个类似于结构体的东西,内部有样本数据,如果是监督学习还有标签数据
    iris_x = iris.data
    # 样本数据150*4二维数据,代表150个样本,每个样本4个属性分别为花瓣和花萼的长、宽
    iris_y = iris.target
    # 长150的以为数组,样本数据的标签
    indices = np.random.permutation(len(iris_x))
    # permutation接收一个数作为参数(150),产生一个0-149一维数组,只不过是随机打乱的,当然她也可以接收一个一维数组作为参数,结果是直接对这个数组打乱
    iris_x_train = iris_x[indices[:-10]]
    # 随机选取140个样本作为训练数据集
    iris_y_train = iris_y[indices[:-10]]

    # 并且选取这140个样本的标签作为训练数据集的标签
    iris_x_test = iris_x[indices[-10:]]
    # 剩下的10个样本作为测试数据集

    iris_y_test = iris_y[indices[-10:]]

    # 降为2维进行分类
    lda = LinearDiscriminantAnalysis(n_components=2)
    lda.fit(iris_x_train, iris_y_train)

    # 显示训练结果
    print("lda.means_")
    print(lda.means_)  # 中心点
    print("score")
    print(lda.score(iris_x_test, iris_y_test))  # score是指分类的正确率
    print("lda.scalings_")
    print(lda.scalings_)  # score是指分类的正确率

    X_2d_test = lda.transform(iris_x_test)
    print("X_2d_test")
    print(X_2d_test)  # score是指分类的正确率

    # 降维后进行训练
    X_2d = lda.transform(iris_x_train)  # 现在已经降到二维X_2d=np.dot(X-lda.xbar_,lda.scalings_)
    lda.fit(X_2d, iris_y_train)

    # 降维后预测
    predict_y = lda.predict(X_2d_test)

    print("predict_y")
    print(predict_y)  #
    # [1 2 1 0 0 0 2 1 2 0]

    print("iris_y_test")
    print(iris_y_test)  #
    # [1 1 1 0 0 0 2 1 2 0]

    # # 对于二维数据,我们做个可视化
    # # 区域划分
    # # lda.fit(X_2d, iris_y_test)
    h = 0.02
    # 得到最大值和最小值
    x_min, x_max = X_2d[:, 0].min() - 1, X_2d[:, 0].max() + 1
    y_min, y_max = X_2d[:, 1].min() - 1, X_2d[:, 1].max() + 1
    # 网格数据
    xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                         np.arange(y_min, y_max, h))

    predict_x = np.c_[xx.ravel(), yy.ravel()]
    print("predict_x")
    print(predict_x)  #

    Z = lda.predict(predict_x)
    print("Z")
    print(Z)  #
    # [2 2 2... 0 0 0]

    #变为与XX的维数相同
    Z = Z.reshape(xx.shape)
    print("Z")
    print(Z)  #

    # contour和contourf都是画三维等高线图的,不同点在于contourf会对等高线间的区域进行填充,
    plt.contourf(xx, yy, Z, cmap=plt.cm.Paired)
    #
    # 做出原来的散点图
    class1_x = X_2d[iris_y_train == 0, 0]#得到iris_y_train == 0的数组X,布尔索引
    class1_y = X_2d[iris_y_train == 0, 1]#得到iris_y_train == 0的数组Y
    l1 = plt.scatter(class1_x, class1_y, color='b', label=iris.target_names[0])
    class1_x = X_2d[iris_y_train == 1, 0]
    class1_y = X_2d[iris_y_train == 1, 1]
    l2 = plt.scatter(class1_x, class1_y, color='y', label=iris.target_names[1])
    class1_x = X_2d[iris_y_train == 2, 0]
    class1_y = X_2d[iris_y_train == 2, 1]
    l3 = plt.scatter(class1_x, class1_y, color='r', label=iris.target_names[2])

    plt.legend(handles=[l1, l2, l3], loc='best')

    plt.grid(True)
    plt.show()


if __name__ == '__main__':
    main()




# coding=utf-8

import pandas as pd
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn import datasets
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
import numpy as np


def main():
    data=np.array([[1,1],[2,2],[1.5,1.5],[3,3],[2,3],[1,5]])

    X = data[:, 0].reshape(-1, 1)  # 将array转换成矩阵(变成n行1列)
    y = data[:, 1].reshape(-1, 1)

    print("X=", X)
    print("y=", y)
    # 画相关的点
    plt.plot(X, y, "b.")
    plt.xlabel('X')
    plt.ylabel('y')
    plt.show()

    z_train = [0,0,0,1,1,1]

    lda = LinearDiscriminantAnalysis(n_components=2)
    lda.fit(data, z_train)
    predict_y = lda.predict([[2,1.5]])
    print('predict_y', predict_y)  # 中心点

    train_lda_X = lda.transform(data)
    print("train_lda_X ", train_lda_X)
    print("截距: ", lda.intercept_)
    print("系数: ", lda.coef_)


    # 显示训练结果
    # print(lda.means_)  # 中心点
    # print(lda.score(X_test, Y_test))  # score是指分类的正确率
    # print(lda.scalings_)  # score是指分类的正确率

    # predict_y = lda.predict([2,1.5])
    # print("predict_y: ", predict_y)







if __name__ == '__main__':
    main()


你可能感兴趣的:(LDA降维和分类)