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

Posted

技术标签:

【中文标题】是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?【英文标题】:Is it possible to Cluster Non-float data in KMeans in Python(Scikit-Learn)? 【发布时间】:2017-05-03 00:42:12 【问题描述】:

我正在尝试将 KMeans(Scikit-learn) 应用于以下提到的数据。 .

我已经看过足够多的例子,其中 Float64 值显示在集群中。我想知道的是是否可以在 df[[Description ]] 列上进行聚类,将 x 和 y 轴作为经度和纬度。

我的代码如下所示。

from sklearn.cluster import KMeans
import matplotlib.pyplot as plt
import numpy as np
import matplotlib
from sklearn.preprocessing import LabelEncoder
import pandas as pd
matplotlib.style.use('ggplot')

df = pd.read_csv('df.csv')

encoder =LabelEncoder()
Longitude = encoder.fit_transform(df.Longitude)
Latitude= df[df.columns[19]].values #(latitude)

x=np.array([Longitude, Latitude]).T

est = KMeans(3)

est.fit(df[['Longitude', 'Latitude', 'Description']])

但我在这一行得到的错误是

----------------------------------- ---------------------------- ValueError Traceback(最近一次调用 最后)在() ----> 1 est.fit(df[['Longitude', 'Latitude', 'Description']])

c:\users\magiri\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\cluster\k_means_.py 适合(自我,X,y) 第878章 第879章 --> 880 X = self._check_fit_data(X) 881 第882章

c:\users\magiri\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\cluster\k_means_.py 在 _check_fit_data(self, X) 第852章 853 """验证给定的样本数大于k""" --> 854 X = check_array(X, accept_sparse='csr', dtype=[np.float64, np.float32]) 855 如果 X.shape[0] = n_clusters=%d" % (

c:\users\magiri\appdata\local\programs\python\python35-32\lib\site-packages\sklearn\utils\validation.py 在 check_array(array, accept_sparse, dtype, order, copy, force_all_finite,ensure_2d,allow_nd,ensure_min_samples, ensure_min_features、warn_on_dtype、估计器) 第380章 381 其他: --> 382 数组 = np.array(数组,dtype=dtype,order=order,copy=copy) 383 384 如果确保_2d:

ValueError: 无法将字符串转换为浮点数:'GAME/DICE'

所以,我想知道的是 df.Description 集群参考经度和纬度。我知道描述列有字符串值,这就是我收到错误的原因。无论如何我可以避免这个错误并且可以看到描述列的聚类。

【问题讨论】:

如果您有结构化数据,您可能想使用其他支持precomputed 指标的聚类算法,然后计算您的指标矩阵并将其传递。 【参考方案1】:

K-mean 算法仅适用于数值数据。您可以将OneHotEncoder 应用于您的“描述”和“位置描述”字段以将其转换为单热编码表示。如果您的描述有一些使用CountVectorizer 和自定义标记器的分层值也值得尝试。

为了确保纬度/经度不超过欧几里得距离中的其他字段,您可以在 K-means 之前对您的数据应用 StandardScaler

【讨论】:

谢谢。因为,它不能聚类除数字数据之外的任何东西。 K-means 对我来说可能不是正确的方法。 @ManeetGiri 所有聚类算法都适用于数值数据。如果您有文本数据,您可以使用 LabelEncoder(如果您的类别数量有限)或 CountVectorizer(对于一般文本)将其转换为数字数组,然后可以将其提供给 K-means (或任何其他聚类算法)。 请注意,LabelEncoder 不应该与输入一起使用 (X)。它旨在仅处理输出 (y)。 @adrin 是的,谢谢,这是一个非常古老的答案。编辑更正。【参考方案2】:

我已成功使用 kmodes 和 kprototypes 对分类数据进行聚类。这里有一个 python 实现:https://github.com/nicodv/kmodes。 Kmodes 允许对分类数据进行聚类,而 kprototypes 对分类数据和数值数据(kmeans 和 kmmodes 的混合)进行聚类。来自 github 页面的示例用法

import numpy as np
from kmodes.kmodes import KModes

# random categorical data
data = np.random.choice(20, (100, 10))

km = KModes(n_clusters=4, init='Huang', n_init=5, verbose=1)

clusters = km.fit_predict(data)

# Print the cluster centroids
print(km.cluster_centroids_)

Kmodes 只是基于点之间的常见类别进行聚类。 kprototypes 距离度量的简化总结是

distance = np.sum((a_num - b_num) ** 2) + gamma * np.sum(a_cat != b_cat)

其中a_numb_num是两个点的数值,a_catb_cat是分类值。 gamma 是分类差异成本与数值距离的加权。默认值为数值特征标准差的一半(如果预先对数值特征进行归一化,则为 =0.5)。

【讨论】:

以上是关于是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章

scikit-learn 中的不平衡

Scikit-learn 是不是发布了 python GIL?

Python scikit-learn 到 JSON

如何在 python Scikit-learn 中获得凝聚聚类“质心”

如何在 Python scikit-learn 中输出随机森林中每棵树的回归预测?

在 scikit-learn 中使用 python 生成器 [关闭]