K-среднее среднее расстояние - PullRequest
0 голосов
/ 17 марта 2020

Я пытался использовать K-средства, чтобы найти выбросы. Я использовал метод локтя оптимального k и обнаружил, что это k = 3.

Я хотел найти расстояние между центроидом кластера и точками данных, и если это расстояние больше 2 * стандартное значение среднего расстояния до центорида, тогда его следует считать выбросом

Я изо всех сил пытаюсь реализовать часть, которая определяет, если 2 * стандартное расстояние меньше, чем расстояние между точками данных и Центроид, который рассматривается как выброс.

Я думал об определении столбца с помощью, расстояние = 2 * среднее расстояние - расстояние до центроида, и строки, которые имеют отрицательные значения для расстояния, могут быть отброшены.

Я покажу код, который у меня есть (который, я уверен, не верен), я также опубликую ошибку, которую я продолжаю получать для центроида.

Мой код:

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 Ответ

1 голос
/ 17 марта 2020

Я не уверен, что то, что вы пытаетесь сделать, чтобы найти выбросы, действительно имеет смысл в Kmeans. Kmeans находят центроиды с помощью EM-процесса и устанавливают центроиды как среднее значение для каждой группы данных. если каждая точка окажется ближе к одному центроиду, чем к другим, она переместится в этот кластер.

То, как вы хотите определить выбросы, я не уверен, имеет ли научный смысл, но я не профессионал в кластеризации. В любом случае, если вы хотите рассчитать расстояние, KMEAN.fit_predict(df) выдаст вам список из N индексов (где N - количество ваших данных), где каждый индекс равен 0,1 или 2, потому что вы установили K = 3.

Centriod=KMEAN.cluster_centers_ вернет список из 3 кортежей центроидов, где каждый центроид представляет собой кортеж размера M, где M - это размерность всех ваших данных (у вас есть m функций).

То, что вам действительно нужно, это go для каждой информации:

clusters_inds=KMEAN.fit_predict(df)
for (data,cind) in zip(df.get_values(),clusters_inds):
    distance = euclidean_distances(Centriod[cind],data)
...