PCA实现

原理:待补充
流程:待补充

代码转自:

def percentage2n(eigVals,percentage):  
    sortArray=np.sort(eigVals)   #升序  
    sortArray=sortArray[-1::-1]  #逆转,即降序  
    arraySum=sum(sortArray)  
    tmpSum=0  
    num=0  
    for i in sortArray:  
        tmpSum+=i  
        num+=1  
        if tmpSum>=arraySum*percentage:  
            return num 
import numpy as np
def zeroMean(dataMat):        
    meanVal=np.mean(dataMat,axis=0)     #按列求均值,即求各个特征的均值  
    newData=dataMat-meanVal  
    return newData,meanVal  

def pca(dataMat,n):  
    newData,meanVal=zeroMean(dataMat)  
    covMat=np.cov(newData,rowvar=0)    #求协方差矩阵,return ndarray;若rowvar非0,一列代表一个样本,为0,一行代表一个样本  
    eigVals,eigVects=np.linalg.eig(np.mat(covMat))#求特征值和特征向量,特征向量是按列放的,即一列代表一个特征向量
    print('covMat.shape',covMat.shape)
    eigValIndice=np.argsort(eigVals)            #对特征值从小到大排序  
    n_eigValIndice=eigValIndice[-1:-(n+1):-1]   #最大的n个特征值的下标  
    n_eigVect=eigVects[:,n_eigValIndice]        #最大的n个特征值对应的特征向量  
    lowDDataMat=newData*n_eigVect               #低维特征空间的数据  
    reconMat=(lowDDataMat*n_eigVect.T)+meanVal  #重构数据  
    return lowDDataMat,reconMat
dataMat = [[1,2,3,4],[2,3,4,10],[1,5,6,28],[1,2,4,1],[1,2,3,4],[1,2,3,4],[1,2,3,4],[1,2,3,4]]
pca(dataMat,2)
covMat.shape (4, 4)





(matrix([[ -3.45898736,  -0.28022317],
         [  2.69546487,   0.27883528],
         [ 20.91013322,   0.05452816],
         [ -6.31066127,   1.06775239],
         [ -3.45898736,  -0.28022317],
         [ -3.45898736,  -0.28022317],
         [ -3.45898736,  -0.28022317],
         [ -3.45898736,  -0.28022317]]),
 matrix([[  1.0594375 ,   2.00726655,   2.98693413,   4.0002547 ],
         [  1.18654049,   2.90055019,   4.17881897,   9.99651423],
         [  1.23800323,   5.02909718,   5.94768087,  28.00101987],
         [  1.27826878,   2.03401986,   3.93882949,   1.00119242],
         [  1.0594375 ,   2.00726655,   2.98693413,   4.0002547 ],
         [  1.0594375 ,   2.00726655,   2.98693413,   4.0002547 ],
         [  1.0594375 ,   2.00726655,   2.98693413,   4.0002547 ],
         [  1.0594375 ,   2.00726655,   2.98693413,   4.0002547 ]]))
0.85**2+0.53**2
1.0034
a = zip([('a','b'),('c','d')])
a = [1,2]
b = [3,4]
c = list(zip(a,b))
a = np.array([[11,22,33],[1,2,3],[1,2,3]])
mean = np.mean(a,0)
print('0行1列的cov:\n',np.dot(a[:,0]-mean[0],a[:,1]-mean[1])/(3-1))
covMat = np.cov(a,rowvar = 0)
print(np.cov(a,rowvar = 0))
0行1列的cov:
 66.6666666667
[[  33.33333333   66.66666667  100.        ]
 [  66.66666667  133.33333333  200.        ]
 [ 100.          200.          300.        ]]
eigVals,eigVects = np.linalg.eig(covMat)
print('eigVals',eigVals,'\neigVects,',eigVects)
eigVals [  0.00000000e+00   4.66666667e+02  -3.02071477e-14] 
eigVects, [[-0.96362411  0.26726124 -0.35856858]
 [ 0.14824986  0.53452248 -0.71713717]
 [ 0.22237479  0.80178373  0.5976143 ]]
eigK = eigVals.argsort()[-1:-3:-1]
eigVect = eigVects[:,eigK]
print(eigVect)
[[ 0.26726124 -0.96362411]
 [ 0.53452248  0.14824986]
 [ 0.80178373  0.22237479]]
lowData = np.dot((a-mean),eigVect)
print(lowData)
[[  2.49443826e+01   1.99840144e-15]
 [ -1.24721913e+01  -9.99200722e-16]
 [ -1.24721913e+01  -9.99200722e-16]]
pca(a,2)
covMat.shape (3, 3)





(matrix([[  2.49443826e+01,   1.99840144e-15],
         [ -1.24721913e+01,  -9.99200722e-16],
         [ -1.24721913e+01,  -9.99200722e-16]]), matrix([[ 11.,  22.,  33.],
         [  1.,   2.,   3.],
         [  1.,   2.,   3.]]))
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
PCA(Principal Component Analysis) 是一种常用的数据降维技术,可以在保留原数据的主要特征的前提下,将高维数据降低到低维度,用于数据可视化、数据压缩、数据分类等领域。下面将介绍PCA实现步骤。 1. 数据预处理 数据预处理是PCA的第一步。在进行PCA之前,需要对数据进行预处理。首先,需要对数据进行标准化处理,使数据的均值为0,方差为1。标准化处理的目的是将不同量纲的数据化为同一量纲,便于比较和处理。其次,需要对数据进行缺失值处理,可以通过插值、平均值或中位数填充等方法进行处理。 2. 计算协方差矩阵 协方差矩阵反映了不同特征之间的相关性。PCA的核心是通过计算协方差矩阵,找到数据中的主成分。协方差矩阵可以通过以下公式进行计算: $$ C = \frac{1}{n-1}(X-\bar{X})^T(X-\bar{X}) $$ 其中,$X$为标准化后的数据矩阵,$\bar{X}$为每个特征的均值向量,$n$为样本数量。 3. 计算特征值和特征向量 协方差矩阵的特征值和特征向量是PCA的重要输出结果,它们可以用于确定主成分。特征值表示数据在特征向量方向上的方差,特征向量表示数据在该方向上的分布。可以通过以下公式计算协方差矩阵的特征值和特征向量: $$ Cv = \lambda v $$ 其中,$C$为协方差矩阵,$v$为特征向量,$\lambda$为特征值。通过求解该方程,可以得到协方差矩阵的所有特征值和特征向量。 4. 选择主成分 通过计算特征值和特征向量,可以得到协方差矩阵的所有特征值和特征向量。在选择主成分时,可以根据特征值的大小来确定。特征值越大,表示数据在该方向上的方差越大,主成分的重要性越高。可以通过设定阈值,选择前k个特征值对应的特征向量作为主成分。 5. 数据换 为了降低数据的维度,需要将数据投影到主成分上。可以通过以下公式进行数据换: $$ Y = XW $$ 其中,$Y$为换后的数据矩阵,$X$为标准化后的数据矩阵,$W$为选择的主成分矩阵。换后的数据矩阵$Y$的每一行表示一个样本在主成分上的投影值,每一列表示一个主成分。 6. 可视化分析 通过PCA降维后的数据,可以进行可视化分析。可以将数据投影到2维或3维空间中,用于数据可视化。可以通过散点图、热力图等方式展示数据的分布情况,帮助分析数据的特征和规律。 以上就是PCA实现步骤的详细介绍。需要注意的是,PCA算法的结果取决于数据的标准化和主成分的选择。在实际应用中,需要根据具体情况进行调整和优化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值