线性降维方法是假设从高维空间到低维空间的函数映射是线性的。
1、术语
1.1、k近邻学习(kNN)
k 近邻(k-Nearest Neighbor)学习是一种常用的监督学习方法,使用某种距离算法找到K个最近的样本,基于K个邻居进行预测(近朱者赤近墨者黑)。
策略:在分类任务中常使用"投票法";在回归任务中时使用"平均法";也可加权平均或加权投票。
KNN虽然没有显示的训练过程,但要求样本的采样密度足够大,特征较多的能达到天文级。
1.2、低维嵌入
降维(dimension reduction),亦称"维数约简",即通过某种数学变换将原始高维属性空间转变为一个低维"子空间" (subspace)。
“多维缩放” (Multiple Dimensional Scaling,简称MDS):要求原始空间中样本之间的距离在低维空间中得以保持,可通过降维前后保持不变的距离矩阵D(原始空间的距离矩阵)求取内积矩阵B(降维后样本的内积矩阵)。
1.3、主成分分析(PCA)
超平面(直线的高维推广)性质:
- 最近重构性:样本点到这个超平面的距离都足够近;
- 最大可分性:样本点在这个超平面上的投影能尽可能分开。
主成分分析(Principal Component Analysis)是最常用的一种降维方法,用于提取数据的主要特征分量,同时也可起到降噪的效果。主成分分析是一种无监督的线性降维方法,有监督线性降维方法最著名的是线性判别分析(LDA)。
- 根据最近重构性,数据样本进行中心化处理后,原样本点与基于投影重构的新样本点之间的距离应该最小化,转换为优化特征向量的协方差矩阵。
- 根据最大可分性,若所有样本点的投影能尽可能分开,则应该使投影后样本点的方差最大化。
1.4、核化线性降维
非线性降维常用方法是"核化" (kernelized),即:基于核技巧对线性降维方法进行核化处理。
1.5、流形学习(manifold learning)
流形学习是一类借鉴了拓扑流形概念的降维方法。
流形学习方法:
- 等度量映射(Isometric Mapping,简称Isomap)
- 局部线性嵌入(Locally Linear Embedding,简称LLE)
1.6、度量学习(metric learning)
亦称"距离度量学习",尝试"学习"出一个合适的距离度量方法。
不同的度量学习方法针对不同目标获得"好"的半正定对称距离度量矩阵M,若M 是一个低秩矩阵,则通过对M 进行特征值分解,总能找到一组正交基,可衍生出一个降维矩阵P能用于降维目的。
2、Sklearn代码实现
示例:鸢尾花数据集PCA降维
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
from sklearn import datasets
from sklearn.decomposition import PCA
if __name__ == '__main__':
# 加载数据
iris = datasets.load_iris()
# 使用样本的所有特征
x = iris.data
y = iris.target
label_dict = iris.target_names
feature_dict = iris.feature_names
# 创建模型, n_components:指定主成分的个数,即降维后数据的维度
model = PCA(n_components=2)
# 训练且降维
x_reduce = model.fit_transform(x, y)
# 样本前3个特征绘图,立体展示数据
fig = plt.figure()
ax3d = Axes3D(fig, rect=[0, 0, 1, 1], elev=20, azim=20)
ax3d.scatter(x[:, 0], x[:, 1], x[:, 2], c=y, cmap='brg')
ax3d.set_xlabel(feature_dict[0])
ax3d.set_ylabel(feature_dict[1])
ax3d.set_zlabel(feature_dict[2])
plt.show()
# 降维数据的散点图
for label, marker, color in zip(range(0, 3), ('*', 's', 'o'), ('blue', 'red', 'green')):
plt.scatter(x=x_reduce[y == label][:, 0],
y=x_reduce[y == label][:, 1],
marker=marker,
color=color,
alpha=0.5,
label='label_{}'.format(label))
plt.title('Iris Reduced PCA')
plt.xlabel('xr', fontsize=14)
plt.ylabel('yr', fontsize=14)
plt.legend(loc='upper right', fancybox=True)
plt.tick_params(labelsize=10)
plt.show()
运行效果图,如下: