是否可以在 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_num
和b_num
是两个点的数值,a_cat
和b_cat
是分类值。 gamma
是分类差异成本与数值距离的加权。默认值为数值特征标准差的一半(如果预先对数值特征进行归一化,则为 =0.5)。
【讨论】:
以上是关于是否可以在 Python(Scikit-Learn)中对 KMeans 中的非浮点数据进行聚类?的主要内容,如果未能解决你的问题,请参考以下文章
Scikit-learn 是不是发布了 python GIL?
如何在 python Scikit-learn 中获得凝聚聚类“质心”