多维缩放为不同的种子产生不同的结果

数据挖掘 Python 降维 地理空间
2021-10-14 21:35:55

我从这里获取数据,并想用这些数据进行多维缩放。数据如下所示:

在此处输入图像描述

特别是,我想在 2D 空间中绘制城市,并查看它与地理地图中的真实位置的匹配程度,仅从它们彼此相距多远的信息来看,没有任何明确的纬度和经度信息。这是我的代码:

import pandas as pd
import numpy as np
from sklearn import manifold
import matplotlib.pyplot as plt

data = pd.read_csv("european_city_distances.csv", index_col='Cities')

mds = manifold.MDS(n_components=2, dissimilarity="precomputed", random_state=6)
results = mds.fit(data.values)

cities = data.columns
coords = results.embedding_

fig = plt.figure(figsize=(12,10))

plt.subplots_adjust(bottom = 0.1)
plt.scatter(coords[:, 0], coords[:, 1])

for label, x, y in zip(cities, coords[:, 0], coords[:, 1]):
    plt.annotate(
        label,
        xy = (x, y), 
        xytext = (-20, 20),
        textcoords = 'offset points'
    )
plt.show()

在此处输入图像描述

大多数城市似乎都在相对于彼此正确的大致位置,除了一些违规行为 - 都柏林离伦敦太远,伊斯坦布尔在错误的位置等。但是,如果我给出不同的random_state值,它会产生不同的“地图”例如,random_state=1生成以下地图,其中许多城市相对于其他城市似乎不在正确的大致位置附近:

在此处输入图像描述

我不明白的是,降维方法不应该与它们相关联的随机性,因此不应该为不同的种子给出不同的结果。但它在这里; 那是什么意思?

sklearn.manifold.MDS函数的文档状态random_state是“用于初始化中心的生成器”。所以,特别是,我想我要问的是,无论我们选择什么初始化中心,它们不都应该导致一个独特的结果吗?


通过给出以下超参数值,我得到了一个更“准确”的地图(至少在我看来):

mds = manifold.MDS(n_components=2, dissimilarity="euclidean", n_init=100, max_iter=1000, random_state=1)

在此处输入图像描述

2个回答

我认为您的问题的答案是了解欧几里德距离矩阵太多而无法揭示信息。基本上有很多潜在的约束需要验证(2n 个变量的 n*(n-1)/2 个约束)。

在人类可接受的时间内解决此类问题的一种方法是考虑“物理”方法。基本上,您在数据点之间放置微小的弹簧和其他力并解决物理系统问题。这就是为什么您在绘制图表时通常会看到图表“傻笑”的原因。你可以猜到,这些方法很大程度上依赖于空间点的初始化。这就是为什么在通常的技术中有一个“随机”组件。

晚上好,

上面的内容可以称为绕轴旋转。需要注意的是,降维后的坐标不一定有含义。MDS 所做的是重塑数据,同时保持观察之间的距离(在您的情况下为欧几里德距离)。

把它放在上下文中,看看前两张图,找到马德里和都柏林。您会看到它们在图二上的位置与图一相反。但是在数据中你会看到两点之间的实际距离是一样的。

这样想:你在一个房间里有两个物体:一把椅子和一张桌子,它们彼此相距 1 米。如果您站在靠近椅子的位置,那么对您而言,桌子离您更远。另一方面,如果你站在靠近桌子的地方,那么椅子对你来说就更远了。但它们之间的距离始终是1米。

因此,坐标系代表了您如何看待低维数据点的位置,同时它保留了原始高维数据集的数据点之间的欧几里得距离。

如果您有兴趣了解不同的降维技术如何处理此数据,您也可以尝试使用PCAt-SNE对其进行缩放。

希望这可以帮助!