多维标度法(multidimensional scaling,MDS)是一种在低维空间展示“距离”数据结构的多元数据分析技术,是一种将多维空间的研究对象( 样本 或 变量 ) 简化到低维空间进行定位、分析和归类, 同时又保留对象间原始关系的数据分析方法。

多维标度法与主成分分析(Principle Component Analysis,PCA)、线性判别分析(Linear Discriminent Analysis,LDA)类似,都可以用来降维.(注:在PCA中,我们降维所用的方法依次寻找正交的并且variance最大的方向,因为variance能够最大程度的保存原特征空间中的信息。在LDA中,因为数据有label,通过一个线性变换,把每个类的中心点 Mk映射到一个新的空间,使得在这个新的空间上,一方面各个中心点之间的距离(这里可称之为类间距离)尽量保持足够大,另一方面每个类里面的点到其中心点的距离(这里可称之为类内距离)尽量小。更多细节略)

多维标度法的目标:当n 个对象中各对对象之间的相似性(或距离)给定时,确定这些对象在低维(欧式) 空间中的表示(称为感知图, Perceptual Mapping),并使其尽可能与原先的相似性(或距离)“大体匹配”,使得由降维所引起的任何变形达到最小。

低维(欧式) 空间中排列的每一个点代表一个对象,因此点间的距离与对象间的相似性高度相关。也就是说,两个相似的对象由低维(欧式) 空间中两个距离相近的点表示,而两个不相似的对象则由低维(欧式) 空间两个距离较远的点表示。低维空间通常为二维或三维的欧氏空间,但也可以是非欧氏三维以上空间.

Classical MDS:

• 原始空间下的距离阵和低维空间下的距离阵都采用欧式距离阵
• 距离阵D 为欧式的, 即存在某个正整数p 以及Rp 空间的n个点x1, . . . , xn, 使得

目标在于: 寻找D 的(拟合) 构图x1, . . . , xn, 其想法为
– 将平方的欧式距离阵D = (d2ij) 变换为一个非负定矩阵B
– 由B 的特征根和特征向量得到构图X, X 的每一行表示低维空间的点.
• 为此, 记原始的p 维对象(观测点) 为x1, . . . , xn(一般是未知的), 两两之间的距离平方为

B = −1/2*HDH,H = In − 1/n 11′

其中, r 的确定: 事先确定r = 1, 2 或3; 或者通过计算前面特征根占全体特征根的比例确定.

import numpy as np

D=np.array([[0,411,213,219,296,397],
[411,0,204,203,120,152],
[213,204,0,73,136,245],
[219,203,73,0,90,191],
[296,120,136,90,0,109],
[ 397,152,245,191,109,0]]) N = D.shape[0]
T = np.zeros((N,N)) #solution 1
#ss = 1.0/N**2*np.sum(D**2)
#for i in range(N):
# for j in range(i,N):
# T[i,j] = T[j,i] = -0.5*(D[i,j]**2 -1.0/N*np.dot(D[i,:],D[i,:]) -1.0/N*np.dot(D[:,j],D[:,j])+ss) #solution 2
#K = np.dot(D,np.transpose(D))
D2 = D**2
H = np.eye(N) - 1/N
T = -0.5*np.dot(np.dot(H,D2),H) eigVal,eigVec = np.linalg.eig(T)
X = np.dot(eigVec[:,:2],np.diag(np.sqrt(eigVal[:2]))) print('original distance','\tnew distance')
for i in range(N):
for j in range(i+1,N):
print(np.str(D[i,j]),'\t\t',np.str("%.4f"%np.linalg.norm(X[i]-X[j])))

运行结果:

参考文档:典型相关分析和多维标度法-张伟平的讲义

