我试图使用K均值来发现异常值。我使用了最优k的肘法,发现它是k = 3。
我想找到聚类质心与数据点之间的距离,如果该距离大于到质心的平均距离的2 * std,则应将其视为离群值
我正在努力实现定义2 * std平均距离是否小于数据点与被视为离群点的质心之间的距离的部分。
我想定义一个列,其距离= 2 * std平均距离-到一个中心的距离,可以删除具有负值的行。
我将显示我当前拥有的代码(我敢肯定这是不正确的),我还将发布一个错误,我一直在寻找质心。
我的代码是:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.cluster import KMeans
from sklearn.metrics.pairwise import euclidean_distances
df = pd.read_csv('/content/drive/My Drive/Final After Simple Filtering.csv')
del df['MeasuredYawError']
del df['NacelleOrientation_Deg']
del df['Pitch_Deg']
KMEAN = KMeans(n_clusters=3).fit_predict(df)
Centroid = KMEAN.cluster_centers_
for (data,cind) in zip(df.get_values(),KMEAN):
distance = euclidean_distances(Centriod[cind],data)
Centroid_std= 2*Centoid.std()
Inliner= Centroid_std - distance
df=df[df['Inliner'] == Inliner>=0]
del df['inliner']
plt.scatter( df['WindSpeed_mps'], df['Power_kW'], label='Measurements',s=1)
plt.show()
错误:
AttributeError Traceback (most recent call last)
<ipython-input-14-6b3df6c4c307> in <module>()
24 KMEAN = KMeans(n_clusters=3).fit_predict(df)
25
---> 26 Centroid = KMEAN.cluster_centers_
27
28 for (data,cind) in zip(df.get_values(),KMEAN):
AttributeError: 'numpy.ndarray' object has no attribute 'cluster_centers_'
有人可以帮助我实现上述目标吗?
答案 0 :(得分:1)
我不确定您尝试在Kmeans中找到异常值的方法是否真的有意义。 Kmeans通过EM过程找到质心,并将质心设置为数据的每个组的平均值。如果每个点比另一个点更靠近一个质心,它将移动到该群集。
要定义异常值的方式,我不确定科学是否合理,但是我不是聚类专家。无论如何,如果要计算距离,KMEAN.fit_predict(df)
将为您提供N个索引的列表(其中N是您拥有的数据数),其中每个索引为0、1或2,因为您已设置K = 3。
Centriod=KMEAN.cluster_centers_
将返回一个3个质心元组的列表,其中每个质心是一个大小为M的元组,其中M是您拥有的每个数据的维数(您有m个特征)。
所以您真正需要的是遍历每个数据:
clusters_inds=KMEAN.fit_predict(df)
for (data,cind) in zip(df.get_values(),clusters_inds):
distance = euclidean_distances(Centriod[cind],data)