前提・実現したいこと
pyclusteringを用いてsklearnにインポートされているwineデータをxmeansでクラスタリングを行いました。
そこで,クラスタリング評価の目安であるSSEを実装したいのです。
発生している問題・エラーメッセージ
sklearnに搭載されているSSEを求めるコードがpyclusteringでは,使えないと表示されてしまいます. いくら探してもpyclusteringのコードが見つからず困っています. -------------------------------------------------------------------------- AttributeError Traceback (most recent call last) <ipython-input-40-ce7fe3f89444> in <module> ----> 1 print ('Distortion: %.2f'% xm.inertia_) AttributeError: 'xmeans' object has no attribute 'inertia_'
該当のソースコード
python
1import time 2import pyclustering 3from pyclustering.cluster import xmeans 4import numpy as np 5import matplotlib 6import matplotlib.pyplot as plt 7from sklearn import datasets, preprocessing 8import pandas as pd 9# datasetの読み込み 10data = datasets.load_iris() 11#data = datasets.load_wine() 12#data = datasets.load_breast_cancer() 13# DataFrameに変換 14df = pd.DataFrame(data.data,columns=data.feature_names) 15print(df.head()) 16 17X=df[["sepal length (cm)","petal width (cm)"]] 18#X=df[["malic_acid","ash"]] 19#X=df[["mean radius","mean texture"]] # yラベル , xラベル 20#df = pd.read_csv('C:/Users/shota/OneDrive/デスクトップ/HTRU_2.csv',header=None,usecols=[0,7]) 21#X=df 22X.shape 23 24 25#%%timeit 26initializer = pyclustering.cluster.xmeans.kmeans_plusplus_initializer(data=X, amount_centers=2) 27initial_centers = initializer.initialize() 28xm = xmeans.xmeans(data=X, initial_centers=initial_centers) 29xm.process() 30clusters = xm.get_clusters() 31 32'''一次元配列flat_labelを用意''' 33flat_label = np.array([]) 34'''sklearnでいうlabel_の大きさを調べる''' 35for cluster in clusters: 36 flat_label = np.append(flat_label,cluster) 37'''正規のlabelを代入するための配列を確保''' 38labels = np.zeros((1,flat_label.size)) 39''' 40pyclusteringのclustersはクラスター数次元配列があり、標本の名前がクラスターに分類され配列として返す。 41一方でsklearnのlabel_は標本と同様の順番に、その標本が属するクラスターの番号を配列で返す。 42下記のコードはその変換を行っている 43''' 44for n,n_th_cluster in enumerate(clusters): 45 for img_num in n_th_cluster: 46 labels[0][img_num] = n 47 48 49'''このままのラベルだと[[a........z]]の二重括弧になる。 50それはsklearnの仕様に沿わない。[a........z]の一重括弧にする。 51''' 52 53X.labels_ = labels[0] 54 55pyclustering.utils.draw_clusters(data=X.values, clusters=clusters,) 56 57 58from sklearn.metrics import accuracy_score 59print(data.target) 60print(X.labels_) 61accuracy_score(data.target,X.labels_) 62 63 64# シルエット値の計算 65from sklearn.metrics import silhouette_samples 66result = xm.predict(X) 67silhouette_vals = silhouette_samples(X,result,metric = 'euclidean') 68silhouette_avg = np.mean(silhouette_vals) 69# ラベルのリスト 70cluster_labels = np.unique(result) 71y_ax_lower, y_ax_upper = 0, 0 72yticks = [] 73for i, c in enumerate(cluster_labels): 74 c_silhouette_vals = silhouette_vals[result == c] 75 c_silhouette_vals.sort() 76 y_ax_upper += len(c_silhouette_vals) 77 color = plt.cm.jet(float(i) / 2) 78 plt.barh(range(y_ax_lower, y_ax_upper), c_silhouette_vals, height=1.0, 79 edgecolor='none', color=color) 80 81 yticks.append((y_ax_lower + y_ax_upper) / 2.) 82 y_ax_lower += len(c_silhouette_vals) 83 84silhouette_avg = np.mean(silhouette_vals) 85plt.axvline(silhouette_avg, color="red", linestyle="--") 86 87plt.yticks(yticks, cluster_labels + 1) 88plt.ylabel('Cluster') 89plt.xlabel('Silhouette coefficient') 90 91plt.tight_layout() 92plt.show() 93print(silhouette_avg) 94 95 96from sklearn.metrics import precision_recall_fscore_support 97precision_recall_fscore_support(data.target,X.labels_) 98 99 100from sklearn.metrics import classification_report 101print(classification_report(data.target,X.labels_)) 102 103 104from sklearn.metrics import confusion_matrix 105confmat = confusion_matrix(data.target,X.labels_) 106print(confmat) 107 108 109fig,ax = plt.subplots(figsize=(2.5,2.5)) 110ax.matshow(confmat,cmap=plt.cm.Blues,alpha=0.3) 111for i in range (confmat.shape[0]): 112 for j in range (confmat.shape[1]): 113 ax.text(x=j,y=i,s=confmat[i,j],va='center',ha='center') 114plt.xlabel('predicted label') 115plt.ylabel('true label') 116plt.show 117 118 119print ('Distortion: %.2f'% xm.inertia_)
試したこと
ここに問題に対して試したことを記載してください。
補足情報(FW/ツールのバージョンなど)
ここにより詳細な情報を記載してください。
pyclustering.cluster.elbow.elbow.get_wce()
で得られる値は違うのでしょうか?
参考
https://qiita.com/calderarie/items/5cef55a45adc0ff51266
サイトを確認しましたがkmeansでの使用法しか明記されておらず、xmeansではどのようにしたらよいのでしょうか?
こんなのありました (また外してるかも)
pyclustering.cluster.xmeans.xmeans.get_total_wce()
Returns sum of Euclidean Squared metric errors (SSE - Sum of Squared Errors).
https://pyclustering.github.io/docs/0.9.2/html/dd/db4/classpyclustering_1_1cluster_1_1xmeans_1_1xmeans.html#a58a892ca693ccc2fa36129b6235fbc38
あなたの回答
tips
プレビュー