(五)等度量映射(Isomap)
一、问题
低维流形嵌入到高维空间之后,直接再高维空间中计算直线距离具有误导性,因为高维空间中的直线距离在低维嵌入流形上是不可达的。低维嵌入流形上两点间的距离是“测地线”距离,是两点之间的本真距离。直接在高维空间中计算直线距离是不恰当的。
二、解决
如何计算测地线距离呢?流形在局部上与欧氏空间同胚,对于每个点基于欧氏距离找出其近邻点,建立一个近邻连接图(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)相关推荐
- 等度量映射ISOMAP matlab代码
等度量映射ISOMAP 前面的 LLE ,被称作局部模型.因为他们都只关注样本点跟邻居们的关系.现在我们介绍一个全局模型 ISOMAP ( 多维缩放( MDS )的一个变种). 利用流形在局部上与欧氏 ...
- 机器学习强基计划8-4:流形学习等度量映射Isomap算法(附Python实现)
目录 0 写在前面 1 什么是流形? 2 什么是流形学习? 3 等度量映射原理 4 Python实现 0 写在前面 机器学习强基计划聚焦深度和广度,加深对机器学习模型的理解与应用."深&qu ...
- 两种降维方法的总结——LLE(局部线性嵌入),ISOMAP(等度量映射)
简介 流形学习是一类借鉴了拓扑流形概念的降维方法.流形是在局部与欧式空间同胚的空间,换言之,它在局部具有欧式空间的性质,能用欧式距离来进行距离计算.若低维流形嵌入到高维空间中,则数据样本在高维空间的分 ...
- 等度量映射(Isometric Mapping,简称Isomap)
等度量映射(Isometric Mapping,简称Isomap) 1 绪论 在MDS中已经说明了为何要进行降维.而进行降维的一般有两类方法:特征选择和特征提取. 特征选择:根据一定的标准学则显著特征 ...
- (转)MyBatis框架的学习(五)——一对一关联映射和一对多关联映射
http://blog.csdn.net/yerenyuan_pku/article/details/71894172 在实际开发中我们不可能只是对单表进行操作,必然要操作多表,本文就来讲解多表操作中 ...
- 浅析Hibernate映射(五)——集合映射
浅析Hibernate映射(五)--集合映射 集合映射主要包括:set.list.array.map的映射 对象模型: 映射后的关系模型: 映射文件: [html] view plaincopypri ...
- SRPG游戏开发(十)第五章 颜色映射与职业动画 - 二 颜色组(Color Chart)
返回目录 第五章 颜色映射与职业动画 二 颜色组(Color Chart) 颜色组是保存许多颜色的一个容器,可以在Swapper中直接创建List<Color>或Color[] ...
- SRPG游戏开发(九)第五章 颜色映射与职业动画 - 一 颜色映射流程(Flow Chart)
返回目录 第五章 颜色映射与职业动画 这一章我们来完成2D游戏中颜色映射(Palette Swap)调色盘的相关内容,并初步建立一个职业的动画控制器(Animator)与相关动画(Animations ...
- 算法总结(六)Isomap(Isometric mapping等度量映射)和LLE(Locally Linear Embedding)的理解
学习资料 <机器学习>周志华 https://blog.csdn.net/xiaoweidz9/article/details/79894126 dzjwLu https://blog.c ...
最新文章
- spirngmvc如何实现直接输入网页重定向到登录_Python 模拟新浪微博登录
- javascript 之 面向对象【理解对象】
- 使用Asp.net mvc + Linq + mvc_scaffold_gen_setup.exe 生成一个完整的家庭帐册大管家程序 之一...
- 垃圾分类逼疯上海人 微信官方终于出手!
- 【Codeforces	1421	D】Hexagons,贪心,模拟
- 徒手撸框架--高并发环境下的请求合并
- 译: 6. 任务调度(定时执行任务)
- 《Go Web编程实战派——从入门到精通》学习笔记之第1章 Go基础入门
- 搜狗输入法精简_搜狗输入法10.10去图标精简版+9.4.21小米定制版
- Bootstrap基础九辅助类
- C# 多张图片生成PDF
- 数据分析处理之词频统计
- Google搜索引擎算法研究
- c语言大作业宿舍管理系统,数据库大作业——学生宿舍管理系统
- python怎么去掉视频字幕_用Python处理字幕文件
- 献给2020年度虚假繁荣程序员的自己
- 2018上海居住证续签
- 2021年6月4日大学化学无机原理(13)原子的电子层结构
- MySQL中ESCAPE关键字的用法详解
- 开源项目与J2EE架构介绍
热门文章
- Ubuntu不能连接XShell、主机Ping不通虚拟机,但虚拟机能ping通主机
- 使用pscp命令将Windows和linux中文件互相拷贝
- c++中二维数组与二维向量的长度
- 学习lua第一步-lua解释器luac.exe
- 关于自建ip池可能出现的问题
- 【Javascript】获取当前网站协议,域名,完整域名.
- atrix 4g 安装linux,亲测ATRIX 4G MB860详细刷机教程二:解锁bootloader
- 华为鸿蒙P10plus,华为P10 Plus全面评测 华为P10 Plus值不值得买
- 如何查询mysql的url_如何查看数据库的url
- 线稿上色V3(比V2差别在于这个参考图的处理方式),并且更好用哦