计算每个 K-means 集群的数据点
Count data points for each K-means cluster
我有一个真实和伪造纸币的小波数据集,具有两个特征:
- X轴:小波变换图像的方差
- Y轴:小波变换图像的偏度
I 运行 在这个数据集上 K-means 识别 2 组数据,基本上是真钞和伪钞。
现在我有3个问题:
- 如何统计每个簇的数据点?
- 如何根据集群设置每个数据点的颜色?
- 如果没有数据中的其他特征,我如何知道数据点是真实的还是伪造的?我知道数据集有一个“class”,它显示 1 和 2 表示真品和伪造,但我可以在没有“class”特征的情况下识别它吗?
我的代码:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.patches as patches
data = 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()
附上图片以提高可见性
- 如何统计每个簇的数据点
您可以通过使用 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)
- 要设置它的颜色,使用
kM.labels_
或kM.predict()
的输出作为着色索引。
labels = kM.predict(V1_V2)
plt.scatter(normed_V1, normed_V2, s=10, c=labels, cmap='coolwarm') # instead of c=bn_class
- 对于新数据点,请注意您拥有的 KMeans 如何很好地将两个 classes 中的大部分分开。这种可分离性意味着您实际上可以将 KMeans 集群用作预测变量。只需使用
predict
.
predictedClass = KMeans.predict(newDataPoint)
其中一个簇被分配了 class 的值,它拥有大多数。 或者甚至有一定的几率。
我有一个真实和伪造纸币的小波数据集,具有两个特征:
- X轴:小波变换图像的方差
- Y轴:小波变换图像的偏度
I 运行 在这个数据集上 K-means 识别 2 组数据,基本上是真钞和伪钞。
现在我有3个问题:
- 如何统计每个簇的数据点?
- 如何根据集群设置每个数据点的颜色?
- 如果没有数据中的其他特征,我如何知道数据点是真实的还是伪造的?我知道数据集有一个“class”,它显示 1 和 2 表示真品和伪造,但我可以在没有“class”特征的情况下识别它吗?
我的代码:
import matplotlib.pyplot as plt
import numpy as np
import matplotlib.patches as patches
import pandas as pd
from sklearn.cluster import KMeans
import matplotlib.patches as patches
data = 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()
附上图片以提高可见性
- 如何统计每个簇的数据点
您可以通过使用 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)
- 要设置它的颜色,使用
kM.labels_
或kM.predict()
的输出作为着色索引。
labels = kM.predict(V1_V2)
plt.scatter(normed_V1, normed_V2, s=10, c=labels, cmap='coolwarm') # instead of c=bn_class
- 对于新数据点,请注意您拥有的 KMeans 如何很好地将两个 classes 中的大部分分开。这种可分离性意味着您实际上可以将 KMeans 集群用作预测变量。只需使用
predict
.
predictedClass = KMeans.predict(newDataPoint)
其中一个簇被分配了 class 的值,它拥有大多数。 或者甚至有一定的几率。