我正在使用Scikit-Learn KMeans模型。
这是我已经实现的代码,在其中创建了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
要为聚类创建散点图,您只需按其聚类为每个点着色。以下面的代码为例:
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)
输出:(请记住它涉及随机)
hue
将点除以它们的“ cluster_id”值-在我们的示例中为不同的簇。 palette
只是用来控制颜色(在dic
的前一行中定义)
您的数据包含两个以上的标签。如您所知,我们无法绘制6维散布图。您可以执行以下操作之一:
关于第二个问题,这取决于您如何定义“异常值”。没有单一的定义,这取决于大小写。运行KMeans后,每个点都分配给一个群集。 KMeans不会给您“嗯,我不确定这一点。这可能是一个离群值”。一旦确定了离群值的定义(例如“离中心的距离> 3”),您只需检查一个点是否为离群值,然后打印出来即可。
如果我误解了任何问题,请澄清。为了使社区能够为您提供帮助,最好对您要做的事情更加准确。