Python机器学习中PCA降维算法怎么实现和优化
Admin 2022-06-07 群英技术资讯 1148 次浏览
这篇文章主要介绍了Python机器学习中PCA降维算法怎么实现和优化相关知识,内容详细易懂,操作简单快捷,具有一定借鉴价值,相信大家阅读完这篇Python机器学习中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局部降维算法,它在寻找主成分时加入一项具有局部光滑性的正则项,从而使主成分保留更多的局部性信息。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
这篇文章主要为大家介绍了pyspark自定义UDAF函数调用报错问题解决,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
这篇文章主要介绍了Python实现文本文件拆分写入到多个文本文件的方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
这篇文章主要介绍了python3 queue多线程通信,Queue 对象已经包含了必要的锁,所以你可以通过它在多个线程间多安全地共享数据,更多相关内容需要的朋友可以参考一下下文文章内容
最近工作中读取文件时经常遇上比较复杂的情况,所以下面这篇文章主要给大家介绍了关于如何利用Python按顺序读取文件夹中文件的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
Python调用Shell,有两种方法:os.system(cmd)或os.popen(cmd)脚本执行过程中的输出内容,下面这篇文章主要给大家介绍了关于Python面试之os.system()和os.popen()区别的相关资料,需要的朋友可以参考下
成为群英会员,开启智能安全云计算之旅
立即注册关注或联系群英网络
7x24小时售前:400-678-4567
7x24小时售后:0668-2555666
24小时QQ客服
群英微信公众号
CNNIC域名投诉举报处理平台
服务电话:010-58813000
服务邮箱:service@cnnic.cn
投诉与建议:0668-2555555
Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 ICP核准(ICP备案)粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008