Данные кластеризации - плохие результаты, извлечение признаков - PullRequest
0 голосов
/ 06 апреля 2020

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

Форма набора данных: (423, 15). Каждая из 423 точек данных представляет собой измерение за день, хронологически в течение 423 дней.

enter image description here

Теперь я хочу объединить данные, чтобы увидеть, есть ли любое изменение в измерениях. В частности, я хочу исследовать, меняются ли вибрации во времени (что может указывать на неисправность в коробке передач турбины).

Что я в настоящее время сделал:

  1. Масштабирование данных между 0,1 ->
  2. Выполнение PCA (уменьшить с 15 до 5)
  3. Кластер с использованием db scan , поскольку я не знаю количество кластеров , Я использую этот код, чтобы найти оптимальный эпсилон (eps) в dbscan:
# optimal Epsilon (distance):
X_pca = principalDf.values
neigh = NearestNeighbors(n_neighbors=2)
nbrs = neigh.fit(X_pca)
distances, indices = nbrs.kneighbors(X_pca)
distances = np.sort(distances, axis=0)
distances = distances[:,1]
plt.plot(distances,color="#0F215A")
plt.grid(True)
Результат пока не дает четкого указания на то, что данные меняются со временем:

enter image description here

Конечно, случай может быть, что данные не меняются в этих точках данных. Каковы еще некоторые вещи, которые я мог бы попробовать? Вроде открытого вопроса, но у меня заканчиваются идеи.

1 Ответ

0 голосов
/ 07 апреля 2020

Прежде всего, с KMeans, если набор данных не разделен естественным образом, вы можете получить очень странные результаты! Поскольку KMeans не контролируется, вы в основном сбрасываете все виды числовых переменных c, устанавливаете целевую переменную и позволяете машине поднять вас. Вот простой пример использования канонического набора данных Iris. Вы можете ЛЕГКО изменить это, чтобы соответствовать вашему указанному c набору данных. Просто измените переменные 'X' (все, кроме целевой переменной) и переменную 'y' (только одну целевую переменную). Попробуйте это и обратная связь.

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import matplotlib as mpl
import urllib.request
import random
# seaborn is a layer on top of matplotlib which has additional visualizations -
# just importing it changes the look of the standard matplotlib plots.
# the current version also shows some warnings which we'll disable.
import seaborn as sns
sns.set(style="white", color_codes=True)
import warnings
warnings.filterwarnings("ignore")


from sklearn import datasets
iris = datasets.load_iris()
X = iris.data[:, 0:4]  # we only take the first two features.
y = iris.target



from sklearn import preprocessing

scaler = preprocessing.StandardScaler()

scaler.fit(X)
X_scaled_array = scaler.transform(X)
X_scaled = pd.DataFrame(X_scaled_array)

X_scaled.sample(5)


# try clustering on the 4d data and see if can reproduce the actual clusters.

# ie imagine we don't have the species labels on this data and wanted to
# divide the flowers into species. could set an arbitrary number of clusters
# and try dividing them up into similar clusters.

# we happen to know there are 3 species, so let's find 3 species and see
# if the predictions for each point matches the label in y.

from sklearn.cluster import KMeans

nclusters = 3 # this is the k in kmeans
seed = 0

km = KMeans(n_clusters=nclusters, random_state=seed)
km.fit(X_scaled)

# predict the cluster for each data point
y_cluster_kmeans = km.predict(X_scaled)
y_cluster_kmeans


# use seaborn to make scatter plot showing species for each sample
sns.FacetGrid(data, hue="species", size=4) \
   .map(plt.scatter, "sepal_length", "sepal_width") \
   .add_legend();

enter image description here

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...