個人ページ
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++法は?
  • 他のクラスタも同様な傾向なのか?
  • 異なるクラスタ間の類似度の分布はどうなっているか?

進捗報告

階層的クラスタリング

他のクラスタも同様な傾向なのか?

  • 距離関数の定義
  • 式:
    • コサイン類似度.JPG
    • コサイン類似度が 1 に近い ⟺ 2本のベクトルは同じ向きに近い
    • コサイン類似度が −1 に近い ⟺ 2本のベクトルは逆向きに近い

以下は3個以上の自治体に存在する項目名に対して:filelabel_average_cosine_50_cluter_2times.csv

以下は4個以上の自治体に存在する項目名に対して:filelabel_average_cosine_50_cluter_3times.csv

異なるクラスタ間の類似度の分布はどうなっているか?

以下は4個以上の自治体に存在する項目名に対して

結果について考察

  • 妥当ではないクラスタが存在している
  • クラスタリングをうまくいかない?
  • 原因として
    • 指定したクラスタ数に強制的クラスタリングを行った(乱暴なやり方?)
      • 無関係の項目名も強制的に同じクラスタに入っている(クススタ内にコサイン類似度が低いので)?
      • そこで、最適なクススタ数を探す必要ではないか?
    • 辞書?→軽く調べてみる
    • クラスタリングのパラメータは大丈夫か?(前回で報告したsingleではだめだった?)

k-means法(k点平均法:非階層型クラスタリング)について

  • 教師なし学習の中でもとても有名なアルゴリズムの一つ
  • 概要:クラスタの平均を用い、与えられたクラスタ数k個に分類することから、MacQueen がこのように命名した。k-平均法(k-means)、c-平均法(c-means)とも呼ばれる。
  • 流れ:
    1.各点にランダムにクラスタを割り当てる
    2.クラスタの重心を計算する。
    3.点のクラスタを、一番近い重心のクラスタに変更する
    4.変化がなければ終了。変化がある限りは 2. に戻る。
  • 問題点:中心の初期値がランダムに選ばれてしまうということである。例えば、こんな少し偏ったところが中心に選ばれたとしましょう。

k-means++について

  • k-means++:k-meansの初期値問題を解消するため
    • k-means++では中心の初期値を決める際に、すべての中心点どうしが遠いところに配置されるような確率が高くなるようにする
  • ソースコードはここを参考
  • 詳細
  • クラスタリング用データ:filedatasets_2times.csvfiledatasets_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)の書いてみたソースコード:filek-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個以上の自治体silhouette_3times.jpgelbow_3times.png229?(0.15234425663948)filek-means_3times_229.csvvertical_bar_kmeans_3times_229.jpg
    • 3)X-means法法もある
      • Pelleg and Moore (2000)が提案したK-meansの拡張アルゴリズム。
      • クラスター数Kを自動決定する
      • k-meansをデータ数が多くても高速に動くようなアルゴリズムに工夫する という点が、従来のk-meansとの差分。

参考文献


添付ファイル: filek-means_3times_229.csv 48件 [詳細] filek-means_3times_229.xlsx 29件 [詳細] filevertical_bar_kmeans_3times_229.jpg 55件 [詳細] filecluster_num_silhouette_654.csv 27件 [詳細] filesilhouette_3times.jpg 72件 [詳細] filecluster_num_silhouette_654.xlsx 28件 [詳細] fileelbow_3times.png 71件 [詳細] filek-means_optimal_clusters.py.txt 54件 [詳細] filevertical_bar_kmeans_3times.jpg 69件 [詳細] filevertical_bar_kmeans_2times.jpg 61件 [詳細] filedistribution_kmeans_3times.jpg 25件 [詳細] filedistribution_kmeans_2times.jpg 21件 [詳細] filek-means_3times_50.xlsx 51件 [詳細] filek-means_2times_50.xlsx 56件 [詳細] filecos_sim_for_16_31.py.txt 56件 [詳細] filedistribution_16_31.jpg 55件 [詳細] filecos_sim_all_for_16_31.xlsx 50件 [詳細] filecos_sim_all_for_16_31.csv 56件 [詳細] filelabel_average_cosine_50_cluter_3times_31only.csv 54件 [詳細] filelabel_average_cosine_50_cluter_3times_16only.csv 50件 [詳細] filek-means_3times_50.csv 46件 [詳細] filek-means_2times_50.csv 64件 [詳細] filedatasets_3times.csv 54件 [詳細] filedatasets_2times.csv 55件 [詳細] filelabel_average_cosine_50_cluter_3times_44only.csv 60件 [詳細] filedistribution_23_44.jpg 54件 [詳細] filecos_sim_all_for_23_44.xlsx 52件 [詳細] filecos_sim_all_for_23_44.csv 55件 [詳細] filedistribution_44.jpg 55件 [詳細] filecos_sim_all_for_44.xlsx 58件 [詳細] filecos_sim_all_for_44.csv 55件 [詳細] filecos_sim_all_for_23.xlsx 61件 [詳細] filecos_sim_all_for_23.csv 58件 [詳細] filelabel_average_cosine_50_cluter_3times_23only.csv 48件 [詳細] filedistribution_23.jpg 83件 [詳細] filelabel_average_cosine_50_cluter_2times.csv 89件 [詳細] filelabel_average_cosine_50_cluter_3times.csv 55件 [詳細] filecos_sim_all_for_25.xlsx 54件 [詳細] filedistribution_25.jpg 56件 [詳細] filecos_sim_for_25.py.txt 55件 [詳細] filecos_sim_all_for_25.csv 57件 [詳細] filecos_sim_all_for_46.xlsx 78件 [詳細] filedistribution_46.jpg 67件 [詳細] filecos_sim_for_46.py.txt 90件 [詳細] filecos_sim_all_for_46.csv 84件 [詳細] filecos_sim_all_for_48.xlsx 96件 [詳細] filedistribution_48.jpg 96件 [詳細] filecos_sim_for_48.py.txt 96件 [詳細] filecos_sim_all_for_48.csv 92件 [詳細] filelabel_average_cosine_50_cluter_2times_48only.csv 89件 [詳細] filelabel_average_cosine_50_cluter_2times_46only.csv 88件 [詳細] filelabel_average_cosine_50_cluter_2times_25only.csv 62件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2020-08-07 (金) 10:03:14