我已经看到了足够多的例子,其中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回溯(最近一次调用)----
C:\用户\magiri\appdata\本地\程序\python\python35-32\lib\site-包\skLearning\集群\k_means_。
C:\用户\magiri\appdata\本地\程序\python\python35-32\lib\site-包\skLearning\集群\k_means_. py在_check_fit_data(自我,X)852 def_check_fit_data(自我,X): 853"""验证给出的样本数大于k""-
c:\users\magiri\appdata\local\programs\python\python35-32\lib\site packages\sklearn\utils\validation。检查数组中的py(数组、接受稀疏、数据类型、顺序、复制、强制所有有限、确保2d、允许nd、确保最小样本、确保最小特征、警告数据类型、估计器)380强制所有有限)381其他:--
ValueError:无法将字符串转换为浮动:“游戏/骰子”
所以,我想知道的是df。描述参考经度和纬度的群集。我知道Description列有字符串值,这就是我得到错误的原因。无论如何,我都可以避免这个错误,并且可以看到描述列的集群。
K-均值算法只适用于数值数据。您可以将LabelEncoder
应用到您的“描述”字段,将其转换为类id。
同样,将LabelEncoder
应用于经度/延迟也不是最佳的,因为这样你就失去了两点在一起有多近的概念。相反,您应该在K-均值之前对数据应用一个Standard Scaler
,以标准化不同字段的相对权重。
我已经成功地使用kmodes和kprototypes对分类数据进行了聚类。这里有一个python实现:https://github.com/nicodv/kmodes.Kmodes允许对分类数据进行聚类,而kprototypes可以对分类数据和数字数据进行聚类(kmeans和Kmodes的混合)。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,如果事先对数字特征进行归一化)。