流形学习

  • 流形学习

    • 1. 矩阵内积
    • 2. 特征值,特征向量,特征分解
      • 2.1 特征值和特征向量
      • 2.2 特征分解
    • 3. 数据降维
      • 3.1 MDS(Multiple Dimensional Scaling)

        • 3.1.1 实现流程
        • 3.1.2 pseudocode
        • 3.1.3 code(python)
      • 3.2 isomap(等度量映射)
        • 3.2.1 核心
        • 3.2.2 过程
        • 3.2.3 pesudocode
        • 3.2.4 Question

基本思想:在高维空间中,有低维结构。所以在局部具有欧式空间的性质。能用欧氏距离来进行距离计算。

如在三维空间中有二维平面

  • 测地线距离geodesic:沿着地面的路线走,即b图红线的距离。
  • 高维直线距离:虚线部分欧氏距离

所以高维中的测地线距离需要用近邻距离来近似。

1. 矩阵内积

  • 矩阵的转置:(AB)′=B′A′(AB)′=B′A′(AB)'=B'A'
  • 方阵的幂A0=EA0=EA^0=E
  • 由方阵A的元素所构成的行列式(各元素的位置不变),称为方阵A的行列式,记作|A|或detAdetAdetA
  • |λA|=λn|A||λA|=λn|A||\lambda A|=\lambda^n |A|(λλ\lambda是常数,A的阶数为n)
  • AB=BA=E。 则我们称B是A的逆矩阵 A−1=BA−1=BA^{-1}=B
  • 方阵不可逆,则行列式为0
  • 若n阶方阵A满足ATAATAA^TA=E (即A−1A−1A^{-1}=ATATA^T),那称A为正交矩阵
  • 正交变换刚好就是对数据做旋转、翻转操作的

先介绍向量的两种运算,一个行向量乘以一个列向量称作向量的内积,又叫作点积,结果是一个数;

一个列向量乘以一个行向量称作向量的外积,外积是一种特殊的克罗内克积,结果是一个矩阵,

2. 特征值,特征向量,特征分解

两篇文章参考
参考1
参考2

2.1 特征值和特征向量

  • 红线为特征向量 v
  • A(变换矩阵)为特征向量矩阵
  • λ 是特征值
  • ∑∑\sum 为特征值的对角矩阵
  • I 为单位矩阵

1、在这种情况下变换仅仅是水平方向乘以因子2和垂直方向乘以因子0.5,使得变换矩阵A定义为

2、在一般情况下,特征向量矩阵A的特征向量 v 满足下列式子

Av=λvAv=λv

Av=\lambda v
λ为特征向量 v 对应的特征值。我们可以将上式重写为

3、如果一个方阵是不可逆的,这意味着它的行列式必须等于零。因此,要找到A的特征向量,我们只需要解决以下公式:

4、利用判别式 Δ=b2−4acΔ=b2−4ac\Delta=b^2-4ac 来找到 λ 的值。需要注意的是大小为NxN的方阵总是具有N个特征值,每一个对应一个特征向量。特征值指定特征向量的大小。

5、将 λ 代入 公式8,找到特征向量。

2.2 特征分解

局限:变换的矩阵必须是方阵

特征值分解是将一个矩阵分解为如下形式:

其中,Q是这个矩阵A的特征向量组成的矩阵,Σ是一个对角矩阵,每一个对角线元素就是一个特征值,里面的特征值是由大到小排列的,这些特征值所对应的特征向量就是描述这个矩阵变化方向(从主要的变化到次要的变化排列)。也就是说矩阵A的信息可以由其特征值和特征向量表示。

对于矩阵为高维的情况下,那么这个矩阵就是高维空间下的一个线性变换。可以想象,这个变换也同样有很多的变换方向,我们通过特征值分解得到的前N个特征向量,那么就对应了这个矩阵最主要的N个变化方向。我们利用这前N个变化方向,就可以近似这个矩阵(变换)。

