K均值平均距离

时间:2020-03-17 14:18:55

标签: python dataframe machine-learning scikit-learn

我试图使用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_'

有人可以帮助我实现上述目标吗?

1 个答案:

答案 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)
相关问题