質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

0回答

1156閲覧

pyclusteringでSSEを求めるコードを教えてください。

teruterubozu

総合スコア5

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2021/02/02 07:38

前提・実現したいこと

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/ツールのバージョンなど)

ここにより詳細な情報を記載してください。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

teruterubozu

2021/02/03 04:47

サイトを確認しましたがkmeansでの使用法しか明記されておらず、xmeansではどのようにしたらよいのでしょうか?
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問