Python机器学习之PCA降维算法详解
⽬录
django怎么学⼀、算法概述
⼆、算法步骤
三、相关概念
四、算法优缺点
五、算法实现
六、算法优化
⼀、算法概述
主成分分析(Principal ComponentAnalysis,PCA)是⼀种掌握事物主要⽭盾的统计分析⽅法,它可以从多元事物中解析出主要影响因素,揭⽰事物的本质,简化复杂的问题。
PCA 是最常⽤的⼀种降维⽅法,它的⽬标是通过某种线性投影,将⾼维的数据映射到低维的空间中,并期望在所投影的维度上数据的⽅差最⼤,以此使⽤较少的维度,同时保留较多原数据的维度。
PCA 算法⽬标是求出样本数据协⽅差矩阵的特征值和特征向量,⽽协⽅差矩阵的特征向量的⽅向就是PCA需要投影的⽅向。使样本数据向低维投影后,能尽可能表征原始的数据。
PCA 可以把具有相关性的⾼维变量合成为线性⽆关的低维变量,称为主成分。主成分能够尽可能的保留原始数据的信息。
PCA 通常⽤于⾼维数据集的探索与可视化,还可以⽤作数据压缩和预处理等。
⼆、算法步骤
1.将原始数据按⾏组成m⾏n列的矩阵X
2.将X的每⼀列(代表⼀个属性字段)进⾏零均值化,即减去这⼀列的均值
3.求出协⽅差矩阵
4.求出协⽅差矩阵的特征值及对应的特征向量r
5.将特征向量按对应特征值⼤⼩从左到右按列排列成矩阵,取前k列组成矩阵P
6.计算降维到k维的数据
三、相关概念
⽅差:描述⼀个数据的离散程度
协⽅差:描述两个数据的相关性,接近1就是正相关,接近-1就是负相关,接近0就是不相关
协⽅差矩阵:协⽅差矩阵是⼀个对称的矩阵,⽽且对⾓线是各个维度的⽅差
特征值:⽤于选取降维的K个特征值
特征向量:⽤于选取降维的K个特征向量
四、算法优缺点
优点
仅仅需要以⽅差衡量信息量,不受数据集以外的因素影响。
各主成分之间正交,可消除原始数据成分间的相互影响的因素。
计算⽅法简单,主要运算是特征值分解,易于实现。
缺点
主成分各个特征维度的含义具有⼀定的模糊性,不如原始样本特征的解释性强。
⽅差⼩的⾮主成分也可能含有对样本差异的重要信息,降维丢弃的数据可能对后续数据处理有影响。
五、算法实现
⾃定义实现
import numpy as np
# 对初始数据进⾏零均值化处理
def zeroMean(dataMat):
# 求列均值
meanVal = np.mean(dataMat, axis=0)
# 求列差值
newData = dataMat - meanVal
return newData, meanVal
# 对初始数据进⾏降维处理
def pca(dataMat, percent=0.19):
newData, meanVal = zeroMean(dataMat)
# 求协⽅差矩阵
covMat = np.cov(newData, rowvar=0)
# 求特征值和特征向量
eigVals, eigVects = np.linalg.eig(np.mat(covMat)) # 抽取前n个特征向量
n = percentage2n(eigVals, percent)
print("数据降低到:" + str(n) + '维')
# 将特征值按从⼩到⼤排序
eigValIndice = np.argsort(eigVals)
# 取最⼤的n个特征值的下标
n_eigValIndice = eigValIndice[-1:-(n + 1):-1]
# 取最⼤的n个特征值的特征向量
n_eigVect = eigVects[:, n_eigValIndice]
# 取得降低到n维的数据
lowDataMat = newData * n_eigVect
reconMat = (lowDataMat * n_eigVect.T) + meanVal return reconMat, lowDataMat, n
# 通过⽅差百分⽐确定抽取的特征向量的个数
def percentage2n(eigVals, percentage):
# 按降序排序
sortArray = np.sort(eigVals)[-1::-1]
# 求和
arraySum = sum(sortArray)
tempSum = 0
num = 0
for i in sortArray:
tempSum += i
num += 1
if tempSum >= arraySum * percentage:
return num
if __name__ == '__main__':
# 初始化原始数据(⾏代表样本,列代表维度)
data = np.random.randint(1, 20, size=(6, 8))
print(data)
# 对数据降维处理
fin = pca(data, 0.9)
mat = fin[1]
print(mat)
利⽤Sklearn库实现
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.datasets import load_iris
# 加载数据
data = load_iris()
x = data.data
y = data.target
# 设置数据集要降低的维度
pca = PCA(n_components=2)
# 进⾏数据降维
reduced_x = pca.fit_transform(x)
red_x, red_y = [], []
green_x, green_y = [], []
blue_x, blue_y = [], []
# 对数据集进⾏分类
for i in range(len(reduced_x)):
if y[i] == 0:
red_x.append(reduced_x[i][0])
red_y.append(reduced_x[i][1])
elif y[i] == 1:
green_x.append(reduced_x[i][0])
green_y.append(reduced_x[i][1])
else:
blue_x.append(reduced_x[i][0])
blue_y.append(reduced_x[i][1])
plt.scatter(red_x, red_y, c='r', marker='x')
plt.scatter(green_x, green_y, c='g', marker='D')
plt.scatter(blue_x, blue_y, c='b', marker='.')
plt.show()
六、算法优化
PCA是⼀种线性特征提取算法,通过计算将⼀组特征按重要性从⼩到⼤重新排列得到⼀组互不相关的新特征,但该算法在构造⼦集的过程中采⽤等权重的⽅式,忽略了不同属性对分类的贡献是不同的。
KPCA算法
KPCA是⼀种改进的PCA⾮线性降维算法,它利⽤核函数的思想,把样本数据进⾏⾮线性变换,然后在变换空间进⾏PCA,这样就实现了⾮线性PCA。
局部PCA算法
局部PCA是⼀种改进的PCA局部降维算法,它在寻主成分时加⼊⼀项具有局部光滑性的正则项,从⽽使主成分保留更多的局部性信息。
到此这篇关于Python机器学习之PCA降维算法详解的⽂章就介绍到这了,更多相关Python PCA降维算法内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论