Es gibt ein leistungsstarkes Paket namens tslearn zum Clustering von Zeitreihendaten und ein Memorandum zur Überprüfung des Vorgangs Es scheint, dass es bei der Arbeit verwendet werden kann, also esse ich ein bisschen
Erstellen Sie eine neue virtuelle Umgebung für die Funktionsprüfung gemäß dem Verfahren in Miniconda Install Memorandum. Installieren Sie dann die folgenden erforderlichen Pakete
conda install -c conda-forge tslearn
conda install -c conda-forge h5py
Das Verfahren für tslearn auch wie geschrieben und das Folgende ist ebenfalls erforderlich. scikit-learn, numpy, scipy
tslearns Clustering implementiert die folgenden drei Methoden.
Dieses Mal werde ich eine Methode namens K-Shape verwenden. Eine Übersicht über K-Shape finden Sie in diesem Blog, von dem Sie auch auf das Originalpapier verweisen können.
Dieses Mal werde ich versuchen, arrhythmische Wellenformen basierend auf dem [offiziellen Beispielcode] von tslearn (https://tslearn.readthedocs.io/en/stable/auto_examples/clustering/plot_kshape.html?highlight=KShape) zu gruppieren. Die verwendeten Daten waren EKG-Herzschlag-Kategorisierungsdatensatz von Kaggle. Da es sich nicht um eine DNN handelt, laden Sie nur mitbih_train.csv herunter. 187 Punkte mit 125-Hz-Wellenformdaten und die letzte Spalte sind mit 0-4 gekennzeichnet. '0' ist die normale Wellenform, und ansonsten scheint es für jedes Symptom eine andere Wellenform zu geben. Insgesamt gibt es 87554 Fälle, aber mischen und verwenden Sie 100 Punkte. Reservieren Sie außerdem das Etikett, um zu bestätigen, dass das Clustering später erfolgreich war.
Importieren Sie die erforderlichen Bibliotheken.
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from tslearn.clustering import KShape
from tslearn.datasets import CachedDatasets
from tslearn.preprocessing import TimeSeriesScalerMeanVariance
Formatieren Sie die Daten und skalieren Sie sie schließlich.
train_df=pd.read_csv('/home/hoge/mitbih_train.csv',header=None)
trainArr = []
trainArr = train_df.values
np.random.shuffle(trainArr)
trainArr_X = []
trainArr_y = []
trainArr_X = trainArr[:100, :187]
trainArr_y = trainArr[:100, -1:]
trainArr_X = trainArr_X.reshape([100, 187, 1])
print(trainArr_X.shape) # (100, 187, 1)
print(trainArr_y.shape) # (100, 1)
sz = trainArr_X.shape[1]
# For this method to operate properly, prior scaling is required
trainArr_X = TimeSeriesScalerMeanVariance().fit_transform(trainArr_X)
Führen Sie Clustering durch und zeigen Sie die Ergebnisse an. Es gab 5 Klassen.
# kShape clustering
ks = KShape(n_clusters=5, verbose=True, random_state=seed)
y_pred = ks.fit_predict(trainArr_X)
plt.figure(figsize=(10, 10), tight_layout = True)
for yi in range(5):
plt.subplot(5, 1, 1 + yi)
for xx in trainArr_X[y_pred == yi]:
plt.plot(xx.ravel(), "b-", alpha=.2)
plt.plot(ks.cluster_centers_[yi].ravel(), "r-")
plt.xlim(0, sz)
plt.ylim(-8, 8)
plt.title("Cluster %d" % (yi + 1))
plt.show()
Holen Sie sich die Abbildung unten. Die rote Linie scheint die Wellenform zu sein, die der Mitte jedes Clusters am nächsten liegt.
(Ich wollte unbedingt 100 Zeilen von trainArr_y für jeden Krankheitsnamen farblich kennzeichnen, konnte ihn aber aufgrund mangelnder Python-Leistung nicht sofort schreiben, daher werde ich ihn zu einem späteren Zeitpunkt unterstützen.) Die Anzahl der Beschriftungen der 100 hier verwendeten Originaldaten (unabhängig von der Clusternummer in der obigen Abbildung) ist wie folgt. '0': 86 Stück, '1': 2 Stück, '2': 4 Stück, '3': 2 Stück, '4': 6 Stück
Da die Anzahl der Beschriftungen und die Anzahl der einzelnen Klassen deutlich unterschiedlich sind, scheint es, dass sie nicht verwendet werden können, ohne etwas anzupassen. Untersuchen Sie, welche Parameter verfügbar sind. Die Rohdaten wurden in der zweiten Hälfte mit Null von 187 Punkten aufgefüllt. Ich stürzte so wie es war, aber es scheint, dass dies kein Problem war.
Der Code, der diesen Datensatz mit CNN klassifiziert, befindet sich ebenfalls in Kaggle, und die Genauigkeit ist ebenfalls hervorragend gut.
Recommended Posts