基于特征值分解协方差矩阵实现PCA算法
目录
1、主成分分析:
1、用途:降维(提取最有价值的信息)
2、目标:无监督,分类问题
2、基础知识:
1、内积:
A=(a1,a2,a3…,an)
B=(b1,b2,b2,…,bn)
A·B=a1b1+a2b2+a3b3+…+anbn
=|A||B| cos(α)
设向量B的模为1,则AB内积===A向B所在的直线投影的矢量长度
2、基:
条件:
1、单位为1
2、内积为0=正交=垂直==A,B线性无关
3、基变换(重点):
数据与第一个基做内积运算,结果作为第一个新的坐标分量
与第二个基做运算,结果作为第二个新坐标的分类
实例:
(3,2)=3*(1,0)+2*(0,1)
新向量基,,,,原坐标,新坐标
意义:
内积将原坐标的变换到新坐标基中,得到新坐标
4、方差:
各个样本数据和平均数之差的 平方和 的平均数
5、协方差:
各个样本数据和平均数之差的 平方和 的平均数
有方向:正值:A和B变化趋势相同,反之
3、原理:
1、条件:
条件1:这是一个分类问题==>将数据分割开==>投影值要尽可能分散==>方差要大
条件2:选取了方差大的一维,第二维的选择会在第一维选择附近(只有这个方向,方差最大==>坐标应是线性无关(正交的)==>协方差=0
2、计算:
将一组N维向量降维到K维(N>K>0),目标选择K个单位正交基,是的将原始数据通过内积转换到这组正交基上,条件2个
协方差矩阵:
内积:
对角线是方差,越大越好
其他是协方差,==0
==>标准的就是对角矩阵
(实对称矩阵n*n一定能找到n个单位正交特征向量)
3、排序:
特征值:各个方向的重要程度
特征向量:各个方向
==>根据特征值的从大到小,将特征向量从上到下排列,则用前K行组成的矩阵乘以原始数据矩阵X,就得到了我们需要的降维后的数据矩阵Y
==>实现了降维
##dao
因为λ1=2>>λ2,所有选择特征向量1,实现了二维降到一维
5、代码分析:
运用鸢尾花数据进行,
150条总数据,每种50条
3个特征值:‘Iris-Setosa’,‘Iris-Versicolor’,’Iris-Virgnica’
4个特征向量:‘sepal_len’, ‘sepal_wid’, ‘petal_len’, ‘petal_wid’
1、读取数据,进行处理
1、导入数据
import numpy as np
import pandas as pd
df = pd.read_csv('iris.data')
df.columns=['sepal_len', 'sepal_wid', 'petal_len', 'petal_wid', 'class']#加入列名
df.head()
2、数据赋值
X = df.iloc[:,0:4].values#四列特征值
y = df.iloc[:,4].values#最后的分类
3、数据标准化
from sklearn.preprocessing import StandardScaler
X_std = StandardScaler().fit_transform(X)#标准化
2、计算
cov_mat = np.cov(X_std.T)#计算协方差
eig_vals, eig_vecs = np.linalg.eig(cov_mat)#特征值,特征向量
#将特征值和特征向量一一组合在一起
eig_pairs = [(np.abs(eig_vals[i]), eig_vecs[:,i]) for i in range(len(eig_vals))]
#按照特征值进行排序,得到方差大的方向
eig_pairs.sort(key=lambda x: x[0], reverse=True)
可以进行处理,直观的看到对方向影响的大小
tot = sum(eig_vals)#特征值的总和
#映射称为了百分数形式,便于观察他们的重要程度
var_exp = [(i / tot)*100 for i in sorted(eig_vals, reverse=True)]
#累加起来,观察
cum_var_exp = np.cumsum(var_exp)
通过数据,可以看出对方向的影响几乎可以达到100==>只选择前两个特征向量组成新的基向量
matrix_w = np.hstack((eig_pairs[0][1].reshape(4,1),eig_pairs[1][1].reshape(4,1)))
Y = X_std.dot(matrix_w)
3、数据处理与展示
对比观察:
同样是两维对三组特征值分类:
主要是用于降维,分类看不出什么呀