当前位置:   article > 正文

Python28-7.3 降维算法之多维缩放MDS

Python28-7.3 降维算法之多维缩放MDS

 

640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

多维尺度分析(Multidimensional Scaling, MDS)是一种用于降维的统计技术,其目标是将高维数据嵌入到低维空间中,同时尽量保持原始数据中点与点之间的距离关系。MDS 被广泛应用于数据可视化、心理学、市场研究等领域。以下是 MDS 的详细介绍:

MDS 的基本思想

MDS 的目标是将高维数据中的点嵌入到低维(通常是二维或三维)空间中,使得在低维空间中点之间的距离尽量接近原始高维空间中点之间的距离。这通过最小化一个损失函数(通常是应力函数)来实现,应力函数衡量的是原始距离和降维后距离之间的不一致性。

MDS 的主要步骤

  1. 计算距离矩阵:首先,计算原始数据点之间的距离矩阵。常用的距离度量有欧氏距离、曼哈顿距离等。

  2. 选择维数:选择目标低维空间的维数,通常为二维或三维,以便于可视化。

  3. 最小化应力函数:通过迭代优化方法,如梯度下降法,最小化应力函数,以找到最优的低维表示。

  4. 输出低维嵌入:将高维数据点映射到低维空间中,并输出结果。

应力函数

应力函数是衡量降维后距离和原始距离之间差异的一个指标。常用的应力函数形式如下:

640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

其中,d_ij是低维空间中点i和j之间的距离,delta_ij是高维空间中点i和j之间的距离。

MDS 的分类

  1. 经典 MDS:也称为 Torgerson-Gower 缩放,直接通过特征值分解进行距离矩阵的降维。

  2. 非度量 MDS:对原始数据中的距离或相似度进行非度量变换,以保留原始数据中的顺序信息,而不是精确的距离值。

MDS 的优缺点

优点

  • 直观易懂,便于解释和可视化。

  • 能够有效地保留高维数据的几何结构。

缺点

  • 对噪声和异常值较敏感。

  • 在数据量较大时计算复杂度较高。

  • 结果可能依赖于初始点的选择和优化过程。

Python 实现 MDS

以下是使用 MDS 对生成的苹果点云数据降维并可视化的示例代码:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.manifold import MDS
  4. import open3as o3d
  5. # 生成模拟的苹果点云数据
  6. def generate_apple_point_cloud(num_points=1000):
  7.     # 半径
  8.     R = 1
  9.     # 随机生成点
  10.     phi = np.random.uniform(0, np.pi, num_points)
  11.     theta = np.random.uniform(02 * np.pi, num_points)
  12.     x = R * np.sin(phi) * np.cos(theta)
  13.     y = R * np.sin(phi) * np.sin(theta)
  14.     z = R * np.cos(phi)
  15.     # 生成苹果的茎
  16.     stem_length = 0.3
  17.     stem_radius = 0.1
  18.     stem_points = np.array([
  19.         [np.random.uniform(-stem_radius, stem_radius),
  20.          np.random.uniform(-stem_radius, stem_radius),
  21.          np.random.uniform(R, R + stem_length)]
  22.         for _ in range(num_points // 10)
  23.     ])
  24.     apple_points = np.vstack((np.column_stack((x, y, z)), stem_points))
  25.     return apple_points
  26. # 生成点云数据
  27. apple_points = generate_apple_point_cloud()
  28. # 可视化原始点云数据
  29. pcd = o3d.geometry.PointCloud()
  30. pcd.points = o3d.utility.Vector3dVector(apple_points)
  31. o3d.visualization.draw_geometries([pcd], window_name="Original Apple Point Cloud")
  32. # 计算点云的距离矩阵
  33. distance_matrix = np.linalg.norm(apple_points[:, np.newaxis, :] - apple_points[np.newaxis, :, :], axis=-1)
  34. # 使用MDS进行降维
  35. mds = MDS(n_components=2, dissimilarity="precomputed"random_state=42)
  36. apple_points_2= mds.fit_transform(distance_matrix)
  37. # 可视化降维后的点云数据
  38. plt.figure(figsize=(107))
  39. plt.scatter(apple_points_2d[:, 0], apple_points_2d[:, 1], s=1)
  40. plt.title('Apple Point Cloud after MDS')
  41. plt.xlabel('Component 1')
  42. plt.ylabel('Component 2')
  43. plt.grid(True)
  44. plt.show()

降维前数据可视化:

640?wx_fmt=gif&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1

MDS 降维后结果(3 维->2 维):

640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

我们再来看一个使用 MDS 对手写数字数据集(64 维)进行降维的示例代码:

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.datasets import load_digits
  4. from sklearn.manifold import MDS
  5. def visualize_2d_points(points_2d, labels):
  6.     """使用Matplotlib可视化二维点云数据"""
  7.     plt.figure(figsize=(108))
  8.     scatter = plt.scatter(points_2d[:, 0], points_2d[:, 1], c=labels, cmap='viridis', s=50)
  9.     plt.legend(handles=scatter.legend_elements()[0], labels=set(labels))
  10.     plt.title('2D MDS Visualization of Digits Dataset')
  11.     plt.xlabel('Dimension 1')
  12.     plt.ylabel('Dimension 2')
  13.     plt.show()
  14. def main():
  15.     # 加载Digits数据集
  16.     digits = load_digits()
  17.     X = digits.data
  18.     y = digits.target
  19.     print("Digits Dataset Shape:", X.shape)
  20.     # 使用MDS进行降维,从多维降到二维
  21.     mds = MDS(n_components=2random_state=42)
  22.     X_2= mds.fit_transform(X)
  23.     print("2D Points (First 5 points):\n", X_2d[:5])
  24.     # 可视化降维后的二维点云
  25.     visualize_2d_points(X_2d, y)
  26. if __name__ == "__main__":
  27.     main()

MDS 将为结果(64 维->2 维):

640?wx_fmt=png&from=appmsg&tp=webp&wxfrom=5&wx_lazy=1&wx_co=1

通过 MDS 降维后,我们可以直观地观察数据的分布和聚类情况。上图中,各类手写数字形成了明显的聚类,表明不同数字之间存在显著的模式和特征差异。例如,某些聚类中心较为紧凑,说明这些数字在特征空间中相似度较高;而有些聚类则相对分散,表明这些数字之间的特征差异更大。这种可视化不仅帮助我们理解手写数字数据集的内在结构,还能够为后续的分类或聚类任务提供有价值的见解。通过观察这些聚类,我们可以进一步优化特征提取和模型选择,从而提升分类算法的准确性和鲁棒性。

以上内容总结自网络,如有帮助欢迎转发,我们下次再见!

本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号