一、问题

低维流形嵌入到高维空间之后,直接再高维空间中计算直线距离具有误导性,因为高维空间中的直线距离在低维嵌入流形上是不可达的。低维嵌入流形上两点间的距离是“测地线”距离,是两点之间的本真距离。直接在高维空间中计算直线距离是不恰当的。

二、解决

如何计算测地线距离呢?流形在局部上与欧氏空间同胚,对于每个点基于欧氏距离找出其近邻点,建立一个近邻连接图(1指定近邻点的个数,k近邻图;2指定距离的阈值, ϵ \epsilon ϵ近邻图),即解决近邻连接图上最短路径的问题(使用Dijkstra或者Floyd算法求最短路径)。由此得到距离矩阵,接下来使用MDS方法来获得样本点在低维空间中的坐标。MDS原理及python实现

三、算法描述

输入:样本集 D = ( x ( 1 ) , x ( 2 ) , . . . x ( n ) ) T ; D=(x_{(1)},x_{(2)},...x_{(n)})^T; D=(x(1)​,x(2)​,...x(n)​)T;
\qquad \,\,\, 近邻参数 k k k;
\qquad \,\,\, 低维空间维数 d ′ d^{'} d′
输出:样本集 D D D在低维空间中的投影 Z = ( z ( 1 ) , z ( 2 ) , . . . z ( n ) ) T ; Z=(z_{(1)},z_{(2)},...z_{(n)})^T; Z=(z(1)​,z(2)​,...z(n)​)T;
过程:
for i = 1 , 2 , . . n i=1,2,..n i=1,2,..n do
\qquad 确定 x ( i ) T x_{(i)}^T x(i)T​的 k k k近邻, x ( i ) T x_{(i)}^T x(i)T​与 k k k近邻之间的距离设置为欧氏距离,与其他点之间的距离设置为无穷大;
end for
调用最短路径算法计算任意两样本点之间的距离,得到距离矩阵,作为MDS算法的输入;
return \,\,\,\, MDS算法的输出

四、python实现

# coding:utf-8
import numpy as np
from sklearn.datasets import make_s_curve
import matplotlib.pyplot as plt
from sklearn.manifold import Isomap
from mpl_toolkits.mplot3d import Axes3Ddef floyd(D,n_neighbors=15):    #k近邻Max = np.max(D)*1000n1,n2 = D.shapek = n_neighborsD1 = np.ones((n1,n1))*MaxD_arg = np.argsort(D,axis=1) #返回从小到大的索引值,每一列进行排序print(D_arg)for i in range(n1):D1[i,D_arg[i,0:k+1]] = D[i,D_arg[i,0:k+1]]  #找出与i最近的k个数for k in range(n1):for i in range(n1):for j in range(n1):if D1[i,k]+D1[k,j]<D1[i,j]:D1[i,j] = D1[i,k]+D1[k,j]  #需再次理解 return D1def cal_pairwise_dist(x):          #任意两点之间距离的平方'''计算pairwise 距离, x是matrix(a-b)^2 = a^2 + b^2 - 2*a*b'''sum_x = np.sum(np.square(x), 1)   #square计算各元素平方      1 按行相加  0按列相加dist = np.add(np.add(-2 * np.dot(x, x.T), sum_x).T, sum_x)#返回任意两个点之间距离的平方return distdef my_mds(dist, n_dims):    #距离矩阵分解,得到降维之后的数据# dist (n_samples, n_samples)dist = dist**2n = dist.shape[0]T1 = np.ones((n,n))*np.sum(dist)/n**2T2 = np.sum(dist, axis = 1)/nT3 = np.sum(dist, axis = 0)/nB = -(T1 - T2 - T3 + dist)/2eig_val, eig_vector = np.linalg.eig(B)index_ = np.argsort(-eig_val)[:n_dims]picked_eig_val = eig_val[index_].realpicked_eig_vector = eig_vector[:, index_]return picked_eig_vector*picked_eig_val**(0.5)def my_Isomap(data,n=2,n_neighbors=30):D = cal_pairwise_dist(data)D[D < 0] = 0D = D**0.5       #距离矩阵D_floyd=floyd(D, n_neighbors)     #k近邻之后得到的距离矩阵data_n = my_mds(D_floyd, n_dims=n)return data_ndef scatter_3d(X, y):fig = plt.figure(figsize=(6, 5))ax = fig.add_subplot(111, projection='3d')ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=y, cmap=plt.cm.hot)ax.view_init(10, -70)ax.set_xlabel("$x_1$", fontsize=18)ax.set_ylabel("$x_2$", fontsize=18)ax.set_zlabel("$x_3$", fontsize=18)plt.show()if __name__ == '__main__':X, Y = make_s_curve(n_samples = 500,noise = 0.1,random_state = 42)  #生成S型曲线数据集data_1 = my_Isomap(X, 2, 10)    data_2 = Isomap(n_neighbors = 10, n_components = 2).fit_transform(X)plt.figure(figsize=(8,4))plt.subplot(121)plt.title("my_Isomap")plt.scatter(data_1[:, 0], data_1[:, 1], c = Y)plt.subplot(122)plt.title("sklearn_Isomap")plt.scatter(data_2[:, 0], data_2[:, 1], c = Y)plt.savefig("Isomap1.png")plt.show()

(五)等度量映射(Isomap)相关推荐

  1. 等度量映射ISOMAP matlab代码

    等度量映射ISOMAP 前面的 LLE ,被称作局部模型.因为他们都只关注样本点跟邻居们的关系.现在我们介绍一个全局模型 ISOMAP ( 多维缩放( MDS )的一个变种). 利用流形在局部上与欧氏 ...

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

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

  3. 两种降维方法的总结——LLE(局部线性嵌入),ISOMAP(等度量映射)

    简介 流形学习是一类借鉴了拓扑流形概念的降维方法.流形是在局部与欧式空间同胚的空间,换言之,它在局部具有欧式空间的性质,能用欧式距离来进行距离计算.若低维流形嵌入到高维空间中,则数据样本在高维空间的分 ...

  4. 等度量映射(Isometric Mapping,简称Isomap)

    等度量映射(Isometric Mapping,简称Isomap) 1 绪论 在MDS中已经说明了为何要进行降维.而进行降维的一般有两类方法:特征选择和特征提取. 特征选择:根据一定的标准学则显著特征 ...

  5. (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射

    http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...

  6. 浅析Hibernate映射(五)——集合映射

    浅析Hibernate映射(五)--集合映射 集合映射主要包括:set.list.array.map的映射 对象模型: 映射后的关系模型: 映射文件: [html] view plaincopypri ...

  7. SRPG游戏开发(十)第五章 颜色映射与职业动画 - 二 颜色组(Color Chart)

    返回目录 第五章 颜色映射与职业动画 二       颜色组(Color Chart) 颜色组是保存许多颜色的一个容器,可以在Swapper中直接创建List<Color>或Color[] ...

  8. SRPG游戏开发(九)第五章 颜色映射与职业动画 - 一 颜色映射流程(Flow Chart)

    返回目录 第五章 颜色映射与职业动画 这一章我们来完成2D游戏中颜色映射(Palette Swap)调色盘的相关内容,并初步建立一个职业的动画控制器(Animator)与相关动画(Animations ...

  9. 算法总结(六)Isomap(Isometric mapping等度量映射)和LLE(Locally Linear Embedding)的理解

    学习资料 <机器学习>周志华 https://blog.csdn.net/xiaoweidz9/article/details/79894126 dzjwLu https://blog.c ...

最新文章

  1. spirngmvc如何实现直接输入网页重定向到登录_Python 模拟新浪微博登录
  2. javascript 之 面向对象【理解对象】
  3. 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
  4. 垃圾分类逼疯上海人 微信官方终于出手!
  5. 【Codeforces 1421 D】Hexagons,贪心,模拟
  6. 徒手撸框架--高并发环境下的请求合并
  7. 译: 6. 任务调度(定时执行任务)
  8. 《Go Web编程实战派——从入门到精通》学习笔记之第1章 Go基础入门
  9. 搜狗输入法精简_搜狗输入法10.10去图标精简版+9.4.21小米定制版
  10. Bootstrap基础九辅助类
  11. C# 多张图片生成PDF
  12. 数据分析处理之词频统计
  13. Google搜索引擎算法研究
  14. c语言大作业宿舍管理系统,数据库大作业——学生宿舍管理系统
  15. python怎么去掉视频字幕_用Python处理字幕文件
  16. 献给2020年度虚假繁荣程序员的自己
  17. 2018上海居住证续签
  18. 2021年6月4日大学化学无机原理(13)原子的电子层结构
  19. MySQL中ESCAPE关键字的用法详解
  20. 开源项目与J2EE架构介绍

热门文章

  1. Ubuntu不能连接XShell、主机Ping不通虚拟机,但虚拟机能ping通主机
  2. 使用pscp命令将Windows和linux中文件互相拷贝
  3. c++中二维数组与二维向量的长度
  4. 学习lua第一步-lua解释器luac.exe
  5. 关于自建ip池可能出现的问题
  6. 【Javascript】获取当前网站协议,域名,完整域名.
  7. atrix 4g 安装linux,亲测ATRIX 4G MB860详细刷机教程二:解锁bootloader
  8. 华为鸿蒙P10plus,华为P10 Plus全面评测 华为P10 Plus值不值得买
  9. 如何查询mysql的url_如何查看数据库的url
  10. 线稿上色V3(比V2差别在于这个参考图的处理方式),并且更好用哦