個人ページ
N班ゼミ
支部大会 †
- 題目:オープンデータの述語サジェストのための項目名のクラスタリングの研究
- 英語:A study on the clustering of item names for predicate suggestion of Open Data
- 概要:近年,新型コロナウイルスにより,台湾のオープンデータを活用したマスク在庫管理マップアプリが話題となったりと,世界的にオープンデータへの関心が高まりつつある.日本でもオープンデータの活用が推進され,国や地方自治体をはじめ多くの団体がオープンデータの公開,活用に取り組んでいる.地方自治体のオープンデータは,データ形式・フォーマットの違いにより開示されても積極的な活用まで至っていないのが現状である.本研究では,RDFに焦点を当てて,適切な述語をサジェストするために,オープンデータの項目名を抽出し,Word2Vecで得られた単語ベクトルを使用し,クラスタリングを行い,その実験結果を示す.
- 電気・情報関係学会九州支部第73回連合大会
- 発表希望グループ1: 21 計算機応用
- 発表希望グループ2: 22 人工知能
- 発表希望グループ3: 15 情報通信
著者1: 陳 博 チン/ハク
電子メールアドレス: chinhaku204@gmail.com
所属名: 鹿児島大
- 著者2: 泊 大貴 トマリ/ダイキ
電子メールアドレス: sc115092@ibe.kagoshima-u.ac.jp
所属名: 鹿児島大
- 著者3: 程 芳 テイ/ホウ
電子メールアドレス: mc120040@ibe.kagoshima-u.ac.jp
所属名: 鹿児島大
- 著者4: 渕田 孝康 フチダ/タカヤス
電子メールアドレス: fuchida@ibe.kagoshima-u.ac.jp
所属名: 鹿児島大
参考資料 †
ゼミより抜粋 †
- k-means法でやると違いがあるか?
- k-means++法は?
- 他のクラスタも同様な傾向なのか?
- 異なるクラスタ間の類似度の分布はどうなっているか?
進捗報告 †
階層的クラスタリング †
他のクラスタも同様な傾向なのか? †
- 距離関数の定義
- 式:
- コサイン類似度が 1 に近い ⟺ 2本のベクトルは同じ向きに近い
- コサイン類似度が −1 に近い ⟺ 2本のベクトルは逆向きに近い
- クラスタ48(131個)を確認する
- クラスタ46(65個)を確認する
- クラスタ25(38個)を確認する
- クラスタ23(68個)を確認する
- クラスタ44(68個)を確認する
異なるクラスタ間の類似度の分布はどうなっているか? †
以下は4個以上の自治体に存在する項目名に対して
結果について考察 †
- 妥当ではないクラスタが存在している
- クラスタリングをうまくいかない?
- 原因として
- 指定したクラスタ数に強制的クラスタリングを行った(乱暴なやり方?)
- 無関係の項目名も強制的に同じクラスタに入っている(クススタ内にコサイン類似度が低いので)?
- そこで、最適なクススタ数を探す必要ではないか?
- 辞書?→軽く調べてみる
- クラスタリングのパラメータは大丈夫か?(前回で報告したsingleではだめだった?)
k-means法(k点平均法:非階層型クラスタリング)について †
- k-means++:k-meansの初期値問題を解消するため
- k-means++では中心の初期値を決める際に、すべての中心点どうしが遠いところに配置されるような確率が高くなるようにする
- ソースコードはここを参考
- 詳細
- クラスタリング用データ:datasets_2times.csvとdatasets_3times.csv
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
# データセットを読み込み
cust_df = pd.read_csv("datasets_2times.csv",header=None)
print(cust_df)
cust_array = np.array([cust_df[1].tolist(),cust_df[2].tolist(),cust_df[3].tolist(),cust_df[4].tolist(),cust_df[5].tolist(),cust_df[6].tolist(),cust_df[7].tolist(),cust_df[8].tolist(),cust_df[9].tolist(),cust_df[10].tolist(),
cust_df[11].tolist(),cust_df[12].tolist(),cust_df[13].tolist(),cust_df[14].tolist(),cust_df[15].tolist(),cust_df[16].tolist(),cust_df[17].tolist(),cust_df[18].tolist(),cust_df[19].tolist(),cust_df[20].tolist(),
cust_df[21].tolist(),cust_df[22].tolist(),cust_df[23].tolist(),cust_df[24].tolist(),cust_df[25].tolist(),cust_df[26].tolist(),cust_df[27].tolist(),cust_df[28].tolist(),cust_df[29].tolist(),cust_df[30].tolist(),
cust_df[31].tolist(),cust_df[32].tolist(),cust_df[33].tolist(),cust_df[34].tolist(),cust_df[35].tolist(),cust_df[36].tolist(),cust_df[37].tolist(),cust_df[38].tolist(),cust_df[39].tolist(),cust_df[40].tolist(),
cust_df[41].tolist(),cust_df[42].tolist(),cust_df[43].tolist(),cust_df[44].tolist(),cust_df[45].tolist(),cust_df[46].tolist(),cust_df[47].tolist(),cust_df[48].tolist(),cust_df[49].tolist(),cust_df[50].tolist()
], np.float32)
# 行列を転置
cust_array = cust_array.T
print(cust_array)
# クラスタ分析を実行 (クラスタ数=50)
pred = KMeans(n_clusters=50, init='k-means++',).fit_predict(cust_array)
print(pred)
cust_df[51]=pred
print(cust_df)
cust_df.to_csv("k-means_2times_50.csv",index=False,encoding="utf-8-sig");
結果とクラスタの分布 †
評価手法(クラスタ数を自動推定) †
- 評価方法(評価指標):最適なクラスタ数の評価方法はシルエット分析法とエルボー法(とX-means法?)
- 1)エルボー法:クラスター数を変えてクラスタリングしたときの各SSE(クラスター内誤差の平方和)をプロットしたエルボー図で、ひじのように曲がっているところのクラスター数が最適というもの。
- 2)シルエット分析法:各点のシルエット値を計算する。シルエット値とは「他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度」
- 1から1の範囲の値
- シルエット値が1に近く、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。
- 1)と2)の書いてみたソースコード:k-means_optimal_clusters.py.txt
import pandas as pd
import numpy as np
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
#% matplotlib inline
from IPython.core.pylabtools import figsize
import matplotlib.pyplot as plt
def select_n_cluster(X,cluster_Num):
# クラスター数2~8を比べる
range_n_clusters = [i for i in range(2, cluster_Num)]
sse = []
cluster_num_silhouette_list =[]
for n_clusters in range_n_clusters:
clusterer = KMeans(init='k-means++', n_clusters=n_clusters, random_state=0)
cluster_labels = clusterer.fit_predict(X)
kmeans = clusterer.fit(X)
# SSE(クラスター内誤差の平方和)
sse.append(kmeans.inertia_)
# シルエット値(-1~1)の平均
silhouette_avg = silhouette_score(X, cluster_labels)
print('For n_clusters =', n_clusters,'The average silhouette_score is :', silhouette_avg)
cluster_num_silhouette_list.append([n_clusters,silhouette_avg])
# エルボー図のプロット
plt.plot(range_n_clusters, sse, marker='o')
plt.xlabel('Number of clusters')
plt.ylabel('SSE')
# 保存画像
plt.savefig('figure.png')
#plt.show()
df2 = pd.DataFrame(cluster_num_silhouette_list,columns=['cluster','silhouette'])
df2.to_csv("cluster_num_silhouette_"+str(cluster_Num)+".csv",index=False,encoding="utf-8-sig")
if __name__ == '__main__':
# データセットを読み込み
cust_df = pd.read_csv("datasets_2times.csv",header=None)
print(cust_df)
cust_array = np.array([cust_df[1].tolist(),cust_df[2].tolist(),cust_df[3].tolist(),cust_df[4].tolist(),cust_df[5].tolist(),cust_df[6].tolist(),cust_df[7].tolist(),cust_df[8].tolist(),cust_df[9].tolist(),cust_df[10].tolist(),cust_df[11].tolist(),cust_df[12].tolist(),cust_df[13].tolist(),cust_df[14].tolist(),cust_df[15].tolist(),cust_df[16].tolist(),cust_df[17].tolist(),cust_df[18].tolist(),cust_df[19].tolist(),cust_df[20].tolist(),
cust_df[21].tolist(),cust_df[22].tolist(),cust_df[23].tolist(),cust_df[24].tolist(),cust_df[25].tolist(),cust_df[26].tolist(),cust_df[27].tolist(),cust_df[28].tolist(),cust_df[29].tolist(),cust_df[30].tolist(), cust_df[31].tolist(),cust_df[32].tolist(),cust_df[33].tolist(),cust_df[34].tolist(),cust_df[35].tolist(),cust_df[36].tolist(),cust_df[37].tolist(),cust_df[38].tolist(),cust_df[39].tolist(),cust_df[40].tolist(),
cust_df[41].tolist(),cust_df[42].tolist(),cust_df[43].tolist(),cust_df[44].tolist(),cust_df[45].tolist(),cust_df[46].tolist(),cust_df[47].tolist(),cust_df[48].tolist(),cust_df[49].tolist(),cust_df[50].tolist()], np.float32)
# 行列を転置
cust_array = cust_array.T
print(cust_array)
select_n_cluster(cust_array,len(cust_df))
- 結果
内容 | シルエット値 | エルボー図 | 最適なクラスタ | 結果 | 分布 |
3個以上の自治体(5時間がかかった) | &ref(): File not found: "silhouette_2times.jpg" at page "chin2017-20200710"; | &ref(): File not found: "elbow_2times.png" at page "chin2017-20200710"; | ? | | |
4個以上の自治体 | | | 229?(0.15234425663948) | k-means_3times_229.csv | |
- 3)X-means法法もある
- Pelleg and Moore (2000)が提案したK-meansの拡張アルゴリズム。
- クラスター数Kを自動決定する
- k-meansをデータ数が多くても高速に動くようなアルゴリズムに工夫する
という点が、従来のk-meansとの差分。
参考文献 †
|