多维标度法(MDS)的Python实现的更多相关文章

  1. 吴裕雄 python 机器学习——多维缩放降维MDS模型

    # -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...

  2. 运维DBA要不要学python

    运维DBA要不要学python 我个人认为是:要 现在python在运维数据库的工作中主要用在 1.编写一些运维脚本 2.编写运维管理平台 3.研究互联网大厂的运维脚本/工具并应有 特别是运维开源数据 ...

  3. c/c++ 图相关的函数(二维数组法)

    c/c++ 图相关的函数(二维数组法) 遍历图 插入顶点 添加顶点间的线 删除顶点 删除顶点间的线 摧毁图 取得与v顶点有连线的第一个顶点 取得与v1顶点,v1顶点之后的v2顶点的之后的有连线的第一个 ...

  4. c/c++ 图的创建(二维数组法)

    c/c++ 图的创建(二维数组法) 图的概念 图由点和线组成 知道了图中有多少个点,和哪些点之间有线,就可以把一张图描绘出来 点之间的线,分有方向和无方向 创建图 创建图,实际就是创建出节点,和节点之 ...

  5. 多维尺度变换MDS(Multidimensional Scaling)

    流形学习(Manifold Learning)是机器学习中一大类算法的统称,流形学习是非线性的降维方法(an approach to non-linear dimensionality reducti ...

  6. (数据科学学习手札15)DBSCAN密度聚类法原理简介&Python与R的实现

    DBSCAN算法是一种很典型的密度聚类法,它与K-means等只能对凸样本集进行聚类的算法不同,它也可以处理非凸集. 关于DBSCAN算法的原理,笔者觉得下面这篇写的甚是清楚练达,推荐大家阅读: ht ...

  7. 算法:时间复杂度+二分查找法(Java/Go/Python)实现

    导读 曾几何时学好数据结构与算法是我们从事计算机相关工作的基本前提,然而现在很多程序员从事的工作都是在用高级程序设计语言(如Java)开发业务代码,久而久之,对于数据结构和算法就变得有些陌生了,由于长 ...

  8. Python自动化运维开发实战 三、python文件类型

    导语: python常用的有3种文件类型 1. 源代码 py 2. 字节代码 pyc 3. 优化代码 pyo 源代码: python源代码的文件以”py"为扩展名,由python程序解释,不 ...

  9. Python自动化运维开发实战 二、Python基本用法

    导语: Python编程博大精深,知识点众多,需要先整体上了解python的一些基本用法之后再去对每一个知识点细细研究,这样学习的速度会快很多.所以下面就先看一些python事先需要知道的基本知识. ...

随机推荐

  1. 2018.10.18 poj2187Beauty Contest(旋转卡壳)

    传送门 旋转卡壳板子题. 就是求凸包上最远点对. 直接上双指针维护旋转卡壳就行了. 注意要时刻更新最大值. 代码: #include<iostream> #include<cstdi ...

  2. linux系统编程之进程(五):exec系列函数(execl,execlp,execle,execv,execvp)使用

    本节目标: exec替换进程映像 exec关联函数组(execl.execlp.execle.execv.execvp) 一,exec替换进程映像 在进程的创建上Unix采用了一个独特的方法,它将进程 ...

  3. day3之文件操作

    一,文件操作基本流程. # 1.打开文件,产生文件句柄 # 2.操作文件句柄 # 3.关闭文件句柄 # f1 = open('11.txt',encoding='utf-8', mode='r') # ...

  4. Codeforces735A Ostap and Grasshopper 2016-12-13 11:53 78人阅读 评论(0) 收藏

    A. Ostap and Grasshopper time limit per test 2 seconds memory limit per test 256 megabytes input sta ...

  5. node nodemailer

    需求:通过nodejs发送邮件 一般都是用nodemailer这个模块.目前有0.7和1.0两个版本,网上的很多教程和代码,大都是按照0.7写的,自己做的时候需要注意看README.md 支持的ser ...

  6. linux系统编程之进程(六):父进程查询子进程的退出,wait,waitpid

    本节目标: 僵进程 SIGCHLD wait waitpid 一,僵尸进程 当一个子进程先于父进程结束运行时,它与其父进程之间的关联还会保持到父进程也正常地结束运行,或者父进程调用了wait才告终止. ...

  7. SQL语句小tips(持续更新)

    统计非法数据 判断people_id是否是32为字母组成的,统计不满足要求的数据 SELECT COUNT(IF(BINARY people_id NOT REGEXP '^[0-9a-z]{32}' ...

  8. Unity Shader序列帧动画学习笔记

    Unity Shader序列帧动画学习笔记 关于无限播放序列帧动画的一点问题 在学shader的序列帧动画时,书上写了这样一段代码: fixed4 frag(v2f i){ // 获得整数时间 flo ...

  9. Android studio项目预览的时候提示错误ActionBarOverlayLayout

    android studio打开项目(别人的demo),提示页面没法预览.截图如下 根据查询,是主题没法正常显示,需要修改样式.样式文件的路径为res\values\styles.xml,截图如下. ...

  10. SQL语句中的TOP(expression) [PERCENT] [WITH TIES] 用法

    TOP(expression) [PERCENT] [WITH TIES] expression : 指定返回行数的数值表达式.如果指定了PERCENT,则expression默认转换为FLOAT值, ...