数据降维-MDS 算法

news2024/11/20 7:26:10

数据降维-MDS 算法

文章目录

  • 数据降维-MDS 算法
    • 算法概述
    • 算法步骤
    • 算法证明
    • 代码
    • 参考

算法概述

MDS的初衷是将图结构中的距离在空间的一种表示

例如,已知几个城市的距离,但是不知道城市的坐标,那么MDS就能通过距离矩阵转换成空间坐标向量来近似描述距离。更重要地是,MDS可以更广泛地应用于任意类型的数据实体相似度或距离描述在低维空间的表示

多维尺度分析MDS的基本思想:

用低维空间 R k R^k Rk ( k < n ) (k<n) (k<n)的n个点去重新标度高维空间 R n R^n Rn的n个实体间的距离或者相似度。将高维空间的n个研究对象简化到低维空间处理,并且保留高维空间中的n个对象的较高的相似度。

算法步骤

  • 输入D
  • D的所有元素取原值的平方,得距离平方矩阵 Δ \Delta Δ
  • 构造单位矩阵 E E E和全1矩阵 U U U
  • 计算点积矩阵 S = − 1 / 2 ( E − U / n ) Δ ( E − U / n ) S=-1/2 (E - U/n)\Delta (E - U/n) S=1/2(EU/n)Δ(EU/n)
  • 对S进行特征分解 S = Q ∑ 2 Q T S = Q\sum^2 Q^T S=Q2QT
  • 选取前k个最大的特征值的根号值 ∑ k \sum k k和正交特征向量 Q k Qk Qk
  • 降维表示 D k = ∑ k Q k T Dk = \sum_k Q^T_k Dk=kQkT

算法证明

M D S MDS MDS 是一种基于距离度量的数据降维方法,要求将高维度数据$X \ \in R^(d \times m) 转化为低维数据 转化为低维数据 转化为低维数据Z \in R^{(d \times m)} $后,样本点间相对位置关系不变。所以将目标函数(也可以理解为相似度):
a i m = ∑ m i n ( ∣ ∣ z i − z j ∣ ∣ − d i j ) 2 aim = \sum_{min} (||z_{i} - z_{j}|| - d_{ij})^2 aim=min(∣∣zizj∣∣dij)2
在上式子中,低维样本 z i z_i zi z j z_j zj之间的欧式距离。 d i j d_{ij} dij表示高维样本 X i X_i Xi X j X_j Xj之间的距离,距离的度量方法任意但需要满足以下三个条件:

  1. d i i = 0 d_{ii} = 0 dii=0
  2. d i j = d j i d_{ij} = d_{ji} dij=dji
  3. d i k + d j k ≥ d i j d_{ik} + d_{jk} \geq d_{ij} dik+djkdij

如何通过上面的目标函数求解出 Z Z Z

直接求解出Z比较困难,转而求 B = Z T Z B = Z^TZ B=ZTZ

Z ∈ R d ′ × m Z \in R^{d' \times m} ZRd×m

B ∈ R m × m B \in R^{m\times m} BRm×m

这里B是一个实对称矩阵,如果能够求得B,那么:
B = U Λ U T = ( Λ 1 2 U T ) T ( Λ 1 2 U T ) = Z T Z B = U \Lambda U^T = (\Lambda^{\frac{1}{2}} U^T)^T (\Lambda^{\frac{1}{2}U^T}) = Z^TZ B=UΛUT=(Λ21UT)T(Λ21UT)=ZTZ
其中 U U U是特征向量, Λ \Lambda Λ是特征值。

在对所求目标进行转化后,并求出以下等式

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ta1VG44u-1673537035590)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%871.png)]

下面我们来对每一步等式做证明:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NJVGa3ha-1673537035591)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%872.png)]

在这里插入图片描述

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-RnFnnRJD-1673537035593)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%874.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-NAQacDSo-1673537035594)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%875.png)]

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-JMduMlAV-1673537035594)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%876.png)]

证明得到上述的等式后,我们可以根据多项式进行求解B:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uk9gQNyx-1673537038030)(null)]

