[英]How to scatter plot for Kmeans and print the outliers
我正在使用 Scikit-Learn KMeans model。
这是我实现的代码,我在其中创建了 3 个集群(0、1、2):
df = pd.read_csv(r'1.csv',index_col=None)
dummies = pd.get_dummies(data = df)
km = KMeans(n_clusters=3).fit(dummies)
dummies['cluster_id'] = km.labels_
def distance_to_centroid(row, centroid):
row = row[['id', 'product', 'store', 'revenue','store_capacity', 'state_AL', 'state_CA', 'state_CH',
'state_WD', 'country_India', 'country_Japan', 'country_USA']]
return euclidean(row, centroid)
dummies['distance_to_center0'] = dummies.apply(lambda r: distance_to_centroid(r,
km.cluster_centers_[0]),1)
dummies['distance_to_center1'] = dummies.apply(lambda r: distance_to_centroid(r,
km.cluster_centers_[1]),1)
dummies['distance_to_center2'] = dummies.apply(lambda r: distance_to_centroid(r,
km.cluster_centers_[2]),1)
dummies.head()
这是我正在使用的数据集的示例:
id,product,store,revenue,store_capacity,state
1,Ball,AB,222,1000,CA
1,Pen,AB,234,1452,WD
2,Books,CD,543,888,MA
2,Ink,EF,123,9865,NY
要为集群创建散点 plot,您只需按集群为每个点着色。 以下面的代码为例:
import numpy as np
import pandas as pd
from matplotlib import pyplot as plt
from sklearn.cluster import KMeans
import seaborn as sns
df = pd.DataFrame(np.random.rand(10,2), columns=["A", "B"])
km = KMeans(n_clusters=3).fit(df)
df['cluster_id'] = km.labels_
dic = {0:"Blue", 1:"Red", 2:"Green"}
sns.scatterplot(x="A", y="B", data=df, hue="cluster_id", palette = dic)
output:(记住是随机的)
hue
除以它们的“cluster_id”值——在我们的例子中,是不同的集群。 palette
只是为了控制 colors (之前在dic
中定义了一行)
您的数据包含两个以上的标签。 如您所知,我们不能 plot 一个 6 维散布 plot。 您可以执行以下操作之一:
至于你的第二个问题,这取决于你如何定义“异常值”。 没有单一的定义,这取决于具体情况。 运行 KMeans 后,每个点都分配给一个集群。 KMeans 不会给你“好吧,我不确定这一点。它可能是一个异常值”。 一旦您决定了异常值的定义(例如“距中心的距离 > 3”),您只需检查一个点是否为异常值,然后打印它。
如果我误解了任何问题,请澄清。 最好更准确地说明您正在尝试做什么,以便社区为您提供帮助。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.