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))
另见
我正在研究聚类的散点图。
使用 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))
另见