3. 数据降维

3.1 MDS(Multiple Dimensional Scaling)

参考

我们有n个样本,每个样本维度为m。我们的目标是用不同的新的k维向量 (k<<mk<<mk) 替代原来的n个m维向量,使得在新的低维空间中,所有样本相互之间的距离等于(或最大程度接近)原空间中的距离(默认欧氏距离)。

MDS接收的输入是一个距离矩阵D(已经降维后的矩阵)

不能直接转换到原始数据的原因

  • 对点做平移、旋转等变化时,点之间的距离时不变的

3.1.1 实现流程

思路是:从D->B->X

假设: X是一个n×q的矩阵,n为样本数,q是原始的维度 ;降维后的距离矩阵D

定义:内积矩阵B

B=XXT    (n×n)=(XM)(XM)T    (M是一组正交基,对X做正交变换)=XMMTX=XXT(7)(7)B=XXT(n×n)=(XM)(XM)T(M是一组正交基,对X做正交变换)=XMMTX=XXT

\begin{equation}\begin{aligned}B &= XX^T \space\space\space\space(n\times n) \\&= (XM)(XM)^T \space\space\space\space(M是一组正交基,对X做正交变换)\\&= XMM^TX \\&= XX^T\end{aligned} \end{equation}
所以如果我们想通过B反算出X,肯定是没法得到真正的XX, 而是它的任意一种正交变换后的结果。

B的每个元素:

bij=∑k=1qxikxjk,i是行,j是列bij=∑k=1qxikxjk,i是行,j是列

b_{ij} = \sum_{k=1}^{q}x_{ik}x_{jk}, i 是行,j是列
D的每个元素:

d2ij=(xi−xj)2=∑k=1q(xik−xjk)2    (求每个向量的距离)=∑k=1qx2ik+x2jk−2xikxjk=bii+bjj−2bij(8)(8)dij2=(xi−xj)2=∑k=1q(xik−xjk)2(求每个向量的距离)=∑k=1qxik2+xjk2−2xikxjk=bii+bjj−2bij

\begin{equation} \begin{aligned}d_{ij}^2 &= (x_i-x_j)^2 \\&= \sum_{k=1}^{q}(x_{ik}-x_{jk})^2 \space\space\space\space(求每个向量的距离)\\&= \sum_{k=1}^{q}x_{ik}^2+x_{jk}^2-2x_{ik}x_{jk}\\&=b_{ii}+b_{jj}-2b_{ij} \end{aligned} \end{equation}
根据公式3,我们可以得到

bij=−12(d2ij−bii−bjj)bij=−12(dij2−bii−bjj)

b_{ij} = -\frac12(d_{ij}^2-b_{ii}-b_{jj})
trick去中心化 :

数据的中心点平移到原点 ∑ni=1xik=0,for all k=1..q∑i=1nxik=0,forallk=1..q\sum_{i=1}^nx_{ik} = 0, for \space all \space k =1..q

即B的任意行(row)之和以及任意列(column)之和都为0了 。所以我们可以得到

biibjj2Tn=Tn+1n∑j=1nd2ij=Tn+1n∑i=1nd2ij=1n2∑i=1n∑j=1nd2ij(9)(10)(11)(9)bii=Tn+1n∑j=1ndij2(10)bjj=Tn+1n∑i=1ndij2(11)2Tn=1n2∑i=1n∑j=1ndij2

\begin{align}b_{ii} &= \frac{T}n+\frac1n\sum_{j=1}^nd_{ij}^2\\b_{jj} &= \frac{T}n+\frac1n\sum_{i=1}^nd_{ij}^2\\\frac{2T}{n} &= \frac{1}{n^2}\sum_{i=1}^n\sum_{j=1}^nd_{ij}^2 \end{align}
特别重要的公式(在代码中应用)

