python - Numpy、Pandas 和 Sklearn 中的多维缩放拟合(ValueError)

标签 python numpy pandas scikit-learn

我正在尝试使用 sklearn、pandas 和 numpy 进行多维缩放。我使用的数据文件有 10 个数字列,没有缺失值。我正在尝试获取这十维数据并使用 sklearn.manifold 的多维缩放在二维中将其可视化,如下所示:

import numpy as np
import pandas as pd
from sklearn import manifold
from sklearn.metrics import euclidean_distances

seed = np.random.RandomState(seed=3)
data = pd.read_csv('data/big-file.csv')

#  start small dont take all the data, 
#  its about 200k records
subset = data[:10000]
similarities = euclidean_distances(subset)

mds = manifold.MDS(n_components=2, max_iter=3000, eps=1e-9, 
      random_state=seed, dissimilarity="precomputed", n_jobs=1)

pos = mds.fit(similarities).embedding_

但是我得到这个值错误:

Traceback (most recent call last):
  File "demo/mds-demo.py", line 18, in <module>
    pos = mds.fit(similarities).embedding_
  File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 360, in fit
    self.fit_transform(X, init=init)
  File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 395, in fit_transform
eps=self.eps, random_state=self.random_state)
  File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 242, in smacof
eps=eps, random_state=random_state)
  File "/Users/dwilliams/Desktop/Anaconda/lib/python2.7/site-packages/sklearn/manifold/mds.py", line 73, in _smacof_single
raise ValueError("similarities must be symmetric")
ValueError: similarities must be symmetric

我以为 euclidean_distances 返回了一个对称矩阵。我做错了什么,我该如何解决?

最佳答案

我遇到了同样的问题;事实证明,我的数据是一个 np.float32 数组,降低的浮点精度导致距离矩阵不对称。在运行 MDS 之前,我通过将数据转换为 np.float64 解决了这个问题。

这是一个使用随机数据来说明问题的示例:

import numpy as np
from sklearn.manifold import MDS
from sklearn.metrics import euclidean_distances
from sklearn.datasets import make_classification

data, labels = make_classification()
mds = MDS(n_components=2)

similarities = euclidean_distances(data.astype(np.float64))
print np.abs(similarities - similarities.T).max()
# Prints 1.7763568394e-15
mds.fit(data.astype(np.float64))
# Succeeds

similarities = euclidean_distances(data.astype(np.float32))
print np.abs(similarities - similarities.T).max()
# Prints 9.53674e-07
mds.fit(data.astype(np.float32))
# Fails with "ValueError: similarities must be symmetric"

关于python - Numpy、Pandas 和 Sklearn 中的多维缩放拟合(ValueError),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16990996/

相关文章:

python - 属性错误 : module 'PIL' has no attribute Image

python - Tensorflow 中的多标签多类分类器

python - 是什么阻止 np.random.shuffle 重新排列我的数组?

带有 if 语句的 Python Numba jit 函数

python - Pandas - 排序并进入 groupby

Python/Pandas 遍历列

python - 如何通过 ftp 在 python 中下载大文件(带监控和重新连接)?

python - 我希望所有 numpy 数组都强制为二维

python - 线性回归在 Python 中失败,因变量中的值很大

python - 使用并行运行 html2text