统计每组K-means聚类的数据点

我有一个关于真假钞票的波形数据集,包含两个特征,分别是:

  1. X轴:波形变换图像的方差
  2. Y轴:波形变换图像的偏度

我对这个数据集运行了K-means算法,以识别出数据中的两个聚类,分别对应真钞和假钞。

现在我有三个问题:

  1. 如何统计每个聚类中的数据点数量?
  2. 如何根据数据点所属的聚类设置其颜色?
  3. 如果数据中没有其他特征,如何判断数据点是真钞还是假钞?我知道数据集中有一个“class”特征,显示1和2分别代表真钞和假钞,但没有这个“class”特征我能识别吗?

我的代码:

import matplotlib.pyplot as pltimport numpy as npimport matplotlib.patches as patchesimport pandas as pdfrom sklearn.cluster import KMeansimport matplotlib.patches as patchesdata = pd.read_csv('Banknote-authentication-dataset-all.csv')V1 = data['V1']V2 = data['V2']bn_class = data['Class']V1_min = np.min(V1)V1_max = np.max(V1)V2_min = np.min(V2)V2_max = np.max(V2)normed_V1 = (V1 - V1_min)/(V1_max - V1_min)normed_V2 = (V2 - V2_min)/(V2_max - V2_min)V1_mean = normed_V1.mean()V2_mean = normed_V2.mean()V1_std_dev = np.std(normed_V1)V2_std_dev = np.std(normed_V2)ellipse = patches.Ellipse([V1_mean, V2_mean], V1_std_dev*2, V2_std_dev*2, alpha=0.4)V1_V2 = np.column_stack((normed_V1, normed_V2))km_res = KMeans(n_clusters=2).fit(V1_V2)clusters = km_res.cluster_centers_plt.xlabel('Variance of Wavelet Transformed image')plt.ylabel('Skewness of Wavelet Transformed image')scatter = plt.scatter(normed_V1,normed_V2, s=10, c=bn_class, cmap='coolwarm')#plt.scatter(V1_std_dev, V2_std_dev,s=400, Alpha=0.5)plt.scatter(V1_mean, V2_mean, s=400, Alpha=0.8, c='lightblue')plt.scatter(clusters[:,0], clusters[:,1],s=3000,c='orange', Alpha=0.8)unique = list(set(bn_class))plt.text(1.1, 0, 'Kmeans cluster centers', bbox=dict(facecolor='orange'))plt.text(1.1, 0.11, 'Arithmetic Mean', bbox=dict(facecolor='lightblue'))plt.text(1.1, 0.33, 'Class 1 - Genuine Notes',color='white', bbox=dict(facecolor='blue'))plt.text(1.1, 0.22, 'Class 2 - Forged Notes', bbox=dict(facecolor='red'))plt.savefig('figure.png',bbox_inches='tight')plt.show()

附录图像以便更清晰查看

Code

enter image description here


回答:

  1. 如何统计每个聚类的数据点数量

你可以很容易地通过使用fit_predict代替fit,或者在拟合数据后调用predict来实现这一点。

这是一个工作示例:

kM = KMeans(...).fit_predict(V1_V2)labels = kM.labels_clusterCount = np.bincount(labels)

clusterCount现在将包含每个聚类中点数的信息。你同样可以使用fit然后predict来实现,但这样应该更有效率:

kM = KMeans(...).fit(V1_V2)labels = kM.predict(V1_V2)clusterCount = np.bincount(labels)
  1. 要设置颜色,使用kM.labels_kM.predict()的输出作为着色索引。
labels = kM.predict(V1_V2)plt.scatter(normed_V1, normed_V2, s=10, c=labels, cmap='coolwarm') # 代替 c=bn_class
  1. 对于一个新的数据点,请注意你使用的KMeans很好地分离了这两个类的大部分。这种可分性意味着你实际上可以使用你的KMeans聚类作为预测器。只需使用predict
predictedClass = KMeans.predict(newDataPoint)

其中一个聚类被分配给它大多数所属的类别。或者甚至可以是一个百分比的概率。

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注