plt.scatter(): ValueError 因为 'c' 参数

plt.scatter(): ValueError because of 'c' argument

我正在研究聚类的散点图。
使用 sklearn.cluster.KMeans 我得到一个与我的二维矩阵 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]!

的正确形状

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))

另见