机器学习之降维与度量学习

线性降维方法是假设从高维空间到低维空间的函数映射是线性的。

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()

运行效果图,如下:
3d
PCA

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值