数据降维之多维缩放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.5
v[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)
数据降维之多维缩放MDS(Multiple Dimensional Scaling)的更多相关文章
- python大战机器学习——数据降维
注:因为公式敲起来太麻烦,因此本文中的公式没有呈现出来,想要知道具体的计算公式,请参考原书中内容 降维就是指采用某种映射方法,将原高维空间中的数据点映射到低维度的空间中 1.主成分分析(PCA) 将n ...
- TSNE数据降维学习【转载】
转自:https://blog.csdn.net/u012162613/article/details/45920827 https://www.jianshu.com/p/d6e7083d7d61 ...
- 斯坦福机器学习视频笔记 Week8 无监督学习:聚类与数据降维 Clusting & Dimensionality Reduction
监督学习算法需要标记的样本(x,y),但是无监督学习算法只需要input(x). 您将了解聚类 - 用于市场分割,文本摘要,以及许多其他应用程序. Principal Components Analy ...
- 吴裕雄 python 机器学习——多维缩放降维MDS模型
# -*- coding: utf-8 -*- import numpy as np import matplotlib.pyplot as plt from sklearn import datas ...
- Coursera《machine learning》--(14)数据降维
本笔记为Coursera在线课程<Machine Learning>中的数据降维章节的笔记. 十四.降维 (Dimensionality Reduction) 14.1 动机一:数据压缩 ...
- 数据降维技术(1)—PCA的数据原理
PCA(Principal Component Analysis)是一种常用的数据分析方法.PCA通过线性变换将原始数据变换为一组各维度线性无关的表示,可用于提取数据的主要特征分量,常用于高维数据的降 ...
- 初识PCA数据降维
PCA要做的事降噪和去冗余,其本质就是对角化协方差矩阵. 一.预备知识 1.1 协方差分析 对于一般的分布,直接代入E(X)之类的就可以计算出来了,但真给你一个具体数值的分布,要计算协方差矩阵,根据这 ...
- 数据降维技术(2)—奇异值分解(SVD)
上一篇文章讲了PCA的数据原理,明白了PCA主要的思想及使用PCA做数据降维的步骤,本文我们详细探讨下另一种数据降维技术—奇异值分解(SVD). 在介绍奇异值分解前,先谈谈这个比较奇怪的名字:奇异值分 ...
- 用TSNE进行数据降维并展示聚类结果
TSNE提供了一种有效的数据降维方式,让我们可以在2维或3维的空间中展示聚类结果. # -*- coding: utf-8 -*- from __future__ import unicode_lit ...
随机推荐
- 通过Excel文件快速创建页面和数据表
在设计一个软件系统,构建过程:需求->数据表->系统开发.实际情况是需求(数据)很多来源于已经存在的文件中,客户会要求把这些数据“电子化”,这就给需求分析产生了很大的工作量: 分析这些原始 ...
- RecycleView设置顶部分割线(记录一个坑)
大家都知道,想给RecycleView设置分割线可以重写RecyclerView.ItemDecoration 项目过程中,遇到一个需求:RecycleView顶部有一条灰色的间隔,我想到了给Recy ...
- (最完美)小米平板3的USB调试模式在哪里开启的流程
经常我们使用安卓手机链上电脑的时候,或者使用的有些应用软件比如我们公司营销小组经常使用的应用软件引号精灵,之前的老版本就需要开启usb调试模式下使用,现经常新版本不需要了,如果手机没有开启usb调试模 ...
- 算法:数组中和为s的两个数字
@问题 :题目描述输入一个递增排序的数组和一个数字S,在数组中查找两个数,使得他们如果有多对数字的和等于S,输出两个数的乘积最小的. 输出描述:对应每个测试案例,输出两个数,小的先输出.@思路: 两个 ...
- CentOS 6.2 中文
在虚拟机里面安装好centos6.2之后,默认是英文! 对于命令行操作无所谓啦,但是如果想看界面,就不是很适应! 修改方法如下: 1.用root登录系统,密码为创建虚拟机时候的密码.创建虚 ...
- C语言运行库翻译
这是从Visual C++ 6里面的C语言部分翻译过来. http://files.cnblogs.com/files/sishenzaixian/C运行库.zip
- adb.exe 安卓测试桥的使用
一.android SDK提供了几个工具 (在SDK下build-tools目录下的工具) dx.bat ----------->把java编译器编译生成的.class 文件 ,变成一个文件,让 ...
- 阿里云上的Centos 7.6的一次Nginx+Mysql+PHP7.3 部署
阿里云申请了一台服务器 Centos 7.6,每次安装都要上网找一大堆教程,因为不熟悉,因为总是忘记. 所以,有时间的时候,还是记录下自己的学习过程,有助于下次的问题解决. 我先总结下: 1)安装VS ...
- 二叉搜索树的最近公共祖先的golang实现
给定一个二叉搜索树, 找到该树中两个指定节点的最近公共祖先. 百度百科中最近公共祖先的定义为:“对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x 是 p.q 的祖先且 x ...
- django-debug-toolbar使用指南
好久没发新博客,凑个数... django-debug-toolbar 介绍 django-debug-toolbar 是一组可配置的面板,可显示有关当前请求/响应的各种调试信息,并在单击时显示有关面 ...