我从这里获取数据,并想用这些数据进行多维缩放。数据如下所示:
特别是,我想在 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)



