机器学习100天---day05 主成分分析Python Numpy实现

PCA是一种旋转数据集的方法,旋转后的特征在统计上不相关。PCA的另一个应用是特征提取。找到一种数据表示,比给定的原始表示更适合分析。同时,PCA是一种无监督方法,在寻找旋转方向时没有用到任何类别信息。
PCA的变换:先旋转数据,然后删除方差较小的成分。

#_*_coding:utf-8_*_
'''
将数据转换为只保留前N个主成分特征空间
1、去除平均值
2、计算协方差矩阵
3、计算协方差矩阵的特征值和特征向量
4、将特征值排序保留前N个最大特征值对应的特征向量
5、将数据转换到上面得到的N个特征向量构建的特征空间(实现了特征压缩)
'''
import numpy as np
import pandas as pd
from sklearn.datasets import load_digits


datasets = load_digits().data

def percent2n(eigVals,percent):
    sortArray=np.sort(eigVals)   #升序
    sortArray=sortArray[-1::-1]  #逆转,即降序
    arraySum=sum(sortArray)
    tmp=0
    num=0
    for i in sortArray:
        tmp+=i
        num+=1
        if tmp>=arraySum*percent:
            return num

def pca(datasets,percent=0.99):
    #求每一列的均值   若rowvar非0,一列代表一个样本,为0,一行代表一个样本
    meanVals = np.mean(datasets,axis=0)
    #数据矩阵的每一列减去该列的均值
    meanRemoved = datasets - meanVals
    #计算协方差矩阵,除以n-1是为了得到协方差的无偏估计
    covMat = np.cov(meanRemoved,rowvar=0)
    #计算协方差矩阵的特征值和特征向量       一列一个特征向量
    eigVals,eigVects= np.linalg.eig(np.mat(covMat))#np.mat() 构建矩阵

    n = percent2n(eigVals, percent)
    print(n)
    #argsort():对特征值矩阵进行由大到小的排序,返回对应排序后的索引
    eigValId= np.argsort(eigVals)
    #从排序后的矩阵最后一个开始自下而上选取最大的N个特征值,返回其对应的索引值
    eigValId = eigValId[:-(n+1):-1]  #这里三个数值分别表示:起始位置:重点位置:步长 最后-1表示倒序
    #将特征值最大的N个特征值对应索引的特征向量提取出来,组成压缩矩阵     eigValId 抽取数组中对应值的特定列
    redeigVects= eigVects[:,eigValId]
    #将去均值后的数据矩阵*压缩矩阵,转换到新的矩阵空间,使维度降维N
    lowDatasets = meanRemoved * redeigVects
    #利用降维后的矩阵反构出原数矩阵
    reconMat = (lowDatasets * redeigVects.T) + meanVals
    return lowDatasets,reconMat

low,rec = pca(datasets)
print(low.shape)


我的GitHub地址,欢迎大家指教

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