scikit learn (python) 中的 Meanshift 不理解数据类型

Posted

技术标签:

【中文标题】scikit learn (python) 中的 Meanshift 不理解数据类型【英文标题】:Meanshift in scikit learn (python) doesn't understand datatype 【发布时间】:2013-10-02 12:56:06 【问题描述】:

我有一个包含 7265 个样本132 个特征的数据集。 我想使用 scikit learn 的 meanshift 算法,但我遇到了这个错误:

Traceback (most recent call last):
  File "C:\Users\OJ\Dropbox\Dt\Code\visual\facetest\facetracker_video.py", line 130, in <module>
    labels, centers = getClusters(data,clusters)
  File "C:\Users\OJ\Dropbox\Dt\Code\visual\facetest\facetracker_video.py", line 34, in getClusters
    ms.fit(np.array(dataarray))
  File "C:\python2.7\lib\site-packages\sklearn\cluster\mean_shift_.py", line 280, in fit
    cluster_all=self.cluster_all)
  File "C:\python2.7\lib\site-packages\sklearn\cluster\mean_shift_.py", line 137, in mean_shift
    nbrs = NearestNeighbors(radius=bandwidth).fit(sorted_centers)
  File "C:\python2.7\lib\site-packages\sklearn\neighbors\base.py", line 642, in fit
    return self._fit(X)
  File "C:\python2.7\lib\site-packages\sklearn\neighbors\base.py", line 180, in _fit
    raise ValueError("data type not understood")
ValueError: data type not understood

我的代码:

dataarray = np.array(data)
bandwidth = estimate_bandwidth(dataarray, quantile=0.2, n_samples=len(dataarray))
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
ms.fit(dataarray)
labels = ms.labels_
cluster_centers = ms.cluster_centers_

如果我检查我看到的数据变量的数据类型:

print isinstance( dataarray, np.ndarray )
>>> True

带宽为0.925538333061,dataarray.dtypefloat64

我正在使用 scikit learn 0.14.1

我可以与 sci-kit 中的其他算法(尝试过 kmeans 和 dbscan)进行聚类。我做错了什么?


编辑:

数据可以在这里找到: (泡菜格式):http://ojtwist.be/datatocluster.p 和:http://ojtwist.be/datatocluster.npz

【问题讨论】:

什么是dataarray.dtype @larsmans 是 float64 我无法使用当前的 scikit-learn 或 0.13 重现此问题。你用的是哪个版本? 0.14,我看看能不能上传数据。 可以在这里找到pickle格式的数据:ojtwist.be/datatocluster.p 【参考方案1】:

这是 scikit 项目中的一个错误。它记录在here。

在拟合过程中有一个 float -> int 转换,在某些情况下可能会崩溃(通过将种子点放置在 bin 的角落而不是中心)。链接中有一些代码可以解决问题。

如果您不想接触 scikit 代码(并保持您的代码与其他机器之间的兼容性),我建议您在将数据传递给 MeanShift 之前对其进行规范化。

试试这个:

>>>from sklearn import preprocessing
>>>data2 = preprocessing.scale(dataarray)

然后在您的代码中使用 data2。 它对我有用。

如果你不想做任何一个解决方案,这是一个为项目做出贡献的好机会,对解决方案提出拉取请求:)

编辑:您可能希望保留信息以“降低”均值偏移的结果。因此,请使用 StandardScaler 对象,而不是使用函数进行缩放。

祝你好运!

【讨论】:

多么尴尬,我忘记了自己的错误报告:) 大声笑。真的是你:P 我查看了这个问题,但那里提供的解决方案并没有解决我的问题。我现在使用的是 StandardScaler 对象,但这会将所有东西分类在一个集群中,这看起来很奇怪。 我周末去看看。您能否发布一个链接来说明您的实施要点?

以上是关于scikit learn (python) 中的 Meanshift 不理解数据类型的主要内容,如果未能解决你的问题,请参考以下文章

python中的scikit-learn去噪示例

是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?

scikit-learn 中的随机森林解释

python - 如何在python scikit-learn中找到逻辑回归中的正则化参数?

了解python scikit-learn中的文本特征提取TfidfVectorizer

scikit learn (python) 中的 Meanshift 不理解数据类型