Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python KMeans集群赢得';t在超过4列的数据帧上工作_Python_Pandas_Numpy_Dataframe_K Means - Fatal编程技术网

Python KMeans集群赢得';t在超过4列的数据帧上工作

Python KMeans集群赢得';t在超过4列的数据帧上工作,python,pandas,numpy,dataframe,k-means,Python,Pandas,Numpy,Dataframe,K Means,我在这里问了一个类似的问题:我得到了一些有价值的回答。但是,我没有成功地让KMeans集群在一个超过4列的数据帧上工作 所讨论的数据帧有5列,如下所示: col1,col2,col3,col4,col5 0.54,0.68,0.46,0.98,0.15 0.52,0.44,0.19,0.29,0.44 1.27,1.15,1.32,0.60,0.14 0.88,0.79,0.63,0.58,0.18 1.39,1.15,1.32,0.41,0.44 0.86,0.80,0.65,0.65,0.1

我在这里问了一个类似的问题:我得到了一些有价值的回答。但是,我没有成功地让KMeans集群在一个超过4列的数据帧上工作

所讨论的数据帧有5列,如下所示:

col1,col2,col3,col4,col5
0.54,0.68,0.46,0.98,0.15
0.52,0.44,0.19,0.29,0.44
1.27,1.15,1.32,0.60,0.14
0.88,0.79,0.63,0.58,0.18
1.39,1.15,1.32,0.41,0.44
0.86,0.80,0.65,0.65,0.11
1.68,1.99,3.97,0.16,0.55
0.78,0.63,0.40,0.36,0.10
2.95,2.66,7.11,0.18,0.15
1.44,1.33,1.79,0.24,0.22
我有一个简单的KMeans集群python代码,我尝试将其应用于5列数据框架,如下所示

from numpy import unique
from numpy import where
from sklearn.cluster import KMeans
from matplotlib import pyplot
import pandas as pd
import numpy as np

df = pd.read_csv('data.csv')

X = np.array(df)

model = KMeans(n_clusters=5)
model.fit(X)
yhat = model.predict(X)
clusters = unique(yhat)
for cluster in clusters:
    row_ix = where(yhat == cluster)
    pyplot.scatter(X[row_ix, 0], X[row_ix, 1], X[row_ix, 2], X[row_ix, 3], X[row_ix, 4])
pyplot.show()
当我运行代码时,它会抱怨行
pyplot.scatter(X[row_ix,0],X[row_ix,1],X[row_ix,2],X[row_ix,3],X[row_ix,4]
),并显示错误消息“ValueError:无法识别的标记样式[[0.14 0.44 0.22]”。但是,如果我从数据帧(即col5)中删除第5列,并从代码中删除X[row_ix,4],则集群可以工作

我需要做什么才能让KMeans在我的示例数据帧上工作

[更新:一次2或3维

在上一篇文章中,有人建议我可以通过使用下面的函数一次表示2或3个维度来拆分任务。但是,该函数不会产生预期的集群输出(请参见附件output.png)


如何修复上述函数以获得集群输出。

您的KMeans可以工作,但您希望显示结果的方式不正确。 如果查看matplotlib scatter function()的文档,您将看到该函数的前四个参数可以接受类似的数组,而第五个参数只接受“MarkerStyle”。这就是为什么只有在添加第五个参数时才会出现错误。 实际上,您正在尝试在二维平面中绘制一个5维数据集,如果事先不进行降维,这是不可能的。
PCA或PLSDA可能是减少数据集维数的一个很好的选择。

如其他答案和评论中所述,您无法将所有5个轴绘制在一起。一种方法是使用降维(如PCA)将其降维为2维并绘制:

import numpy as np
from sklearn.cluster import KMeans
from matplotlib import pyplot
import pandas as pd
from sklearn.decomposition import PCA

df = pd.read_csv('test.csv')

model = KMeans(n_clusters=5)
model.fit(df)
yhat = model.predict(df)
clusters = np.unique(yhat)

dims = PCA(n_components=2).fit_transform(X)
dims = pd.DataFrame(dims,columns=['PC1','PC2'])

fig,ax = plt.subplots(1,1) 
for cluster in clusters:
    ix = yhat == cluster
    ax.scatter(x=dims.loc[ix,'PC1'],y=dims.loc[ix,'PC2'],label=cluster)
ax.legend()

或者您确实使用seaborn并可视化所有变量,如果您只有5个变量,这是可以的:

import seaborn as sns
df['cluster'] = yhat
sns.pairplot(data=df,hue='cluster',diag_kind=None)

这是matplotlib的问题,而不是集群的问题。。您正在将一个numpy数组传递到应该传递标记样式的位置的
scatter()
。您试图用上述代码实现什么?scatter plot只接受plot 2d,但在您的代码中,你给的是错误格式的数据。非常感谢。请看更新的问题。谢谢。我已经更新了这个问题,并包含了以前的建议,一次考虑2个维度。然而,我很难让它产生预期的集群。关于如何改进建议的函数以使其正确工作,您有什么想法吗?我正在尝试避免PCA,因为我理解它会导致信息丢失。当您必须降低维度时,您无法避免信息丢失。谢谢@StupidWolf。我也会试试这个。
import seaborn as sns
df['cluster'] = yhat
sns.pairplot(data=df,hue='cluster',diag_kind=None)