Principal Component Analysis(PCA)主成分分析

一、PCA是什么?

        PCA主要是通过矩阵的运算将具有一定相关性的样本数据,投影到一组特征向量不相关的低维空间,期间会舍弃非主成分方向,仅仅保留所需要的单位正交化后的特征向量。而且,这种舍弃会使样本的密度增大,这是PCA的主要作用;同时,往往最小的特征值所对应的特征向量与噪声有关,这种舍弃会起到降噪的效果。

        PCA的原理图:本质是为了样本点到其低维投影点的距离平方和最小,等价于求方差最大的几个方向,即为协方差矩阵特征值最大所对应的特征向量。

Principal Component Analysis(PCA)主成分分析_第1张图片

         推导如下:

Principal Component Analysis(PCA)主成分分析_第2张图片Principal Component Analysis(PCA)主成分分析_第3张图片

二、使用步骤

1.数据

数据如下(dataset.txt):dataset.txt-机器学习文档类资源-CSDN下载

2.代码示例

代码如下(示例):

import numpy as np
import matplotlib.pyplot as plt


def loadDataSet(fileName):
    dataSetList = []
    file = open(fileName)
    for row in file.readlines():
        data_str = row.strip().split('\t')  # 结果:例如['10.235186', '11.321997']
        data_float = list(map(float, data_str))  # 结果:例如[10.235186, 11.321997]
        dataSetList.append(data_float)
    dataSetList = np.array(dataSetList)   # 数组1000*2
    return dataSetList


def pca(dataMat, topNfeat=1):
    print('....Data Preprocessing....')
    meanValues = np.mean(dataMat, axis=0)  # 求列的平均值
    meanRemoved_dataMat = dataMat - meanValues  # 中心化
    print('....Compute the Covariance Matrix....')
    # rowvar: 默认为True, 此时每一行代表一个变量(属性),每一列代表一个观测;为False时,则反之
    covMat = np.cov(meanRemoved_dataMat, rowvar=False)  # 每一列作为一个独立变量求协方差 2×2维
    print('....Compute Eigen Vectors and Eigen Values of the Covariance Matrix....')
    # 生成数组所需格式不同:mat可以从字符串或列表中生成;array只能从列表中生成
    eigValues, eigVectors = np.linalg.eig(np.mat(covMat))  # 求特征值和特征向量  eigVects是n×n维
    print('....Rearrange the Eigen Vectors and Eigen Values....')
    # np.argsort(x)函数是将x中的元素从小到大排列,最终输出其对应的index(索引)
    eigValue_Index = np.argsort(-eigValues)  # 特征值由大到小排序
    eigValue_Index = eigValue_Index[:topNfeat]  # 选取前topNfeat个特征值的序号
    print("....Select a subset of the eigenVectors as basis vectors....")
    retEigVectors = eigVectors[:, eigValue_Index]  # 把符合条件的一个特征向量筛选出来
    print('....计算meanRemoved_dataMat投影后的,与meanValues的距离....')
    lowDDataMat = meanRemoved_dataMat * retEigVectors  # 矩阵点乘筛选的特征向量矩阵,即公式Y=X*P
    print('....转换新空间的数据....')
    reconMat = (lowDDataMat * retEigVectors.T) + meanValues
    return lowDDataMat, reconMat


def drawPoints(dataset1, dataset2, dataset3):
    plt.figure(figsize=(20, 20))
    plt.subplot(1, 3, 1)
    plt.scatter(dataset1[:, 0], dataset1[:, 1], marker='s', s=40, color='red')
    plt.title('original dataset')

    plt.subplot(1, 3, 2)
    dataset2 = np.array(dataset2)
    y = np.ones_like(dataset2)
    plt.scatter(dataset2[:, 0], y[:, 0], marker='.', s=40, color='black')
    plt.title('low dimensional dataset')

    plt.subplot(1, 3, 3)
    dataset3 = np.array(dataset3)
    plt.scatter(dataset3[:, 0], dataset3[:, 1], marker='*', s=40, color='blue')
    plt.title('low dimension dataset')
    plt.show()


if __name__ == '__main__':
    data = loadDataSet('dataset.txt')
    lowDDataMat, reconMat = pca(data, 1)
    drawPoints(data, lowDDataMat, reconMat)

三、可视化结果 

Principal Component Analysis(PCA)主成分分析_第4张图片

 


你可能感兴趣的:(机器学习,python)