Pythonでクラスタリングする際にクラスタ番号を固定したい
解決したいこと
Pythonでのクラスタリングでクラスタ番号を固定したい
例)
初めて利用するので言葉足らずでしたら申し訳ないです。
Pythonにてk-means、主成分分析を利用したクラスタリングをしているのですが、データを追加・削除した場合に振り分けられているクラスタ番号が変わってしまうのですが何か固定する方法などはありますでしょうか。
赤い星は読み込んでいるCSVデータの一番下(追加された)データを指しています。
該当するソースコード
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