image-20230112231136146

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ULzWsHbC-1673537035597)(https://raw.githubusercontent.com/yuyuyu258963/pic-go-picStore/main/%E5%9B%BE%E7%89%877.png)]

到这里已经求得了特征值和特征向量。后面要做的就是对求取的Z做SVD分解,这部分的原理可以参考SVD 理解使用。

代码

import numpy as np
import matplotlib.pyplot as plt
from sklearn.manifold import MDS

def getData():
  data = np.loadtxt("./iris.data", dtype="str", delimiter=",")
  arr = data[:,:-1]
  label = data[:,-1]
  arr = np.float32(arr)
  return arr, label

def cal_distance(vecs, type = 0):
  N, m = vecs.shape
  dist = np.zeros([N, N])
  for i in range(N):
    for j in range(N):
      # 计算汉明距离
      # dist[i, j] = np.sum( np.abs(vecs[i] - vecs[j]))
      # 计算欧式距离
      dist[i, j] = np.sqrt(np.sum( (vecs[i] - vecs[j]) ** 2))
  return dist

def my_mds(D, dims):
  m = len(D)
  D = D ** 2
  t2 = np.sum(D, axis=1, keepdims=True) / m
  t3 = np.sum(D, axis=0, keepdims=True) / m
  t4 = np.sum(D) / m**2
  B =   - (D - t2 - t3 + t4) / 2
  eig_val, eig_vector  = np.linalg.eig(B)
  index_  = np.argsort(-eig_val)[:dims]
  simple_vector = eig_vector[:,index_]
  simple_val = eig_val[index_]
  reduced_vector = simple_vector *  simple_val ** 0.5
  return reduced_vector

def draw(data_2d, labels):
  unque_labs = np.unique(labels)
  unque_labs = unque_labs.tolist()
  colors = [plt.cm.Spectral(each)
    for each in np.linspace(0, 1,len(unque_labs))]
  nodes_color = [colors[unque_labs.index(i)] for i in labels]
  plt.scatter(data_2d[:,0], data_2d[:,1], c=nodes_color)

if __name__ == '__main__':
  arr, label = getData()
  dist = cal_distance(arr)
  data_2d = my_mds(dist, 2)
  draw(data_2d, label)
  plt.show()
  plt.savefig("./欧式距离.png")

其中用到的数据集是:
在这里插入图片描述
运行结果:
请添加图片描述

参考

  • https://blog.csdn.net/ZHT2016iot/article/details/115772127
  • 矩阵分解
  • 矩阵特征值和特征向量

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159403.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

mock的基本使用

mock的基本使用官网文档mockjs是用来模拟产生一些虚拟的数据&#xff0c;可以让前端在后端接口还没有开发出来时独立开发&#xff0c;mockjs可以拦截ajax请求&#xff0c;返回设定好的数据。注意&#xff1a;mock&#xff08;模拟数据&#xff09;数据需要使用到mockjs模块&…

如何用更好的创意引发卖家和消费者的共鸣?

我们知道&#xff0c;近年来国家的政策越来越向创新型的企业发展倾斜&#xff0c;因此各行各业都响应政策&#xff0c;做创新型高质量发展&#xff0c;跨境电商作为疫情下应运而生的产物&#xff0c;其本身就带有创新型发展的概念&#xff0c;同时&#xff0c;面对着2022年许多…

Java程序的运行过程(执行流程)分析

万事知其然&#xff0c;要知其所以然&#xff0c;所以本节带大家来详细了解一下 Java 程序的执行过程。从《使用记事本编写运行Java程序》一节的案例可以看出&#xff0c;Java 程序的运行必须经过编写、编译和运行 3 个步骤。编写&#xff1a;是指在 Java 开发环境中进行程序代…

回溯法--图的m着色问题

问题描述给定无向连通图和m种不同的颜色&#xff0c;用这些颜色为图G的各个顶点着色&#xff0c;每个顶点有一种颜色是否有一种着色方法&#xff1f;使得图G中每条边的两个顶点有不同的颜色这个问题就是图的m可着色判定问题色数&#xff1a;如果有一个图最少需要m种颜色才能使得…

国医大师体验照“镜”测“三高”,深兰科技AI产品秒出健康报告

“请把脸缓慢往左转。” “请将脸回正&#xff0c;请将脸缓慢往右转。” “请放松心情&#xff0c;期待3D面部的生成结果。” 跟随提示音&#xff0c;刚刚被聘任为深兰科技科学院专家委员会医学专家的国医大师严世芸教授饶有兴致地体验着深兰科技AI生理健康检测仪-扁鹊。等待一…

【位图】面对海量数据,如何压缩空间?定位数据?

目录 一、腾讯面试题 二、解决办法——位图 2.1、那么什么是位图&#xff1f; 三、位图的模拟实现 3.1、位图的构造 3.2、存放数据 3.3、检测数据是否存在 3.4、设置某个数据的对应位为0 四、位图模拟代码&#xff08;完整&#xff09; 一、腾讯面试题 给40亿个不重复…

Authing 入选 2022 中国产业数字化领军企业

1 月 10 日&#xff0c;产业互联网第一媒体产业家联合数字化报、IT 桔子正式发布了【中国产业数字化领军企业榜单】&#xff0c;评选出 16 个互联网赛道中的领军企业。作为身份认证与访问管理领跑者&#xff0c;Authing 凭借在 SaaS 领域的技术创新与产品优势&#xff0c;成功入…

6.4、域名系统 DNS

1、DNS的作用 如下所示&#xff0c;因特网中的某台主机要访问某台 Web 服务器 只需在用户主机中运行某个游览器软件&#xff0c;在其地址栏中输入要访问的 Web 服务器的域名&#xff0c;并按下回车键即可访问到 Web 服务器所提供的内容 我们在用户主机中使用 ping 命令测试 We…

【小练】day1

day1 选择题 1. 以下for循环的执行次数是&#xff08;&#xff09;。 for(x0,y0;(y123)&&(x<4););A 是无限循环 B 循环次数不定 C 4 D 3 本题主要考察for for(初始化部分&#xff1b;条件判断部分&#xff1b;调整部分) 初始化部分只执行一次。 &&&a…

大数据分析案例-基于多元线性回归算法构建广告投放收益模型

&#x1f935;‍♂️ 个人主页&#xff1a;艾派森的个人主页 ✍&#x1f3fb;作者简介&#xff1a;Python学习者 &#x1f40b; 希望大家多多支持&#xff0c;我们一起进步&#xff01;&#x1f604; 如果文章对你有帮助的话&#xff0c; 欢迎评论 &#x1f4ac;点赞&#x1f4…

走好这三步,不再掉进云上安全的沟里!

序言一直以来&#xff0c;公有云安全是横亘在广大用户面前的一道鸿沟。云安全&#xff08;Cloud Security&#xff09;是指用于控制云计算的安全性、合规性和其他使用风险的过程、机制和服务。公有云提供商们都强调安全是其最高优先级工作&#xff0c;动辄就发布上百页的云上安…

谁还没个技术呢~PYTHON制作观看软件

前言 大家早好、午好、晚好吖 ❤ ~ 以前没钱时&#xff0c;我是这样嘚&#xff1a; 朋友说好一生一起走&#xff0c;账号先借我来耍耍 现在没钱时&#xff0c;我是这样嘚&#xff1a; 涨价就涨价&#xff0c;怎么还搞搞限制账号登录这一出呢~ 这年头~谁还没点技术不是,看我…

复盘一下slam中常用的几种点云类型

使用livox雷达常涉及至少3种点云格式&#xff0c;一个是livox官方定义的custom格式&#xff0c;另外两个就是激光、视觉常用的pcl类型和ros类型。之前总结过Livox雷达驱动程序发布点云格式CustomMsg和pcl::PointXYZI、pcl::PointXYZINormal之间的关系&#xff0c;现在再来复盘一…

【TypeScript】TS进阶-泛型(八)

&#x1f431;个人主页&#xff1a;不叫猫先生 &#x1f64b;‍♂️作者简介&#xff1a;前端领域新星创作者、阿里云专家博主&#xff0c;专注于前端各领域技术&#xff0c;共同学习共同进步&#xff0c;一起加油呀&#xff01; &#x1f4ab;系列专栏&#xff1a;vue3从入门到…

【Linux】工具使用

文章目录一、Linux 软件包管理器 yum二、 Linux开发工具&#xff08;1&#xff09; Linux编辑器-vim使用&#xff08;2&#xff09;简单vim配置三、Linux编译器-gcc/g使用四、动态库和静态库五、Linux调试器-gdb使用六、Linux项目自动化构建工具-make/Makefile(1)make/Makefile…

如何才能精通 Redis?

为什么我要讲 Redis&#xff1f; 已经出过这么多主题的书籍和课程了&#xff0c;这次我为什么要选择 Redis 这个主题呢&#xff1f; 那自然是因为 Redis 是我们实际开发中不可或缺的组件之一&#xff0c;也是目前全球最流行的 KV 数据库。相信小伙伴们在工作中也会频繁接触到…

【入门篇】2 # 复杂度分析(下):浅析最好、最坏、平均、均摊时间复杂度

说明 【数据结构与算法之美】专栏学习笔记。 为什么引入这些时间复杂度 先看下面代码 // n 表示数组 array 的长度 int find(int[] array, int n, int x) {int i 0;int pos -1;for (; i < n; i) {if (array[i] x) {pos i;break;}}return pos; }上面代码中如果没有 …

Redis序列化和java存入Redis数据序列化反序列化总结

背景&#xff1a; 最近考虑java代码数据在保存redis时&#xff0c;通常要配置序列化&#xff0c;才能保存到redis中&#xff0c;然而我们知道Redis中也有序列化&#xff08;RDB和AoF两种形式&#xff09;&#xff0c;有点混淆总结一下。 java中数据保存redis过程序列化的原因是…

图解:什么是二叉查找树?

文章目录1. 二叉查找树的概念2. 二叉查找树的实现&#x1f351; 定义节点&#x1f351; 函数接口总览&#x1f351; 构造函数&#x1f351; 拷贝构造&#x1f351; 赋值重载&#x1f351; 析构函数&#x1f351; 查找操作&#x1f345; 动图演示&#x1f345; 非递归实现&#…

【机器学习】线性回归(实战)

线性回归&#xff08;实战&#xff09; 目录一、准备工作&#xff08;设置 jupyter notebook 中的字体大小样式等&#xff09;二、构建实验所需的数据&#xff08;以下实验将基于此数据&#xff09;三、实现线性回归的两种方式方法一&#xff1a;通过直接求解得到拟合方程参数&…