@rensuzu

Are you sure you want to delete the question?

Leaving a resolved question undeleted may help others!

Pythonでクラスタリングする際にクラスタ番号を固定したい

解決したいこと

Pythonでのクラスタリングでクラスタ番号を固定したい

例)
初めて利用するので言葉足らずでしたら申し訳ないです。

Pythonにてk-means、主成分分析を利用したクラスタリングをしているのですが、データを追加・削除した場合に振り分けられているクラスタ番号が変わってしまうのですが何か固定する方法などはありますでしょうか。

赤い星は読み込んでいるCSVデータの一番下(追加された)データを指しています。

追加・削除前
MicrosoftTeams-image (8).png

追加・削除後MicrosoftTeams-image (9).png

該当するソースコード

import subprocess

#ライブラリが無い場合インストール
subprocess.run('pip install -r requirements.txt')

from matplotlib import pyplot as plt
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans
from sklearn.preprocessing import StandardScaler
import pandas as pd

#C#でこのプログラムを実行している為実行時のディレクトリを取得
cpath = os.getcwd()

#CSV読み込み
df=pd.read_csv(cpath + "\game_info.csv",encoding="UTF-8")
print(cpath)

#標準化

sc=StandardScaler()
df_sc=sc.fit_transform(df)
df_sc=pd.DataFrame(df_sc,columns=df.columns)



#クラスタリング・K-means
model = KMeans(n_clusters=3,random_state=1)
clusters=model.fit(df_sc)

df["cluster"]=clusters.labels_

#クラスタ番号の取得
cluster = model.labels_

#クラスタ番号の追加
df_sc['cluster'] = clusters.labels_

#主成分分析、2次元グラフ
#主成分分析

pca=PCA(n_components=2)
pca.fit(df_sc)
x_pca=pca.transform(df_sc)
df_pca=pd.DataFrame(x_pca)
df_pca['cluster']=df['cluster'].values
#print("dfpca",df_pca)
#ここまで主成分分析

#一番下のデータ
you_data=df_pca.tail(1)


#図のサイズ
fig = plt.figure(figsize = (8, 8))

#散布図を描画
for i in df_pca['cluster'].unique():
    tmp = df_pca.loc[df_pca['cluster'] == i]
    plt.scatter(tmp[0], tmp[1], label=f"cluster{i}")

#主成分分析後のデータを出力
df_pca.to_csv("\\Users\\user\\Desktop\\主成分分析後.csv",encoding='UTF-8')

#一番下のデータを図に描画する為取り出し
x=you_data.iat[0,0]
y=you_data.iat[0,1]
youcluster=you_data.iat[0,2]
print(youcluster)

#散布図のタイトルとか
plt.title("分析結果",fontname="MS Gothic",fontsize=24)
plt.xlabel("第1主成分",fontname="MS Gothic",fontsize=24)
plt.ylabel("第\n2\n\n\n分",fontname="MS Gothic",fontsize=24,labelpad=15,rotation=0,va="center")
plt.scatter(x,y,s=600,marker='*',color='crimson')
plt.legend(("上級者","中級者","初級者"),prop={"family":"MS Gothic"},fontsize=20)

#図の保存
plt.savefig(cpath + "\plotgraph.png")

#クラスタ番号出力してるだけ
f=open(cpath+"\クラスタ番号.txt","w")
f.write(str(youcluster))
f.close()

#plt.show()

自分で試したこと

k-means()の引数であるrandom_stateの固定

引数無しにしたり0や1にしてましたがだめでした。

調べてもでてこないので、もしかしたら方法がないのかもしれませんが、よろしくお願いします。

0 likes

1Answer

ルックアップテーブルを作成して,無理やり検出個数で合わせる方法があるようです.

1Like

Comments

  1. @rensuzu

    Questioner

    追加したところクラスタ番号固定されました。ありがとうございました。

Your answer might help someone💌