- 追加された行はこの色です。
- 削除された行はこの色です。
#author("2020-07-10T02:55:40+00:00","default:f-lab","f-lab")
#author("2020-08-07T01:03:14+00:00","default:f-lab","f-lab")
[[個人ページ>seminar-personal/chin2017]]
&br;
[[N班ゼミ>http://f-lab.mydns.jp/index.php?seminar-N-2020]]
|~目次|
|#contents|
&br;
*支部大会 [#r7ba9c19]
-題目:オープンデータの述語サジェストのための項目名のクラスタリングの研究
-英語:A study on the clustering of item names for predicate suggestion of Open Data
-概要:近年,新型コロナウイルスにより,台湾のオープンデータを活用したマスク在庫管理マップアプリが話題となったりと,世界的にオープンデータへの関心が高まりつつある.日本でもオープンデータの活用が推進され,国や地方自治体をはじめ多くの団体がオープンデータの公開,活用に取り組んでいる.地方自治体のオープンデータは,データ形式・フォーマットの違いにより開示されても積極的な活用まで至っていないのが現状である.本研究では,RDFに焦点を当てて,適切な述語をサジェストするために,オープンデータの項目名を抽出し,Word2Vecで得られた単語ベクトルを使用し,クラスタリングを行い,その実験結果を示す.
-[[電気・情報関係学会九州支部第73回連合大会>https://gakkai-web.net/gakkai/ieek/index.html]]
-発表希望グループ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
所属名: 鹿児島大
**参考資料 [#za3876ea]
-1,[[word2vecの原理について>https://www.jstage.jst.go.jp/article/jceeek/2015/0/2015_356/_pdf/-char/ja]]
-2,[[形態素分析>https://ipsj.ixsq.nii.ac.jp/ej/?action=repository_uri&item_id=196785&file_id=1&file_no=1]]
*ゼミより抜粋 [#w65cc953]
-&color(red){k-means法でやると違いがあるか?};
-&color(red){k-means++法は?};
-&color(red){他のクラスタも同様な傾向なのか?};
-&color(red){異なるクラスタ間の類似度の分布はどうなっているか?};
*進捗報告 [#xd8f9873]
**階層的クラスタリング [#paa1391d]
***他のクラスタも同様な傾向なのか? [#y109106a]
-[[距離関数の定義>https://qiita.com/obake_kaiware/items/36104a479582063308f0]]
-式:
--&ref(chin2017-20200703/コサイン類似度.JPG,70%);
--コサイン類似度が 1 に近い ⟺ 2本のベクトルは同じ向きに近い
--コサイン類似度が −1 に近い ⟺ 2本のベクトルは逆向きに近い
***以下は3個以上の自治体に存在する項目名に対して:&ref(label_average_cosine_50_cluter_2times.csv); [#yf08bdc7]
-クラスタ48(131個)を確認する
--抽出:&ref(label_average_cosine_50_cluter_2times_48only.csv);
--計算するソースコード:&ref(cos_sim_for_48.py.txt);
--結果:&ref(cos_sim_all_for_48.csv);
--結果分析:&ref(cos_sim_all_for_48.xlsx);
--131*131=17161ペア(重複の場合を考慮せず:実際ペア数8515ペア)
--分布図&ref(distribution_48.jpg);
-クラスタ46(65個)を確認する
--抽出:&ref(label_average_cosine_50_cluter_2times_46only.csv);
--計算するソースコード:&ref(cos_sim_for_46.py.txt);
--結果:&ref(cos_sim_all_for_46.csv);
--結果分析:&ref(cos_sim_all_for_46.xlsx);
--65*65=4225ペア(重複の場合を考慮せず:実際ペア数2080ペア)
--分布図&ref(distribution_46.jpg);
-クラスタ25(38個)を確認する
--抽出:&ref(label_average_cosine_50_cluter_2times_25only.csv);
--計算するソースコード:&ref(cos_sim_for_25.py.txt);
--結果:&ref(cos_sim_all_for_25.csv);
--結果分析:&ref(cos_sim_all_for_25.xlsx);
--38*38=1444ペア-38=1406(重複の場合を考慮せず:実際ペア数703ペア)
--分布図&ref(distribution_25.jpg);
&br;
***以下は4個以上の自治体に存在する項目名に対して:&ref(label_average_cosine_50_cluter_3times.csv); [#u9e4b60a]
-クラスタ23(68個)を確認する
--抽出:&ref(label_average_cosine_50_cluter_3times_23only.csv);
--結果:&ref(cos_sim_all_for_23.csv);
--結果分析:&ref(cos_sim_all_for_23.xlsx);
--68*68=4624ペア-64 /2(重複の場合を考慮せず:実際ペア数2278ペア)
--分布図
&ref(distribution_23.jpg);
-クラスタ44(68個)を確認する
--抽出:&ref(label_average_cosine_50_cluter_3times_44only.csv);
--結果:&ref(cos_sim_all_for_44.csv);
--結果分析:&ref(cos_sim_all_for_44.xlsx);
--68*68=4624ペア-64 /2(重複の場合を考慮せず:実際ペア数2278ペア)
--分布図
&ref(distribution_44.jpg);
***異なるクラスタ間の類似度の分布はどうなっているか? [#p96cbbfc]
以下は4個以上の自治体に存在する項目名に対して
-クラスタ23(68個)と44(68個)を確認する
--抽出したデータ:&ref(label_average_cosine_50_cluter_3times_44only.csv);
と&ref(label_average_cosine_50_cluter_3times_23only.csv);
--結果:&ref(cos_sim_all_for_23_44.csv);
--結果分析:&ref(cos_sim_all_for_23_44.xlsx);
--68*68=4624
--分布図
&ref(distribution_23_44.jpg);
-クラスタ16(30個)と31(33個)を確認する
--抽出したデータ:&ref(label_average_cosine_50_cluter_3times_16only.csv);
と&ref(label_average_cosine_50_cluter_3times_31only.csv);
--計算するソースコード:&ref(cos_sim_for_16_31.py.txt);
--結果:&ref(cos_sim_all_for_16_31.csv);
--結果分析:&ref(cos_sim_all_for_16_31.xlsx);
--30*33=990
--分布図
&ref(distribution_16_31.jpg);
***結果について考察 [#dea52f08]
-妥当ではないクラスタが存在している
-クラスタリングをうまくいかない?
-原因として
--指定したクラスタ数に強制的クラスタリングを行った(乱暴なやり方?)
---無関係の項目名も強制的に同じクラスタに入っている(クススタ内にコサイン類似度が低いので)?
---&color(red){そこで、最適なクススタ数を探す必要ではないか?};
--辞書?→軽く調べてみる
--クラスタリングのパラメータは大丈夫か?(前回で報告したsingleではだめだった?)
**[[k-means法>http://tech.nitoyon.com/ja/blog/2009/04/09/kmeans-visualise/]](k点平均法:非階層型クラスタリング)について [#h5ce1f20]
-教師なし学習の中でもとても有名なアルゴリズムの一つ
-概要:クラスタの平均を用い、与えられたクラスタ数k個に分類することから、MacQueen がこのように命名した。k-平均法(k-means)、c-平均法(c-means)とも呼ばれる。
-流れ:
1.各点にランダムにクラスタを割り当てる
2.クラスタの重心を計算する。
3.点のクラスタを、一番近い重心のクラスタに変更する
4.変化がなければ終了。変化がある限りは 2. に戻る。
-[[問題点>https://www.medi-08-data-06.work/entry/kmeans]]:中心の初期値がランダムに選ばれてしまうということである。例えば、こんな少し偏ったところが中心に選ばれたとしましょう。
**[[k-means++>https://www.medi-08-data-06.work/entry/kmeans]]について [#w2577f1c]
-k-means++:k-meansの初期値問題を解消するため
--k-means++では中心の初期値を決める際に、すべての中心点どうしが遠いところに配置されるような確率が高くなるようにする
-ソースコードは[[ここ>https://pythondatascience.plavox.info/scikit-learn/%E3%82%AF%E3%83%A9%E3%82%B9%E3%82%BF%E5%88%86%E6%9E%90-k-means]]を参考
-[[詳細>https://colab.research.google.com/drive/13JWN6MisaME5tvyXrcLpMhm6FWni_gEU#scrollTo=v23pD62a2KJR]]
-クラスタリング用データ:&ref(datasets_2times.csv);と&ref(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");
***結果とクラスタの分布 [#scd9ece8]
-結果:&ref(k-means_2times_50.csv);と&ref(k-means_3times_50.csv);
-クラスタの分布1(3個以上の自治体の項目名に対して)
--&ref(k-means_2times_50.xlsx);
--分布図(縦棒):&ref(vertical_bar_kmeans_2times.jpg);
-クラスタの分布2(4個以上の自治体の項目名に対して)
--&ref(k-means_3times_50.xlsx);
--分布図(縦棒):&ref(vertical_bar_kmeans_3times.jpg);
***評価手法(クラスタ数を自動推定) [#qb4cb2a8]
-[[評価方法>https://qiita.com/deaikei/items/11a10fde5bb47a2cf2c2]]:最適なクラスタ数の評価方法はシルエット分析法とエルボー法(とX-means法?)
-[[評価方法(評価指標)>https://qiita.com/deaikei/items/11a10fde5bb47a2cf2c2]]:最適なクラスタ数の評価方法はシルエット分析法とエルボー法(とX-means法?)
--1)エルボー法:クラスター数を変えてクラスタリングしたときの各SSE(クラスター内誤差の平方和)をプロットしたエルボー図で、ひじのように曲がっているところのクラスター数が最適というもの。
--[[2)シルエット分析法>https://irukanobox.blogspot.com/2018/06/k-means_30.html?m=0]]:各点のシルエット値を計算する。シルエット値とは「他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度」
---1から1の範囲の値
---シルエット値が1に近く、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。
---&color(red){シルエット値が1に近く};、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。
--1)と2)の書いてみたソースコード:&ref(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(silhouette_2times.jpg);|&ref(elbow_2times.png);|?|||
|4個以上の自治体|&ref(silhouette_3times.jpg);|&ref(elbow_3times.png);|229?(0.15234425663948)|&ref(k-means_3times_229.csv);|&ref(vertical_bar_kmeans_3times_229.jpg);|
--3)[[X-means法>https://qiita.com/deaikei/items/8615362d320c76e2ce0b]]法もある
---Pelleg and Moore (2000)が提案したK-meansの拡張アルゴリズム。
---クラスター数Kを自動決定する
---k-meansをデータ数が多くても高速に動くようなアルゴリズムに工夫する
という点が、従来のk-meansとの差分。
*参考文献 [#wb2bc857]
-[[1,クラスター数決定法の比較>http://www.st.nanzan-u.ac.jp/info/ma-thesis/2010/MATSUDA/m09mm020.pdf]]
-[[2,k-means法の最適なクラスター数を選択する:シルエット分析>https://irukanobox.blogspot.com/2018/06/k-means_30.html?m=0]]
-[[3,k-means++とk-means>https://qiita.com/g-k/items/e1d558ffcdc833e6382c]]
-[[4,非階層型クラスタリング k-means>https://qiita.com/AwaJ/items/1cd3eeef497c93a6a053]]
-[[5,クラスター数を自動決定するk-meansアルゴリズムの拡張について | 大学入試センター 研究開発部 (2000)>http://www.rd.dnc.ac.jp/~tunenori/doc/xmeans_euc.pdf]]