如何绘制 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 预测。将target
与df_labels
中的prediction
进行比较,将揭示错误分类的点(在任何给定集群之外)。
【讨论】:
以上是关于如何绘制 K-means 并打印集群外的点的主要内容,如果未能解决你的问题,请参考以下文章