小编给大家分享一下Python机器学习之PCA降维算法的示例分析,相信大部分人都还不怎么了解,因此分享这篇文章给大家参考一下,希望大家阅读完这篇文章后大有收获,下面让我们一起去了解一下吧!
一、算法概述
主成分分析 (Principal ComponentAnalysis,PCA)是一种掌握事物主要矛盾的统计分析方法,它可以从多元事物中解析出主要影响因素,揭示事物的本质,简化复杂的问题。
PCA 是最常用的一种降维方法,它的目标是通过某种线性投影,将高维的数据映射到低维的空间中,并期望在所投影的维度上数据的方差最大,以此使用较少的维度,同时保留较多原数据的维度。
PCA 算法目标是求出样本数据协方差矩阵的特征值和特征向量,而协方差矩阵的特征向量的方向就是PCA需要投影的方向。使样本数据向低维投影后,能尽可能表征原始的数据。
PCA 可以把具有相关性的高维变量合成为线性无关的低维变量,称为主成分。主成分能够尽可能的保留原始数据的信息。
PCA 通常用于高维数据集的探索与可视化,还可以用作数据压缩和预处理等。
二、算法步骤
将原始数据按行组成m行n列的矩阵X
将X的每一列(代表一个属性字段)进行零均值化,即减去这一列的均值
求出协方差矩阵
求出协方差矩阵的特征值及对应的特征向量r
将特征向量按对应特征值大小从左到右按列排列成矩阵,取前k列组成矩阵P
计算降维到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 numif __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 pltfrom sklearn.decomposition import PCAfrom sklearn.datasets import load_iris# 加载数据data = load_iris()x = data.datay = 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的数据类型有哪些?
python的数据类型:1. 数字类型,包括int(整型)、long(长整型)和float(浮点型)。2.字符串,分别是str类型和unicode类型。3.布尔型,Python布尔类型也是用于逻辑运算,有两个值:True(真)和False(假)。4.列表,列表是Python中使用最频繁的数据类型,集合中可以放任何数据类型。5. 元组,元组用”()”标识,内部元素用逗号隔开。6. 字典,字典是一种键值对的集合。7. 集合,集合是一个无序的、不重复的数据组合。
以上是“Python机器学习之PCA降维算法的示例分析”这篇文章的所有内容,感谢各位的阅读!相信大家都有了一定的了解,希望分享的内容对大家有所帮助,如果还想学习更多知识,欢迎关注编程网行业资讯频道!