python降维中特征维度的问题

python降维中特征维度的问题

最近在学PCA降维,参考的是李航老师的统计学习方法第二版,自己上手编程时发现按照李航老师P310页公式16.39来定义样本数据时出现了一些问题,特此记录以供日后翻阅

sklearn中的PCA降维

在这里先采用sklearn库中的PCA方法来进行降维

	from sklearn.decomposition import PCA
	DataX = np.random.rand(6,6) + np.arange(36).reshape(6,6)		#生成样本数据,6行6列
	ndim=2
	print('Original data is \n', DataX, '\n')
	
	p = PCA(n_components=ndim)
	Datakf = p.fit_transform(DataX)
	print('Descending dimension by PCA \n', Datakf, '\n')

运行结果如下:

Original data is 
 [[ 0.37718324  1.63729219  2.68946561  3.99252786  4.15827068  5.76521522]
 [ 6.95362291  7.05839043  8.29319217  9.50795695 10.81831718 11.55187804]
 [12.00207173 13.40913727 14.95209188 15.10894773 16.5270482  17.88555162]
 [18.81123925 19.87494784 20.87412509 21.53027966 22.92860574 23.86598639]
 [24.16045484 25.64191525 26.34466161 27.80771017 28.43926953 29.8143896 ]
 [30.443983   31.81299702 32.6677818  33.07595964 34.51065658 35.60889781]] 

Descending dimension by PCA 
 [[ 36.6884405   -0.44336559]
 [ 22.17085589   0.75810265]
 [  7.59018971  -0.32189274]
 [ -7.9220088    0.200741  ]
 [-21.93101301  -0.24495883]
 [-36.59646429   0.05137351]]  

可以看到样本的维度从(6,6)降到了(6,2),说明在python中将列存储为特征的维度(从原来的6列降到了2列,即特征维度减少了四维)

通过阶段奇异值的方法来自己实现

刚开始采用书上的公式来存储,发现计算有问题,于是采用列来存储一个数据的不同特征,行来代表不同的数据
代码如下:
注:这里的公式跟李航老师书上略有不同,但是基本思想相同,只是在更换输入数据存储方式后的一点小小改动

def PAC_Svd(Datax,k):
    """
    python中特征维度按列存储,第j列为第i个数据的第j个维度
    例如A.shape=(m,n)为m个样本,n维特征
    采用svd奇异值分解的PCA算法
    :param Datax: 输入数据
    :param k: 降维的维数
    :return: 降维后的数据
    """
    DataX = Datax - Datax.mean(axis=0)       # 去中心化
    u, s, vh = np.linalg.svd(DataX, full_matrices=False)
    V=vh.T		#svd与matlab中的svd分解不同,这里vh直接就是V的转置,所以需要转置回来
    datak = DataX @ V[:,:k]		#相当于对数据进行了坐标变换,将原来的DataX.shape[1]维数据经过正交基变换为k维
    # V[:,:k].shape:(DataX.shape[1],k)
    return datak
#还是采用上面的数据
ret=PAC_Svd(DataX,ndim)
print(ret)

运行结果如下所示:

[[-36.6884405    0.44336559]
 [-22.17085589  -0.75810265]
 [ -7.59018971   0.32189274]
 [  7.9220088   -0.200741  ]
 [ 21.93101301   0.24495883]
 [ 36.59646429  -0.05137351]]

好像列的正负号有点问题,但也没找到什么原因…

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