個人ページ
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 127件 [詳細] filek-means_3times_229.xlsx 74件 [詳細] filevertical_bar_kmeans_3times_229.jpg 137件 [詳細] filecluster_num_silhouette_654.csv 52件 [詳細] filesilhouette_3times.jpg 170件 [詳細] filecluster_num_silhouette_654.xlsx 58件 [詳細] fileelbow_3times.png 186件 [詳細] filek-means_optimal_clusters.py.txt 156件 [詳細] filevertical_bar_kmeans_3times.jpg 163件 [詳細] filevertical_bar_kmeans_2times.jpg 147件 [詳細] filedistribution_kmeans_3times.jpg 67件 [詳細] filedistribution_kmeans_2times.jpg 64件 [詳細] filek-means_3times_50.xlsx 137件 [詳細] filek-means_2times_50.xlsx 142件 [詳細] filecos_sim_for_16_31.py.txt 163件 [詳細] filedistribution_16_31.jpg 139件 [詳細] filecos_sim_all_for_16_31.xlsx 142件 [詳細] filecos_sim_all_for_16_31.csv 135件 [詳細] filelabel_average_cosine_50_cluter_3times_31only.csv 132件 [詳細] filelabel_average_cosine_50_cluter_3times_16only.csv 138件 [詳細] filek-means_3times_50.csv 133件 [詳細] filek-means_2times_50.csv 151件 [詳細] filedatasets_3times.csv 140件 [詳細] filedatasets_2times.csv 145件 [詳細] filelabel_average_cosine_50_cluter_3times_44only.csv 146件 [詳細] filedistribution_23_44.jpg 148件 [詳細] filecos_sim_all_for_23_44.xlsx 136件 [詳細] filecos_sim_all_for_23_44.csv 136件 [詳細] filedistribution_44.jpg 148件 [詳細] filecos_sim_all_for_44.xlsx 146件 [詳細] filecos_sim_all_for_44.csv 144件 [詳細] filecos_sim_all_for_23.xlsx 135件 [詳細] filecos_sim_all_for_23.csv 137件 [詳細] filelabel_average_cosine_50_cluter_3times_23only.csv 123件 [詳細] filedistribution_23.jpg 184件 [詳細] filelabel_average_cosine_50_cluter_2times.csv 195件 [詳細] filelabel_average_cosine_50_cluter_3times.csv 134件 [詳細] filecos_sim_all_for_25.xlsx 134件 [詳細] filedistribution_25.jpg 148件 [詳細] filecos_sim_for_25.py.txt 163件 [詳細] filecos_sim_all_for_25.csv 141件 [詳細] filecos_sim_all_for_46.xlsx 161件 [詳細] filedistribution_46.jpg 160件 [詳細] filecos_sim_for_46.py.txt 228件 [詳細] filecos_sim_all_for_46.csv 162件 [詳細] filecos_sim_all_for_48.xlsx 195件 [詳細] filedistribution_48.jpg 208件 [詳細] filecos_sim_for_48.py.txt 208件 [詳細] filecos_sim_all_for_48.csv 192件 [詳細] filelabel_average_cosine_50_cluter_2times_48only.csv 189件 [詳細] filelabel_average_cosine_50_cluter_2times_46only.csv 170件 [詳細] filelabel_average_cosine_50_cluter_2times_25only.csv 125件 [詳細]

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