我正在研究群集的散点图。
使用sklearn.cluster.KMeans,我得到的列表的长度与2D矩阵X的长度相同...
运行
k = 5
df = pd.read_csv('data_latlong.csv')
lat = df['Lat'].values
long = df['Long'].values
X = np.matrix(list(zip(lat, long)))
kmeans = KMeans(n_clusters=k).fit(X)
plt.figure(figsize=(10, 10))
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_)
plt.title("n = 5")
plt.show()
给我以下ValueError:
ValueError:'c'参数包含3909个元素,不能与大小为3909的'x',大小为3909的'y'一起使用。
有人建议如何处理吗?
谢谢!
解决方案-以正确的方式准备X:
代替
X = np.matrix(list(zip(lat, long)))
我用过
X = np.array([lat, long]).T
.T
用于移调(而不是使用zip()
)-然后我得到了X[:, 0]
和X[:, 1]
正确的形状!
答案 0 :(得分:0)
TL; DR:尝试c=kmeans.labels_.reshape(kmeans.labels_.shape[0])
。这会将标签从(3909,1)数组转换为(3909,)向量。
使用sklearn“ iris”数据集,您所做的工作对我有用:
from sklearn import datasets
from sklearn.cluster import KMeans
from matplotlib import pyplot as plt
irises = datasets.load_iris()
X = irises['data']
clust = KMeans(n_clusters=3).fit(X)
plt.figure(figsize=(10, 10))
plt.scatter(X[:, 0], X[:, 1], c=clust.labels_)
print(X.shape) # (150, 4)
print(clust.labels_.shape) # (150,)
请注意,我的clust.labels_
是一个(150,)向量。相反,如果我将其重塑为(150,1)并尝试传递该值,则会收到与您相同的错误:
c_bad = clust.labels_.reshape((150,1))
plt.scatter(X[:, 0], X[:, 1], c=c_bad) # fails
因此,我认为我们有不同版本的sklearn,其中我的标签放置在向量中,而你的标签放置在数组中。解决方案是采用相反的方法,并尝试将标签的形状从数组重塑为向量:
plt.scatter(X[:, 0], X[:, 1], c=kmeans.labels_.reshape(3909))
另请参见