机器学习之降维算法
- 降维是机器学习中很重要的一种思想。在机器学习中经常会碰到一些高维的数据集,而在高维数据情形下会出现数据样本稀疏,距离计算等困难,这类问题是所有机器学习方法共同面临的严重问题,称之为“ 维度灾难 ”。另外在高维特征中容易出现特征之间的线性相关,这也就意味着有的特征是冗余存在的。基于这些问题,降维思想就出现了。
降维的意义:克服维数灾难,获取本质特征,节省存储空间,去除无用噪声,实现数据可视化
-
降维 是一种无监督学习的方法,降维并不需要使用数据的标签
-
降维 其中的一个目的是数据压缩,数据压缩不仅能够压缩数据,使用较少的计算机内存或磁盘空间,可以加快我们学习算法。
-
降维 另一个目的是能很好的处理特征冗余,对数据进行可视化。
数据压缩
-
数据压缩是指在不丢失有用信息的前提下,缩减数据量以减少存储空间,提高其传输、存储和处理效率,或按照一定的算法对数据进行重新组织,减少数据的冗余和存储的空间的一种技术方法。数据压缩包括有损压缩和无损压缩。
-
将数据从二维降至一维: 假使我们要采用两种不同的仪器来测量一些东西的尺寸,其
中一个仪器测量结果的单位是英寸,另一个仪器测量的结果是厘米,我们希望将测量的结果
作为我们机器学习的特征。现在的问题的是,两种仪器对同一个东西测量的结果不完全相等
(由于误差、精度等),而将两者都作为特征有些重复,因而,我们希望将这个二维的数据
降至一维。
-
将数据从三维降至二维: 这个例子中我们要将一个三维的特征向量降至一个二维的特
征向量。过程是与上面类似的,我们将三维向量投射到一个二维的平面上,强迫使得所有的
数据都在同一个平面上,降至二维的特征向量。 -
这样的处理过程可以被用于把任何维度的数据降到任何想要的维度,例如将1000 维的
特征降至100 维。
可视化数据
-
目前我们只能对2-3维的数据进行可视化,一旦数据的维度变得很大,我们将不能很直观的发现数据中的规律。此时, 降维 就成了一个很直观很重要的工作。
-
如下是国家发展水平的一张报表,通过50个指标对国家进行评估,我们想用可视化的方法进行直观的查看,但是50维的数据是不可能使用图形进行绘制的,为此我们使用降维的方法将其降低到2维进行查看。
-
通过降维的方法50个维度被整合成两个新的特征Z1和Z2 ,但是我们对于新特征的意义,我们并不清楚。即 降维 只能将数据的维度降低而对于新特征的意义需要重新发现与定义。
-
横轴约表示为国家整体经济强度/国家生产总值GDP
-
纵轴约表示幸福指数/人均生产总值
主成分分析(PCA)
-
PCA(Principal Component Analysis),即主成分分析方法,是一种使用最广泛的数据降维算法。PCA的主要思想是将n维特征映射到k维上,这k维是全新的正交特征也被称为主成分,是在原有n维特征的基础上重新构造出来的k维特征。PCA的工作就是从原始的空间中顺序地找一组相互正交的坐标轴,新的坐标轴的选择与数据本身是密切相关的。其中,第一个新坐标轴选择是原始数据中方差最大的方向,第二个新坐标轴选取是与第一个坐标轴正交的平面中使得方差最大的,第三个轴是与第1,2个轴正交的平面中方差最大的。依次类推,可以得到n个这样的坐标轴。通过这种方式获得的新的坐标轴,我们发现,大部分方差都包含在前面k个坐标轴中,后面的坐标轴所含的方差几乎为0。于是,我们可以忽略余下的坐标轴,只保留前面k个含有绝大部分方差的坐标轴。事实上,这相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,实现对数据特征的降维处理。
-
主成分分析(PCA)是最常见的降维算法。
-
在PCA中,要做的是找到一个方向向量(Vector direction),当把所有的数据都投射到该向量上时,希望投射距离均方差能尽可能地小。
-
主成分分析最小化的是投射距离误差
-
PCA将n个特征降维到k个,可用来进行数据压缩。
1.如果100维的向量最后可以用10维来表示,那么压缩率为90%。
2.同样图像处理领域的KL变换使用PCA 做图像压缩。
3.但PCA 要保证降维后,还要保证数据的特性损失最小。 -
PCA 技术的一大好处是对数据进行降维的处理。
1.对新求出的“主元”向量的重要性进行排序,根据需要取前面最重要的部分,将后面的维数省去,可以达到降维从而简化模型或是对数据进行压缩的效果。
2.同时最大程度的保持了原有数据的信息
PCA算法-python代码调库实现
import matplotlib.pyplot as plt # 画图
from sklearn.datasets import load_breast_cancer # 在sklearn苦中调取癌症数据集
from sklearn.decomposition import PCA # 调用PCA库
#设置中文字体
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
# 读取数据
data = load_breast_cancer()
X = data.data
y = data.target
print(data.target_names)
target_name = ['恶性' if i == 'malignant' else '良性' for i in data.target_names]
# 创建模型
pca = PCA(n_components=2) # 组成的 降成2个特征的(m,2)
X_new = pca.fit_transform(X) # 计算模型并将X降维
print(X_new.shape) # 打印降维后X的维度
print('特征向量',pca.components_) # 降维后特征向量
print('特征值矩阵',pca.explained_variance_) # 特征值的方差
print('特征值所占比例',pca.explained_variance_ratio_) #特征值方差所占比例
# 画图
plt.title('癌症数据集分布图')
plt.scatter(X_new[y==0,0],X_new[y==0,1],c='r',label=target_name[1])
plt.scatter(X_new[y==1,0],X_new[y==1,1],c='g',label=target_name[0])
plt.legend()
plt.show()
展示效果如下图