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]]
好像列的正负号有点问题,但也没找到什么原因…
955

被折叠的 条评论
为什么被折叠?