bij=−12(d2ij−bii−bjj)=−12(d2ij−1n∑j=1nd2ij−1n∑i=1nd2ij+2Tn)=−12(d2ij−1n∑j=1nd2ij−1n∑i=1nd2ij+1n2∑i=1n∑j=1nd2ij)=−12(d2ij−d2i⋅−d2⋅j+d2⋅⋅)(12)(12)bij=−12(dij2−bii−bjj)=−12(dij2−1n∑j=1ndij2−1n∑i=1ndij2+2Tn)=−12(dij2−1n∑j=1ndij2−1n∑i=1ndij2+1n2∑i=1n∑j=1ndij2)=−12(dij2−di⋅2−d⋅j2+d⋅⋅2)

\begin{equation} \begin{aligned}b_{ij} &= -\frac12(d_{ij}^2-b_{ii}-b_{jj})\\&= -\frac12(d_{ij}^2-\frac1n\sum_{j=1}^nd_{ij}^2-\frac1n\sum_{i=1}^nd_{ij}^2+\frac{2T}{n})\\&= -\frac12(d_{ij}^2-\frac1n\sum_{j=1}^nd_{ij}^2-\frac1n\sum_{i=1}^nd_{ij}^2+\frac{1}{n^2}\sum_{i=1}^n\sum_{j=1}^nd_{ij}^2)\\&= -\frac12(d_{ij}^2-d_{i\cdot}^2-d_{\cdot j}^2+d_{\cdot\cdot}^2) \end{aligned} \end{equation}
可以看到 d2i⋅di⋅2d_{i\cdot}^2 是 D2D2D^2行均值; d2⋅jd⋅j2d_{\cdot j}^2是列均值; d2⋅⋅d⋅⋅2d_{\cdot\cdot}^2是矩阵的均值。

这样我们就可以通过矩阵D得到矩阵B了 。因为B是对称的矩阵,所以可以通过特征分解得到:

B=VΛV−1=VΛVTB=VΛV−1=VΛVT

