机器学习之鸢尾花-降维

2020-05-22 00:00:00 数据 特征 投影 方差 比例

机器学习中,数据通常被表示为向量形式输入模型进行训练,但对于大量的多维数据直接进行处理和分析会极大消耗系统资源,因此需要通过降维缓解这一问题。降维,就是用一个低维度向量来表示原始高维度向量的特征。常见的方法有:

主成分分析Principal Components Analysis,PCA

线性判别分析Linear Discriminant Analysis,LDA

等距映射

局部线性嵌入

拉普拉斯特征映射

局部保留投影

如下:

# 主成分分析(Principal Component Analysis,PCA), 是目前为止流行的降维算法。
#         通过正交变换将一组可能存在相关性的变量转换为一组线性不相关的变量,转换后的这组变量叫主成分。
#         首先它找到接近数据集分布的超平面,然后将所有的数据都投影到这个超平面上。
#         PCA是无监督的方式,它没有分类标签,降维之后需要采用K-Means或自组织映射网络等无监督的算法进行分类。
# 线性判别分析(Linear Discriminant Analysis)
#         LDA是一种监督学习的降维技术, 即他要求训练数据是有标签信息的数据集。
#         核心思想是:投影后类内方差小,类间方差大。LDA要将数据在低维度上进行投影,投影后希望每一种类别数## 1 算法原理
#         基本思想是假设各个类别的样本数据符合高斯分布,这样利用LDA进行投影后,可以利用极大似然估计计算各个类别投影数据的均值和方差,进而得到该类别高斯分布的概率密度函数。当一个新的样本到来后,我们可以将它投影,然后将投影后的样本特征分别带入各个类别的高斯分布概率密度函数,计算它属于这个类别的概率,大的概率对应的类别即为预测类别。
# 两者都是为了在对原始数据降维之后进行分类。
# PCA为非监督降维,LDA为有监督降维。
#         PCA希望投影后的数据方差尽可能的大(大可分性),因为其假设方差越多,则所包含的信息越多;
#         LDA则希望投影后相同类别的组内方差小,而组间方差大。LDA能合理运用标签信息,使得投影后的维度具有判别性,不同类别的数据尽可能的分开。
# 举个简单的例子,在语音识别领域,如果单纯用PCA降维,则可能功能仅仅是过滤掉了噪声,还是无法很好的区别人声,但如果有标签识别,用LDA进行降维,则降维后的数据会使得每个人的声音都具有可分性,同样的原理也适用于脸部特征识别。 所以,可以归纳总结为有标签就尽可能的利用标签的数据(LDA),而对于纯粹的非监督任务,则还是得用PCA进行数据降维。
# PCA和LDA的相同点
#         PCA和LDA都是经典的降维算法;
#         PCA和LDA都假设数据是符合高斯分布的;
#         PCA和LDA都利用了矩阵特征分解的思想。
# PCA和LDA的不同点
#         PCA是无监督(训练样本无标签)的,LDA是有监督(训练样本有标签)的;
#         PCA是去掉原始数据冗余的维度,LDA是选择一个佳的投影方向,使得投影后相同类别的数据分布紧凑,不同类别的数据尽量相互远离。
#         LDA多可以降到k-1维(k是训练样本的类别数量,k-1是因为后一维的均值可以由前面的k-1维的均值表示);
#         LDA可能会过拟合数据。
from sklearn.decomposition import PCA
from sklearn.discriminant_analysis import LinearDiscriminantAnalysis as LDA
def test_reduce(X_train, X_test, y_train, y_test,X,y):
    pca = PCA(n_components=3)
    X_pca = pca.fit_transform(X)
    lda = LDA(n_components=3)
    X_lda = lda.fit_transform(X, y)
    print('PCA 降维到三维特征后的方差比例:{}'.format(pca.explained_variance_ratio_))
    print('LDA 降维到三维特征后的方差比例:{}'.format(lda.explained_variance_ratio_))
    print(pca.components_)
    print(pca.explained_variance_)
    # PCA 降维到三维特征后的方差比例:[0.92461872 0.05306648 0.01710261]
    # 投影后三个特征维度的方差比例大约为92.246%:0.0538%:0.017%。投影后个特征占了绝大多数的主成分比例。
    # LDA 降维到三维特征后的方差比例:[0.9912126 0.0087874]
    # 投影后三个特征维度的方差比例大约为99.12%:0.8787%。投影后个特征占了绝大多数的主成分比例。
    # LDA只有两维所以画不了三维图像

    colors = ['navy''turquoise''darkorange']
    target_names = ['setosa''versicolor''virginica']
    lw = 2

    from mpl_toolkits.mplot3d import Axes3D
    fig = plt.figure()
    ax = Axes3D(fig)
    for color, i, target_name in zip(colors, [12], target_names):
        ax.scatter3D(X_pca[y == i, ], X_pca[y == i, 1], X_pca[y == i, 2],color=color, alpha=.8, lw=lw,
                    label=target_name)
    plt.legend(loc='best', shadow=False, scatterpoints=1)
    plt.title('PCA of IRIS dataset')
    plt.show()
    pca = PCA(n_components=2)
    X_pca = pca.fit_transform(X)
    lda = LDA(n_components=2)
    X_lda = lda.fit_transform(X,y)
    print('PCA 降维到两维特征后的方差比例:{}'.format(pca.explained_variance_ratio_))
    print('LDA 降维到两维特征后的方差比例:{}'.format(lda.explained_variance_ratio_))
    print(pca.components_)
    print(pca.explained_variance_)
    # PCA 降维到两维特征后的方差比例:[0.92461872 0.05306648]
    # LDA 降维到两维特征后的方差比例:[0.9912126 0.0087874]

    colors = ['navy''turquoise''darkorange']
    target_names=['setosa''versicolor' ,'virginica']
    lw = 2

    plt.figure()
    for color, i, target_name in zip(colors, [12], target_names):
        plt.scatter(X_pca[y == i, ], X_pca[y == i, 1], color=color, alpha=.8, lw = lw,
                    label=target_name)
    plt.legend(loc='best', shadow=False, scatterpoints=1)
    plt.title('PCA of IRIS dataset')
    plt.show()
    plt.figure()
    for color, i, target_name in zip(colors, [12], target_names):
        plt.scatter(X_lda[y == i, ], X_lda[y == i, 1], alpha=.8, color=color,
                    label=target_name)
    plt.legend(loc='best', shadow=False, scatterpoints=1)
    plt.title('LDA of IRIS dataset')
    plt.show()
    # 将n_components设置为小数,即指定降维后的主成分方差和比例,得到的维数是不固定的
    pca = PCA(n_components=0.98)
    X_pca = pca.fit_transform(X)
    print('PCA 基于方差满足98%的降维特征及方差比例:{}'.format(pca.explained_variance_ratio_))
    print(pca.components_)
    print(pca.explained_variance_)
    # PCA 基于方差满足98%的降维特征及方差比例:[0.92461872 0.05306648 0.01710261]

if __name__=='__main__':
    X_train,X_test,y_train,y_test,X,y=load_data(iris)
    # -----------------------逻辑回归--------------------------------
    # test_LogisticRegression(X_train,X_test,y_train,y_test)
    # test_LogisticRegression_C(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cpenaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_Cmulti_classsolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_penaltyssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_multi_classssolvers(X_train, X_test, y_train, y_test)
    # test_LogisticRegression_best(X_train, X_test, y_train, y_test)
    # ---------------------K近邻算法-----------------------
    #test_KNeighborsClassifier(X_train, X_test, y_train, y_test, X, y)

    # ------------------朴素贝叶斯-----------------------
    # 高斯朴素贝叶斯
    # 多项分布朴素贝叶斯
    # 伯努利朴素贝叶斯
    # test_naive_bayes(X_train, X_test, y_train, y_test, X, y)
    # ---------------------决策树-----------------------
    # test_tree(X_train, X_test, y_train, y_test, X, y)
    # -------------------SVM支撑向量机-----------------------
    # test_svm(X_train, X_test, y_train, y_test, X, y)
    # -------------------降维-----------------------
    test_reduce(X_train, X_test, y_train, y_test, X, y)






相关文章