继续学习无监督学习中的降维算法,最经典的降维算法为主成分分析
PCA的几何解释平移(去中心化)、旋转坐标轴,找到主成分pc1和pc2。
PCA的思想很简单——减少数据集的特征数量,同时尽可能地保留信息。
如何得到这些包含最大差异性的主成分方向呢?
通过计算数据矩阵的协方差矩阵
然后得到协方差矩阵的特征值特征向量
选择特征值最大(即方差最大)的k个特征所对应的特征向量组成的矩阵。
这样就可以将数据矩阵转换到新的空间当中,实现数据特征的降维。
PCA的算法两种实现方法
第一步是均值归一化。
第二步是计算协方差矩阵。
第三步是计算协方差矩阵的特征向量(eigenvectors),可以利用奇异值分解(SVD)来求解。
(1)均值归一化。我们需要计算出所有特征的均值,然后令 = − 。( 为均值)。如果特征是在不同的数量级上,我们还需要将其除以标准差 2 。
(2)计算协方差矩阵。
(3)用特征值分解方法计算协方差矩阵的特征值和特征向量。
(4)对特征值从大到小排序,选择其中最大的个。然后将其对应的个特征向量分别作为行向量组成特征向量矩阵。
(5)将数据转换到个特征向量构建的新空间中,即 = 。
求协方差的特征值和特征向量,然后做数据转换。
import numpy as np
def pca(data):
row = np.size(data, 0) # 行
col = np.size(data, 1) # 列
avg = np.zeros([1, col])
for i in range(col):
avg[0, i] = np.mean(data[:, i])
for i in range(col):
data[:, i] = data[:, i] - avg[0, i]
mat = np.cov(data, rowvar=False)
print("mat:", mat)
eigenvalue, featurevector = np.linalg.eig(mat)
print("协方差矩阵:", mat)
print("特征值:", eigenvalue)
print("特征向量:", featurevector)
featurevector = np.transpose(featurevector)
finaldata = np.dot(data, featurevector[np.argmax(eigenvalue)])
print("最终结果", finaldata)
data = np.array([[2.5, 2.4],
[0.5, 0.7],
[2.2, 2.9],
[1.9, 2.2],
[3.1, 3],
[2.3, 2.7],
[2, 1.6],
[1, 1.1],
[1.5, 1.6],
[1.1, 0.9]])
pca(data)
二维数据空间转到一维数据空间的结果如下:
最终结果 [-0.82797019 1.77758033 -0.99219749 -0.27421042 -1.67580142 -0.9129491
0.09910944 1.14457216 0.43804614 1.22382056]
批阅人 | |
---|---|
分数 | |
时间 | 2021年12月31日 |