如何绘制 K-means 并打印集群外的点

Posted

技术标签:

【中文标题】如何绘制 K-means 并打印集群外的点【英文标题】:How to plot the K-means and print the points outside the cluster 【发布时间】:2020-09-23 01:00:51 【问题描述】:

如何绘制以下数据的 K 均值

no,store_id,revenue,profit,state,country
0,101,779183,281257,WD,India
1,101,144829,838451,WD,India
2,101,766465,757565,AL,Japan

我的代码在下面

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
df1 = pd.get_dummies(df, columns=['state','country'])
clusters = 2   
km = KMeans(n_clusters=8).fit(df1)
labels = km.predict(df1)
df1['cluster_id'] = km.labels_
def distance_to_centroid(row, centroid):
     row = row[['no','store_id','revenue','profit','state','country']]
     return euclidean(row, centroid)
df1['distance_to_center0'] = df1.apply(lambda r: distance_to_centroid(r,
                             km.cluster_centers_[0]),1)

df1['distance_to_center1'] = df1.apply(lambda r: distance_to_centroid(r,
                             km.cluster_centers_[1]),1)



dummies_df =dummies[['distance_to_center0','distance_to_center1','cluster_id']]
test = 0:"Blue", 1:"Red", 2:"Green",3:"Black",4:"Orange",5:"Yellow",6:"Violet",7:"Grey"
sns.scatterplot(x="distance_to_center0", y="distance_to_center1", data=dummies_df, hue="cluster_id", palette = test)

下面是找到中心点的代码

km = KMeans(n_clusters=7).fit(dummies)
closest, _ = pairwise_distances_argmin_min(km.cluster_centers_, dummies)
closest

如何为集群绘制散点图

如何让打印点远离集群

至少异常值方法 -1 是异常值(scikit learn)。kmeans.labes_ 仅打印 1 和 0 ,如何获取异常值

【问题讨论】:

您在哪些变量上运行 KMeans?但通常你可以使用plt.scatter(x, y)让打印点远离集群是什么意思? 我做了一个非常相似的项目。你可以看看我是如何在第 166 到 171 行绘制数据的。github.com/moe-assal/Machine-Learning/blob/master/… @moeassal 我不需要预测任何东西,我只想绘制一个图表并找到远离集群的点 @moeaassal 你只考虑两个变量 对不起,你想做什么? oyu 想在你的情节中使用多少变量? 【参考方案1】:

您不能绘制大于 3 的任何维度的数据(在您的情况下,它是 4 而不计算位置)。相反,您可以做的是找到特征和 K 点之间的距离,并使用它来大致了解正在发生的事情。我希望这会有所帮助!

【讨论】:

【参考方案2】:

由于您基于超过 3 个特征(WD、AL、印度、日本、..)进行聚类,您需要执行以下任一操作来可视化图表。

    使用降维方法(如 PCA、TSNE 或自动编码器)到 2 个变量(用于 2D 图)或 3 个变量(3D 图)

    一次获取 2 或 3 个特征以保持其余不变。

【讨论】:

【参考方案3】:

集群的散点图:您只能在 2D 或 3D 中绘图/可视化,但您示例中的数据至少具有 4 个特征(即 4 个维度)。要绘制集群,您需要根据需要将维度数量减少到 2 或 3,方法是减少用于聚类的特征集(例如,通过人工预选或使用特征减少技术)和/或将结果投影到降低维度(例如,如果您只有 3 个节点/集群,则可以使用包含所有 3 个质心的平面)

远离“簇”/异常值的点:Kmeans 算法会将每个点分配给一个簇。集群的紧凑性反映在惯性值中。获取异常值的一种简单方法是查看点与其指定质心的距离,并使用阈值(如标准偏差的倍数)对异常值进行分类。另一种更复杂的方法是运行算法,然后删除到其指定质心的欧几里得距离最长的数据点,重新运行算法并检查平均间距的下降。重复直到没有明显下降。移除点的集合就是异常值。

还有其他聚类算法(如 DBCSAN)试图隐式检测异常值。

【讨论】:

【参考方案4】:

不要听反对者的话。尽管不可能在 2d 图像中合理准确地表示超过 3d 的数据,但像 PCA 和 TSNE 这样的降维技术可以通过在较低的图像上使用线性 (PCA) 或非线性 (TSNE) 投影来帮助实现这一点维空间。

这里是一个葡萄酒数据集的例子,它有 13 个维度。您提供的数据只有 3 个数据点,因此不会很有说明性。

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
from sklearn.preprocessing import scale
from sklearn.cluster import KMeans
from sklearn.datasets import load_wine
from sklearn.decomposition import PCA
import matplotlib.cm as cm

# Load wine dataset. It has 13 float-type features and 3 classes of wine
data = load_wine()

df = pd.DataFrame(data = scale(data.data), columns=data.feature_names)

# Create a separate dataframe for target and predictions
df_labels = pd.DataFrame(data=data.target, columns=['target'])

class_names = list(data.target_names)

# Perform K-means clustering
km = KMeans(n_clusters=3).fit(df)
df_labels['predictions'] = km.predict(df)

# Use PCA to reduce dataset dimentions to project 13 dimensional dataset onto 2 dimensions
pca = PCA(n_components=2).fit(df)

df_reduced = pd.DataFrame(data=PCA(n_components=2).fit_transform(df.values), columns=['x', 'y'])

fig, (ax_true, ax_pred) = plt.subplots(1, 2, figsize=(20, 10))

# Use red, green, and blue to color different clusters
colors = ['r', 'g', 'b']
colors_true = [colors[i] for i in df_labels['target'].values]
colors_pred = [colors[i] for i in df_labels['predictions'].values]

# Plot cluster centroids with X symbols
centroids = pca.transform(km.cluster_centers_)

x = df_reduced['x'].values
y = df_reduced['y'].values
titles = ['target', 'predictions']

for ax, colors, title in zip([ax_true, ax_pred], [colors_true, colors_pred], titles):
    ax.scatter(x, y, marker='o', s=5, linewidths=3, color=colors)

    # Plot the centroids as a black X
    ax.scatter(centroids[:, 0], centroids[:, 1],
                marker='x', s=50, linewidths=2,
                color='black', zorder=10)

    ax.set_title(title, fontsize= 14)
    ax.set_xticks(())
    ax.set_yticks(())

plt.xlim((1.1*min(x), 1.1*max(x)))
plt.ylim((1.1*min(y), 1.1*max(y)))
plt.show()

应该产生这样的情节:

左侧的着色对应于真实的聚类,右侧表示 KMeans 预测。将targetdf_labels 中的prediction 进行比较,将揭示错误分类的点(在任何给定集群之外)。

【讨论】:

以上是关于如何绘制 K-means 并打印集群外的点的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 scikit-learn 获取每个 k-means 集群的惯性值?

如何绘制一维 K 均值集群

无法为一维数据绘制 K-Means 聚类

使用 k-Means 聚类算法预测值

[机器学习]二分k-means算法详解

使用经过训练的 K-Means 模型为未见数据预测正确的集群