一、算法原理
算法流程:
input:
样本集:
低维空间维数d
process:
1.对所有样本进行中心化
2.计算样本的协方差矩阵
3.对协方差矩阵做特征值分解
4.取最大的d个特征值所对应的特征向量
output:
投影矩阵:
注:以上算法流程改编自周志华《机器学习》
算法补充:
1.协方差矩阵公式:
据查阅貌似有两个版本:
问题:为何协方差矩阵可以由矩阵乘以矩阵的转置得来?两个版本公式在何种情况下相等?
2.矩阵的特征值
因为v是特征向量,是n维的非零向量。
所以只能是前面的A-λE为0矩阵。
然后得到:
这也是矩阵A的特征向量的求法。
3.关于矩阵的补充:
1.n阶矩阵A有n个特征值
2.奇异矩阵:对应行列式为0的方阵。
二、PCA降维实现鸢尾花数据二维可视化代码笔记
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
data=load_iris()
y=data.target
X=data.data
pca=PCA(n_components=2)
reduced_X=pca.fit_transform(X)#在数据x上运用适合X降维的方法将x数据改变适应该算法。之前的数据都没有降维处理但是这里因为降维处理数据了所以需要额外引用transform函数。
print(reduced_X)#得到数据中心化后协方差矩阵特征值的前两个特征值。
#创建空数组
red_x, red_y = [], []
blue_x, blue_y = [], []
green_x, green_y = [], []
for i in range(len(reduced_X)):#reduced_X是一个150行两列的矩阵,计算长度的时候只计算纵向的长度
if y[i] == 0:
red_x.append(reduced_X[i][0])
red_y.append(reduced_X[i][1])#red_x和red_y分别装载数据的两个值根据y[i]判定数据是什么种类的鸢尾花。
elif y[i] == 1:
blue_x.append(reduced_X[i][0])
blue_y.append(reduced_X[i][1])
else:
green_x.append(reduced_X[i][0])
green_y.append(reduced_X[i][1])
#绘制散点图
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(blue_x, blue_y, c='b', marker='D')
plt.scatter(green_x, green_y, c='g', marker='.')
plt.show()