数据降维之多维缩放MDS(Multiple Dimensional Scaling)
网上看到关于数据降维的文章不少,介绍MDS的却极少,遂决定写一写。
考虑一个这样的问题。我们有n个样本,每个样本维度为m。我们的目标是用不同的新的k维向量(k<<m)替代原来的n个m维向量,使得在新的低维空间中,所有样本相互之间的距离等于(或最大程度接近)原空间中的距离(默认欧氏距离)。
举个栗子:原来有3个4维样本(1,0,0,3),(8,0,0,5),(2,0,0,4),显然我们可以用三个新的二维样本(1,3),(8,5),(2,4)来保持维度变小并相互之间距离不变。
那么问题来了,如果不是这么明显的数据该如何来处理?降维后的距离一定会相等吗?
MDS算法给出了在给定k值条件下的最优解决方案。
首先我们计算所有原空间中样本相互之间的距离平方矩阵Dist[][],显然这是一非负对称实数矩阵。至此,其实我们要维护的就是Dist不变,与原样本已经无关了。
接下来我们要根据Dist推算出目标降维后内积矩阵B,B[i][j]就是降维后第i,j个向量的内积。关于推导过程可以看相关书籍,这里给出一个优美的结论。
B[i][j]=-0.5(Dist[i][j] - avg(Disti[i]) - avg(Distj[j]) + avg_Dist)
有了B,只需要对B分解成B=U*UT的形式就达到我们的目标了。
对B做特征分解(奇异分解也一样),B=V*diag*VT。
我们可以取最大的k个特征值及其对应的特征向量构成diagk和Vk。
此时U=Vk*diagk0,5就是我们降维后的n个行向量组成的矩阵了。
如果还有疑惑,下面的代码运行试试就明白了。
召唤算法君:
import numpy as np# run this to get a test matrix # A = np.random.randint(1,100,(5,20)) # np.save('mat.npy', A) # exit() A = np.load('mat.npy')n,m = A.shape Dist = np.zeros((n,n)) B = np.zeros((n,n)) for i in range(n):for j in range(n):Dist[i][j] = sum((ix-jx)**2 for ix,jx in zip(A[i], A[j]))disti2 = np.array([0]*n) distj2 = np.array([0]*n)for x in range(n):disti2[x] = np.mean([Dist[x][j] for j in range(n)])distj2[x] = np.mean([Dist[i][x] for i in range(n)])distij2 = np.mean([Dist[i][j] for i in range(n) for j in range(n)])for i in range(n):for j in range(n):B[i][j] = -0.5*(Dist[i][j] - disti2[i] - distj2[j] + distij2)w,v = np.linalg.eig(B)v=v.transpose()U = [{'eVal':w[i], 'eVec':v[i]} for i in range(n)]U.sort(key = lambda obj:obj.get('eVal'), reverse = True) k=4 w=np.array([0]*k) v=np.zeros((k,n))for i in range(k):w[i] = U[i].get('eVal')**0.5v[i] = U[i].get('eVec')ans = np.dot(v.transpose(), np.diag(w))ans_dist = np.zeros((n,n)) for i in range(n):ans_str=""for j in range(n):ans_dist[i][j] = sum((ix-jx)**2 for ix,jx in zip(ans[i], ans[j]))print("Orign dis[][] is :") print Dist print("MDS dis[][] is :") print(ans_dist)
转载于:https://www.cnblogs.com/lochan/p/6627511.html
数据降维之多维缩放MDS(Multiple Dimensional Scaling)相关推荐
- 降维——多维缩放MDS
转载自 http://blog.csdn.net/victoriaw/article/details/78500894 多维缩放(Multidimensional Scaling, MDS)是一组对象 ...
- t-SNE数据降维(2维3维)及可视化
(最近看了一个叫光谱特征在后门攻击中的用法,读完之后发现是用了一个SVD也就是奇异值分解做了降维,然后用残差网络的representation层残差与残差的奇异值分解后的右奇异值矩阵的第一行做乘法得到 ...
- python用tsne降维_哈工大硕士实现了 11 种经典数据降维算法,源代码库已开放
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...
- std中稳定排序算法_源代码库已开放 | 哈工大硕士生用 Python 实现了 11 种经典数据降维算法...
转自:AI开发者 网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA ...
- python 最优化算法库_哈工大硕士生用?Python 实现了 11 种经典数据降维算法,源代码库已开放...
雷锋网 AI 开发者按:网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA. ...
- 哈工大硕士生实现 11 种数据降维算法,代码已开源!
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...
- 文本处理算法_基于 Python 的 11 种经典数据降维算法
网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有个 GitHub 项目整理了使用 Python 实现了 11 种经典的数据抽取(数据降维)算法,包括:PCA.LDA.MDS.LLE. ...
- 无监督学习(2) 数据降维简述与Python实现
为什么要数据降维 大数据时代面临的最大问题是"维度灾难",度量上的不平衡和高维空间的学习复杂度都让机器学习算法在高维数据上很多时候行不通.而且,如果数据超过三维,它们也很难被可视化 ...
- 基于 Python 的 11 种经典数据降维算法
点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达 网上关于各种降维算法的资料参差不齐,同时大部分不提供源代码.这里有 ...
最新文章
- PM-Summit 2019全球产品经理大会北京站即将开幕!
- HDU -2546饭卡(01背包+贪心)
- 网络推广恶意点击js_做好网络推广,是做好网络营销的必要条件
- 【Quartz.net】- Cron表达式
- cocos2dx实现翻书效果。
- 东航期货穿透接口相关资料
- 力扣-面试题 16.10. 生存人数
- 美国节点服务器有什么优势,美国CN2服务器的概念与优势
- 如何使用最新Microsoft Edge打开Flash页面
- 解决系统任务管理器已经被管理员停用
- vSphereClient创建虚拟机教程
- 成都博兰科技有限公司助宝兰网进入云贵川渝市场 www.beylai.com
- [云原生专题-26]:K8S - Kubernetes(K8S)Master集群构建与安装过程详细解读 - master节点的添加
- 我靠海外抖音搬运视频赚到了人生第一桶金:这个风口行业,真的很赚钱
- C++11特性《 右值引用-<完美转发>、lambda表达式》
- protues VSM 图形仿真帮助
- mysql高级功能怎么开启_MySQL高级
- python出租车数据_1-出租车数据的基础处理,由gps生成OD(pandas).ipynb
- ByShell 一个穿越主动防御的木马
- 湖北经济学院计算机专业全国排名,湖北经济学院世界排名、中国排名、专业排名...
热门文章
- root权限执行java_执行具有root权限的java代码(一)
- html去除radio的样式,【HTML+CSS】纯CSS设置checkbox大小和样式 附Radio的去除默认样式和自定义样式...
- css3d模型做法,CSS3 3D房屋模型
- element Table表格隐藏列
- 报错xmlbase 不兼容 expecting up to 23, got 24
- 计算机电子表格公式应用和操作,计算机电子表格公式应用常见错误及处理
- oracle忽略损坏表空间,Oracle表空间文件损坏后的排查及解决
- 全局替换资源_BitLocker+VHD替换TrueCrypt及其后继VeraCrypt
- pkill mysql_centos下kill、killall、pkill命令区别
- tcga数据下载_手把手教你用R下载TCGA数据:CGDSR包