Python机器学习中PCA降维算法怎么实现和优化
Admin 2022-06-07 群英技术资讯 651 次浏览
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局部降维算法,它在寻找主成分时加入一项具有局部光滑性的正则项,从而使主成分保留更多的局部性信息。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章给大家分享的是pytorch下loss反向传播出错如何解决的内容。小编觉得挺实用的,因此分享给大家做个参考,器报错情况如何选,下面跟随小编一起看看怎么解决吧。
本文主要介绍了Python为什么要保留显式的self,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧<BR>
这篇文章主要为大家详细介绍了如何利用Python语言实现双向RNN与堆叠的双向RNN,文中详细讲解了双向RNN与堆叠的双向RNN的原理及实现,需要的可以参考一下
在Python中,如果我们想要在遍历一组数据的过程中,对这组数据进行修改,通常会出现许多问题,例如对列表进行上述操作时, 会忽略部分数据;遍历字典时,不能修改数据。本文针对这些问题,提出了多种解决方案。
os.walk方法是python中帮助我们高效管理文件、目录的工具,在深度学习中数据整理应用的很频繁,如数据集的名称格式化、将数据集的按一定比例划分训练集train_set、测试集test_set。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008