机器学习降维方法实现

本文转载于https://blog.csdn.net/sm9sun/article/details/78842313
    机器学习领域中的降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中。降维的本质是学习一个映射函数 f : x->y,其中x是原始数据点的表达,目前最多使用向量表达形式。 y是数据点映射后的低维向量表达,通常y的维度小于x的维度(当然提高维度也是可以的)。
    f可能是显式的或隐式的、线性的或非线性的。

    目前大部分降维算法处理向量表达的数据,也有一些降维算法处理高阶张量表达的数据。之所以使用降维后的数据表示是因为在原始的高维空间中,包含有冗余信息以及噪音信息,在实际应用例如图像识别中造成了误差,降低了准确率;而通过降维,我们希望减少冗余信息所造成的误差,提高识别(或其他应用)的精度。又或者希望通过降维算法来寻找数据内部的本质结构特征。
    在很多算法中,降维算法成为了数据预处理的一部分,如PCA。事实上,有一些算法如果没有降维预处理,其实是很难得到很好的效果的。

线性降维方法:

  • 无监督PCA
  • 有监督LDA

非线性降维方法:

  • 保留局部特征为代表的基于重建权值的LLE
  • 基于邻接图的拉普拉斯特征映射
  • 保留全局特征为代表的基于核KPCA
  • 基于距离保持的MDS(欧式距离)
  • Isomap(测地线距离)(MDS方法的扩展)
  • 定义数据的局部和全局结构之间的软边界的t-SNE

    每种算法都有其适用的应用领域,具体使用那种算法极其参数设置都需要根据具体情况进行确认。
    下面以digits数字图像集为例来对比一下各大降维算法。不过也不能完全说明问题,因为有些算法并不适合处理此类数据。

from time import time
import numpy as np
import matplotlib.pyplot as plt
from matplotlib import offsetbox
from sklearn import manifold, datasets, decomposition, ensemble,discriminant_analysis, random_projection
from mpl_toolkits.mplot3d import Axes3D

digits = datasets.load_digits(n_class=5)
X = digits.data
Y = digits.target
print('样本个数:',X.shape[0],'样本维度:',X.shape[1])
n_img_per_row = 20
img = np.zeros((10*n_img_per_row,10*n_img_per_row))
for i in range(n_img_per_row):
    ix = 10*i+1
    for j in range(n_img_per_row):
        iy = 10*j+1
        img[ix:ix+8,iy:iy+8] = X[i*n_img_per_row+j].reshape((8,8))
plt.imshow(img,cmap=plt.cm.binary)
plt.title('data')

Algorithm_SET=[
    manifold.TSNE(n_components=3),
    manifold.LocallyLinearEmbedding(n_components=3),
    manifold.Isomap(n_components=3),
    manifold.MDS(n_components=3),
    decomposition.PCA(n_components=3),
    decomposition.KernelPCA(n_components=3,kernel='rbf'),
    decomposition.KernelPCA(n_components=3,kernel='poly'),
    decomposition.KernelPCA(n_components=3,kernel='sigmoid'),
    discriminant_analysis.LinearDiscriminantAnalysis(n_components=3)   
    ]
Name_SET=[   
    'TSNE',
    'LLE',
    'Isomap',
    'MDS',
    'PCA',
    'KPCA-rbf',
    'KPCA-poly',
    'KPCA-sigmoid',  
    'LDA'
    ]   
for i,Algorithm in enumerate(Algorithm_SET):
    t0 = time()
    X = Algorithm.fit_transform(X,Y)
    #坐标缩放到[0,1]区间
    x_min, x_max = np.min(X,axis=0), np.max(X,axis=0)
    X = (X - x_min) / (x_max - x_min)
    title = Name_SET[i]+": (time %.2fs)" %(time() - t0)
    fig = plt.figure(Name_SET[i])
    ax = Axes3D(fig)
    for j in range(X.shape[0]):
        ax.text(X[j, 0], X[j, 1], X[j,2],str(Y[j]),color=plt.cm.Set1((Y[j]+1) / 10.),fontdict={'weight': 'bold', 'size': 9})
    plt.title(title)
plt.show()

在这里插入图片描述
5分类的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
10分类的样本个数和维度:
在这里插入图片描述
10分类的结果:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
T-SNE在两种情况下的效果都优于其他方法,但是以更高的时间复杂度为前提。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值