MDS算法及其matlab实现
问题背景:
在求解MTSP问题的时候,因为已知的为各个巡检点之间路径耗时长度,而这个具体描述采用无向图结构可以很好的描述,在matlab中通过函数(graphallshortestpaths)可以得到任意两个巡检点之间的距离矩阵
%%得到任意两个巡检点之间的路径时间长度
%W表示从一个巡检点到另一个巡检点的路上花费时间
W=[ ];
%x表示出发的巡检点的编号
x=[ ];
%y表示到达的巡检点的编号
y=[ ];
A=;B=;
m=A;n=A;nzmax=B;
DG=sparse(x,y,W,m,n);
UG=tril(DG+DG');%得到无向连通图矩阵
D2D=graphallshortestpaths(UG,'directed',false);
。得到距离矩阵以后我们还想根据距离矩阵求出每个巡检点的坐标位置矩阵。也就是说现在问题转换为这样的一类问题:我们只知道空间中的点(样本)的距离,那么怎么来重构这些点的相对位置呢?
显然欧式距离是最直观的距离,那么我们就会想使用欧式距离来进行计算重构,我们还希望能够在不同维度上进行重构,比如2维或者3维。
怎么做?
有这么个解决方法叫做MDS 全称为 Multidimensional Scaling。
MDS解决的问题包括:
当n个对象(object)中各对对象之间的相似性(或距离)给定时,确定这些对象在低维空间中的表示,并使其尽可能与原先的相似性(或距离)“大体匹配”,使得由降维所引起的任何变形达到最小。多维空间中排列的每一个点代表一个对象,因此点间的距离与对象间的相似性高度相关。也就是说,两个相似的对象由多维空间中两个距离相近的点表示,而两个不相似的对象则由多维空间两个距离较远的点表示。多维空间通常为二维或三维的欧氏空间,但也可以是非欧氏三维以上空间。
MDS算法应用的场景包括:
将高维的原始数据投影到低维矩阵上,使得低维矩阵各点之间的相对距离最大程度的接近于原来的高维矩阵传达的信息。
在模式识别中,已知一个样本和另一个样本在空间的距离,根据空间距离大小进行分类,但是同样我们只是知道空间上这些点之间的距离,那么如何根据距离来重构这些点之间的相对位置呢?
算法的核心思想以及实现思路:
step1:问题重述:
我们有这么一个距离矩阵,我们通过这个矩阵计算出点的相对位置矩阵X,使得通过X反过来计算距离矩阵与原距离矩阵D差距最小。所以这是一个最优化问题。
step2:
假设X={x1, x2, ..., xn}是一个n×q的矩阵,n为样本数,q是原始的维度,其中每个xi是矩阵X的一列,xi∈Rq。我们并不知道xi在空间中的具体位置,也就是说对于每个xi,其坐标(xi1, xi2, ... , xiq) 都是未知的。我们所知道的仅仅是the pair-wise Euclidean distances for X,我们用一个矩阵DX来表示。因此,对于DX中的每一个元素,可以写成
或者可以写成
对于矩阵DX,则有
其中,
这里的z为
现在让我们来做平移,从而使得矩阵DX中的点具有zero mean,注意平移操作并不会改变X中各个点的相对关系。为了便于理解,我们先来考察一下AeeT/n和eeTA/n的意义,其中A是一个n×n的方阵。
不难发现AeeT/n中第i行的每个元素都是A中第i行的均值,类似的,我们还可以知道,eeTA/n中第i列的每个元素都是A中第i列的均值。因此,我可以定义centering matrix H如下
所以DXH的作用就是从DX中的每个元素里减去列均值,HDXH的作用就是在此基础上再从DX每个元素里又减去了行均值,因此centering matrix的作用就是把元素分布的中心平移到坐标原点,从而实现zero mean的效果。更重要的是,Let D be a distance matrix, one can transform it to an inner product matrix (Kernel Matrix) by K=-HDH/2, 即
上一步之所以成立,因为
因为BX是一个内积矩阵(Gram Matrix/Kernel Matrix),所以它是对称的,这样一来,它就可以被对角化,即BX=U∑UT。
而我们的最终目的是find a concrete set of n points (Y) in k dimensions so that the pairwise Euclidean distances between all the pairs in the concrete set Y is a close approximation to the pair-wise distances given to us in the matrix DX i.e. we want to find DY such that
Note that after applying the ”double centering” operation to both X and Y,上式服从
最终这个问题的解就是Y=U∑1/2。
下面我们首先来演示在MATLAB中计算上述MDS问题的过程,为了展示其原理,下面的代码并不会直接使用MATLAB中内置的用于求解MDS的现成函数。
clear;clc;
%%
%任意两个城市之间的距离矩阵
D=[[0,2,3,5,4,4,6,6,11,9,11,15,13,5,17,15,7,18,7,9,6,8,9,10,8,11],
[2,0,1,3,2,2,4,4,9,7,9,13,11,3,15,13,5,16,5,7,4,6,7,8,6,9],
[3,1,0,4,1,1,3,3,8,6,8,12,10,2,14,12,4,15,6,8,5,7,8,9,5,8],
[5,3,4,0,5,5,7,7,7,10,12,16,14,6,18,16,8,19,7,5,1,3,4,5,9,12],
[4,2,1,5,0,2,2,4,9,7,9,13,11,3,15,13,5,16,7,9,6,8,9,10,6,9],
[4,2,1,5,2,0,4,2,7,5,7,11,9,1,13,11,3,14,7,9,6,8,9,9,4,7],
[6,4,3,7,2,4,0,6,11,9,11,15,13,5,17,15,7,18,9,11,8,10,11,12,8,11],
[6,4,3,7,4,2,6,0,5,7,9,13,11,3,11,13,1,13,9,11,8,9,8,7,2,5],
[11,9,8,7,9,7,11,5,0,12,14,14,16,8,12,17,4,14,8,6,6,4,3,2,3,6],
[9,7,6,10,7,5,9,7,12,0,2,6,4,6,8,6,8,9,12,14,11,13,14,14,9,12],
[11,9,8,12,9,7,11,9,14,2,0,8,2,8,7,4,10,7,14,16,13,15,16,16,11,13],
[15,13,12,16,13,11,15,13,14,6,8,0,9,12,2,7,12,4,18,20,17,18,17,16,11,8],
[13,11,10,14,11,9,13,11,16,4,2,9,0,10,7,2,12,5,16,18,15,17,18,18,13,13],
[5,3,2,6,3,1,5,3,8,6,8,12,10,0,14,12,4,15,8,10,7,9,10,10,5,8],
[17,15,14,18,15,13,17,11,12,8,7,2,7,14,0,5,10,2,20,18,18,16,15,14,9,6],
[15,13,12,16,13,11,15,13,17,6,4,7,2,12,5,0,14,3,18,20,17,19,20,19,14,11],
[7,5,4,8,5,3,7,1,4,8,10,12,12,4,10,14,0,12,10,10,9,8,7,6,1,4],
[18,16,15,19,16,14,18,13,14,9,7,4,5,15,2,3,12,0,21,20,20,18,17,16,11,8],
[7,5,6,7,7,7,9,9,8,12,14,18,16,8,20,18,10,21,0,2,6,4,5,6,11,14],
[9,7,8,5,9,9,11,11,6,14,16,20,18,10,18,20,10,20,2,0,4,2,3,4,9,12],
[6,4,5,1,6,6,8,8,6,11,13,17,15,7,18,17,9,20,6,4,0,2,3,4,9,12],
[8,6,7,3,8,8,10,9,4,13,15,18,17,9,16,19,8,18,4,2,2,0,1,2,7,10],
[9,7,8,4,9,9,11,8,3,14,16,17,18,10,15,20,7,17,5,3,3,1,0,1,6,9],
[10,8,9,5,10,9,12,7,2,14,16,16,18,10,14,19,6,16,6,4,4,2,1,0,5,8],
[8,6,5,9,6,4,8,2,3,9,11,11,13,5,9,14,1,11,11,9,9,7,6,5,0,3],
[11,9,8,12,9,7,11,5,6,12,13,8,13,8,6,11,4,8,14,12,12,10,9,8,3,0]];
D([1,22],:)=D([22,1],:);
D(:,[1,22])=D(:,[22,1]);
%%
%求各个城市的坐标
DSquare = D.^2;
[N,~]=size(D);
H = eye(N)-ones(N)/N;
K = -0.5*H*DSquare*H; [eigVec, eigVal] = eig(K); Y = eigVec(:,1:2)*sqrt(eigVal(1:2,1:2));%%求解的巡检点的坐标分布情况。
MDS算法及其matlab实现的更多相关文章
- GMM算法的matlab程序
GMM算法的matlab程序 在“GMM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
- GMM算法的matlab程序(初步)
GMM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648508.html文章中已经介绍了GMM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...
- KFCM算法的matlab程序(用FCM初始化聚类中心)
KFCM算法的matlab程序(用FCM初始化聚类中心) 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行实现,用FCM初始化聚类中心,并求其准确度与 ...
- KFCM算法的matlab程序
KFCM算法的matlab程序 在“聚类——KFCM”这篇文章中已经介绍了KFCM算法,现在用matlab程序对iris数据库进行简单的实现,并求其准确度. 作者:凯鲁嘎吉 - 博客园 http:// ...
- FCM算法的matlab程序2
FCM算法的matlab程序2 在“FCM算法的matlab程序”这篇文章中已经用matlab程序对iris数据库进行实现,并求解准确度.下面的程序是另一种方法,是最常用的方法:先初始化聚类中心,在进 ...
- FCM算法的matlab程序
FCM算法的matlab程序 在“FCM算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 - 博客园 h ...
- K-means算法的matlab程序
K-means算法的matlab程序 在“K-means算法的matlab程序(初步)”这篇文章中已经用matlab程序对iris数据库进行简单的实现,下面的程序最终的目的是求准确度. 作者:凯鲁嘎吉 ...
- FCM算法的matlab程序(初步)
FCM算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648430.html文章中已经介绍了FCM算法,现在用matlab程序实现它. 作者:凯鲁嘎 ...
- K-means算法的matlab程序(初步)
K-means算法的matlab程序 在https://www.cnblogs.com/kailugaji/p/9648369.html 文章中已经介绍了K-means算法,现在用matlab程序实现 ...
随机推荐
- SpringMVC:拦截器
SpringMVC:拦截器 概述 SpringMVC的处理器拦截器类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理.开发者可以自己定义一些拦截器来实现特定的功能. 过 ...
- ArchLinux安装KDE桌面
ArchLinux安装KDE桌面 一.链接网络 1.有线 # dhcpcd 2.无线 # wifi-menu 3.检查 # ping www.baidu.com 二.安装X服务 # pacman -S ...
- iview checkbox demo(文档改写)
<template> <div class="content"> <div style="border-bottom: 1px solid ...
- 和我一起从0学算法(C语言版)(三)
第二章 暴力求解(枚举法) 第一节 小学奥数题-程序求解 观察下面的加法算式: 祥 瑞 生 辉 + 三 羊 献 瑞 ------------------- 三 羊 生 瑞 气 ...
- Java 面向对象异常处理,finally,覆盖时异常特点,package,import,包之间的访问(10)
Java 面向对象异常处理, finally:final 关键字的用法参考http://www.cnblogs.com/itcqx/p/5541659.html 覆盖时异常特点,package,imp ...
- 主导SEO成败的关键是细节的布局,细数SEO三大布局思路
有的人认为SEO操作就类似车间工作,有一个完整的流程,整套流程下来网站就会有一个好的排名.这样是不对的,优化的着重点是要有一个好的思维,技巧和策略,把这些着重点相结合的运用到SEO优化中,很大的机率会 ...
- Python说文解字_继承过程中的参数集合
1. 先看一段属性继承的代码: class User: def __init__(self,name,age): self.name = name self.age = age class User1 ...
- cmd执行jmeter命令生成报告的问题。
现有几个jmeter脚本,准备以命令行的方式执行jmeter脚本,并生成报告. 一.使用python语言处理 1.目录结构 2.说明 jmx目录下是jmeter脚本 result目录下是生成的报告及文 ...
- Juniper srx新增接口IP,使PC直连srx(转)
转自:https://www.jianshu.com/p/bc27134bde3d Juniper srx新增接口IP,使PC直连srx 2018.11.19 14:24:15字数 424 概述 需求 ...
- poj2243前一道题升级(思维构造+ac自动机)
题:http://acm.hdu.edu.cn/showproblem.php?pid=2243 题意:给出m个模式串,求长度小于n的且存在模式串的字符串数有多少个(a~z) 分析:我们反着来,用总的 ...