\begin{aligned}B &= V\Lambda V^{-1}\\&= V\Lambda V^T \end{aligned}
D会是一个对称实矩阵,此时得到的B刚好会有q个非0的特征值,也就是说B的秩等于q,如果我们想还原X,就选择前q个特征值和特征向量;如果想要达到降维的目的,就选择制定的p个(p

3.1.2 pseudocode

3.1.3 code(python)

def mds(D, q):"""将 D 转化成内积矩阵 B:bij=-0.5(dij^2-di.^2-d.j^2+d..^2)将 B 转化成 X:X=特征向量*sqrt(特征值):param D:距离矩阵:param q:降维的目标:return:降维后的目标矩阵"""D = np.asarray(D)DSquare = D ** 2  # d^2totalMean = np.mean(DSquare)  # d..^2columnMean = np.mean(DSquare, axis=0)  # d.j^2rowMean = np.mean(DSquare, axis=1)  # di.^2B = np.zeros(DSquare.shape)for i in range(B.shape[0]):for j in range(B.shape[1]):B[i][j] = -0.5 * (DSquare[i][j] - rowMean[i] - columnMean[j] + totalMean)eigVal, eigVec = np.linalg.eig(B)  # 找到特征值和特征向量print(eigVal, eigVec)X = np.dot(eigVec[:, :q], np.sqrt(np.diag(eigVal[:q])))return X

3.2 isomap(等度量映射)

A Global Geometric Framework for Nonlinear Dimensionality Reduction. Joshua B. Tenenbaum, Vin de Silva, John C. Langford. 2000.

3.2.1 核心

构造点之间的距离

对于每个点,基于欧氏距离找出其邻近点,(邻近点之间存在连接,非邻近点不存在连接),建立邻近连接图。

3.2.2 过程

1.为每个数据点确定邻居 ,将它们连接起来构造带权邻接图G(复杂度:O(DN2)O(DN2)O(DN^2))

​ 1.1 通过kNN(k-Nearest Neighbor)找到点的k个最近邻

​ 1.2 把半径ϵ内的所有点作为邻居

2.通过计算同中各点之间的最短路径Dijkstra ,作为点之间的距离dij放入距离矩阵D(复杂度:O(DN2)O(DN2)O(DN^2))

3.将D传给经典的MDS算法,得到降维后的结果。 (复杂度:O(qN2)O(qN2)O(qN^2))

3.2.3 pesudocode

# -*- coding: utf-8 -*-
# @Time    : 2018/7/11 14:37
# @Author  : Inkky
# @Email   : yingyang_chen@163.com
'''
isomap算法主要流程
1、找k近邻的点形成近邻图
2、找最短路径(Floyd或者Dijkstra)形成近邻矩阵
3、调用MDS降维N :训练数据点数
D: 近邻矩阵
k :最近邻居数
q :输出尺寸
'''import numpy as np
from sklearn import datasets
from MDS import mdsimport matplotlib.pyplot as pltdef distancematirx(data):n = len(data)dis_matrix = np.zeros([n, n], np.float32)for i in range(n):for j in range(n):dis_matrix[i, j] = np.linalg.norm(data[i] - data[j])return dis_matrixdef dijkstra(data, start):n = len(data)col = data[start].copy()  # 一维数组 dis 来存储 1 号顶点到其余各个顶点的初始路程for i in range(n):tmp = np.argpartition(col, 1)[1]  # 找到第二小的值,最小为自身dis = data[start, tmp]  # 找到最短的长度for j in range(n):  # 更新距离矩阵if data[start, j] > dis + data[i, j]:data[start, j] = dis + data[i, j]data[j, start] = data[start, j]col[tmp] = float('inf')return datadef isomap(rawdata, target, k):inf = float('inf')n = len(rawdata)if k >= n:raise ValueError('K is too large')mat_matrix = distancematirx(rawdata)  # 计算原来矩阵的距离print(mat_matrix)# 找到k近邻k_near = np.ones([n, n], np.float32) * inffor i in range(n):temp = np.argpartition(mat_matrix[i], k)[:k + 1]print(temp)k_near[i][temp] = mat_matrix[i][temp]print('找到k近邻\n', k_near)# 调用最短路径短发计算任意两样本点之间的距离for i in range(n):dist = dijkstra(k_near, i)print('调用最短路径短发计算任意两样本点之间的距离\n', dist)# 调用mds降维return mds(dist, target)if __name__ == '__main__':digits = datasets.load_digits(n_class=4)X = digits.data[:10,:10] #只能为偶数y = digits.targetn_samples, n_features = X.shapeprint(n_samples, n_features)print('开始降维.....')# D = np.array([[1, 2, 3, 4], [2, 1, 5, 6], [3, 5, 1, 7], [4, 6, 7, 1], [3, 4, 5, 6], [6, 1, 2, 3]])  # test dataoutcome = isomap(X, 2, 4)print('降维完成\n')print(outcome)

3.2.4 Question

问1:降维过程中保留距离信息不变,这是不是意味着任意两点在低维空间中的测地线距离应该和高维空间中的测地线距离相同?但是如果用MDS,那么高维空间中的距离度量用的是测地线距离,而低维空间用的是欧氏距离,和目标不一致了怎么办?

答:低维空间中使用欧氏距离,是因为此时欧氏距离是测地线距离的一个近似。就像高维空间中用最短路径距离近似测地线距离一样。


ref

https://blog.csdn.net/dapanbest/article/details/78128505

流形学习——MDS ISOMAP相关推荐

  1. 浅谈流形学习之Isomap算法

    1.流形学习基本概念 "maniflod"在英文中作为动词的原意为复写,使多样化."mani-"表示多,"fold"有折叠的意思,可简单理解 ...

  2. sklearn自学指南(part33)--流形学习

    学习笔记,仅供参考,有错必究 文章目录 流形学习 简介 Isomap 局部线性嵌入 修正局部线性嵌入算法(MLLE) Hessian Eigenmapping Spectral Embedding 局 ...

  3. sklearn降维算法:PCA、LDA、MDS、流形学习Isomap

    一.PCA降维(主成分分析) PCA是最常用的无监督降维算法 其原理是寻找方差最大维度,只是最大化类间样本的方差 例如,已知存在数据点如下图 PCA算法寻找方差最大维度 PCA案例:iris降维 %m ...

  4. t-sne 流形_流形学习[t-SNE,LLE,Isomap等]变得轻松

    t-sne 流形 Principal Component Analysis is a powerful method, but it often fails in that it assumes th ...

  5. 机器学习强基计划8-4:流形学习等度量映射Isomap算法(附Python实现)

    目录 0 写在前面 1 什么是流形? 2 什么是流形学习? 3 等度量映射原理 4 Python实现 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用."深&qu ...

  6. ML之MaL: 流形学习MaL的概念认知、算法分类、案例应用、代码实现之详细攻略

    ML之MaL: 流形学习MaL的概念认知.算法分类.案例应用.代码实现之详细攻略 目录 MaL的概念认知 MaL的算法分类 MaL的案例应用 MaL的代码实现 MaL的概念认知 流形学习,全称流形学习 ...

  7. manifold learning 流形学习 zz

  8. 四、降维——流形学习 (manifold learning)

    zz from prfans ...............................  dodo:流形学习 (manifold learning) dodo 流形学习是个很广泛的概念.这里我主 ...

  9. 【Scikit-Learn 中文文档】流形学习 - 监督学习 - 用户指南 | ApacheCN

    中文文档: http://sklearn.apachecn.org/cn/stable/modules/manifold.html 英文文档: http://sklearn.apachecn.org/ ...

最新文章

  1. ARKit从入门到精通-ARKit工作原理及流程介绍
  2. linux 端口 流量统计,Linux下如何对端口流量进行统计
  3. 如何加强网络安全 这7种建议你不可不知!
  4. “纹身贴皮电路“:未来在皮肤上画个电路就能监测身体健康状况
  5. Python之web开发(四):python使用django框架搭建网站之主页搭建
  6. python进阶(小白也能看懂)——Map、Filter、Reduce
  7. python 摄像头标定_python 3利用Dlib 19.7实现摄像头人脸检测特征点标定
  8. Linux上的.NET框架Mono 2.0发布
  9. jsp 点击左边菜单 菜单栏没有停在二级菜单上_Excel – 如何快速导入网页上的表格?...
  10. Linux操作系统原理与应用02:内存寻址
  11. 敏捷开发用户故事系列之四:优先级排序
  12. 2.Linux性能诊断 --- 单机负载评估
  13. oracle客户端odbc安装程序,Oracle Instant Client ODBC 安装说明
  14. 全面分析游戏限制多开原理
  15. 全量查询与分页查询合二为一的思考
  16. Linux下挂载大容量存储
  17. 回头看一看我的2017年
  18. Win10资源管理器闪退解决办法
  19. Linux错误:bash:finger 未找到命令...
  20. 做一个墨水屏电子钟,炫酷!

热门文章

  1. 【前端】从零开始读懂Web3
  2. 百度直播这半年:内建中台,外投生态,瞄准知识和带货
  3. 今天给大家聊一聊Apple ID的那些事
  4. 什么是全民开发?|概念、技能和优势
  5. 简谈caffe中的LRN层
  6. 本人独立开发的天气app-口袋天气成功在应用宝上线
  7. golang sprintf
  8. 还在用递归来计算菲波那契数列?你Time Limit Exceeded了
  9. ATAC-seq分析:数据介绍(2)
  10. 3款windows实用软件,免费又良心,真正懂你的需求