Advertisement

More Related Content

Slideshows for you(20)

Advertisement

距離とクラスタリング

  1. 「距離とクラスタリング」 九州大学 大学院システム情報科学研究院 情報知能工学部門 データサイエンス実践特別講座 備瀬竜馬,Diego Thomas, 末廣 大貴
  2. データ間の距離 「どれくらい違うか」を測る
  3. データ解析における「距離」とは? ●データ解析における「距離」 ●要するにデータ間の差異 (似てない具合) ●距離が小さい2データは「似ている」 ●単位がある場合もない場合も 3 𝒙 𝒚 𝒛
  4. 距離がわかると何に使えるか? 実は超便利! ●データ間の比較が定量的にできる ●「xとyは全然違う/結構似ている」 「xとyは28ぐらい違う」 ●「xにとっては,yよりもzのほうが似ている」 ●データ集合のグルーピングができる ●似たものとどおしでグループを作る ●データの異常度が測れる ●他に似たデータがたくさんあれば正常, 一つもなければ異常 [Goldstein, Uchida, PLoSONE, 2016]
  5. データ間の距離・類似度:ユークリッド距離 5 地図上の2点 𝒙 = 𝑥1 𝑥2 , 𝒚 = 𝑦1 𝑦2 𝑥1 𝑥2 𝑦2 𝑦1 𝒙 𝒚 この間の距離は?
  6. 最も代表的な距離:ユークリッド距離 (3) ● 𝒙と 𝒚の距離の二乗 = 𝑥1 − 𝑦1 2 + 𝑥2 − 𝑦2 2 6 𝑥1 𝑥2 𝑦2 𝑦1 𝒙 𝒚
  7. 最も代表的な距離:ユークリッド距離 (5) ● 𝒙と 𝒚の距離の二乗 = 𝑥1 − 𝑦1 2 + 𝑥2 − 𝑦2 2 + 𝑥3 − 𝑦3 2 7 𝑥1 𝑥2 𝑦2 𝑦1 𝒙 𝒚 この間の距離は? 𝑦3 𝑥3
  8. 最も代表的な距離:ユークリッド距離 (6) ●2次元の場合 ●3次元の場合 8 𝒙と 𝒚の距離の二乗 𝑥1 𝑥2 𝑦1 𝑦2 要素の差の二乗 要素の差の二乗 𝑥1 𝑥2 𝑥3 𝑦1 𝑦2 𝑦3 𝒙と 𝒚の距離の二乗 要素の差の二乗 要素の差の二乗 要素の差の二乗 𝒙 𝒚 𝒙 𝒚
  9. 最も代表的な距離:ユークリッド距離 (7) ● 𝐷次元の場合 9 𝑥1 ⋮ 𝑥 𝐷 𝑦1 ⋮ 𝑦 𝐷 𝒙と 𝒚の距離の二乗 要素の差の二乗 要素の差の二乗 𝒙 𝒚 ⋮ というわけで,何次元ベクトルでも距離は計算可能 もちろん1次元ベクトル(数値)間の距離も計算可能 𝑥1 − 𝑦1 2
  10. ユークリッド距離:プログラミング (8) 10 ●2次元の場合 𝒙 = 60 150 , 𝒚 = 60 180 𝒙と 𝒚の距離= 𝑥1 − 𝑦1 2 + 𝑥2 − 𝑦2 2 import math #xとyの距離の二乗:各要素の二乗和 d2 = (60-60)**2 + (150-180)**2; #平方根 d = math.sqrt(d2) # 表示 print d
  11. ユークリッド距離:プログラミング (9) 11 ●2次元の場合 𝒙 = 70 160 , 𝒚 = 40 130 import math #xとyの距離の二乗:各要素の二乗和 d2 = (70-40)**2 + (160-130)**2; #平方根 d = math.sqrt(d2) # 表示 print d 違う値になると、もう一度書き直さないといけない。
  12. ユークリッド距離:プログラミング (10) 12 ●2次元の場合 𝒙 = 𝑥1 𝑥2 , 𝒚 = 𝑦1 𝑦2 #xとyの距離の二乗:各要素の二乗和 d2 = (x[0]-y[0])**2 + (x[1]-y[1])**2 #平方根 d = math.sqrt(d2) # 表示 print d なるべく一般化してプログラムを記載! これなら、 𝒙 と 𝒚 への入力後は同じ
  13. ユークリッド距離:プログラミング (11) 13 ●3次元の場合 𝒙 = 𝑥1 𝑥2 𝑥3 , 𝒚 = 𝑦1 𝑦2 𝑦3 #xとyの距離の二乗:各要素の二乗和 d2 = (x[0]-y[0])**2 + (x[1]-y[1])**2 + (x[2]-y[2])**2 #平方根 d = math.sqrt(d2) # 表示 print d 次元が変わると、プログラムが変わってしまった ⇒1000次元だと、1000個分の要素を書かないといけない?
  14. ユークリッド距離:プログラミング (12) 14 ●N次元の場合 𝒙 = 𝑥1 ⋮ 𝑥 𝑁 , 𝒚 = 𝑦1 ⋮ 𝑦3 #xとyの距離の二乗:各要素の二乗和 for ii in range(len(x)): d2 += (x[ii]-y[ii])**2 #平方根 d = math.sqrt(d2) # 表示 print d 何次元になっても、同じプログラムで表記できる。 ⇒関数にしておくと、繰り返し簡単に使える。
  15. ユークリッド距離:プログラミング (13) 15 import numpy #xとyの定義 x = numpy.array([60,180]) Y = numpy.array([60,150]) #xとyの距離の計算 d = numpy.linalg.norm(x-y) 実は、pythonに関数が用意されている。 Webで調べて既にあるものを利用するのも プログラミングの大事なスキル!
  16. これで画像間の距離(似てる具合)も測れます 16 65536次元ベクトル 𝒙 65536次元ベクトル 𝒚 画像間距離 𝒙 − 𝒚 256 × 256 256 × 256 numpy.linalg.norm(x-y) 38574.86
  17. ユークリッド距離だけじゃない: 様々な距離 L1距離 (マンハッタン距離) ユークリッド距離 17
  18. マンハッタン? ●斜めには行けない街 ●平安京距離 ●平城京距離 ●札幌距離 でもいいかも ●「市街地距離」と 呼ばれることも 18Google map どのコースも同じ マンハッタン距離!
  19. マンハッタン距離:プログラミング (7) 19 ●N次元の場合 𝒙 = 𝑥1 ⋮ 𝑥 𝑁 , 𝒚 = 𝑦1 ⋮ 𝑦3 for ii in range(len(x)): d2 += numpy.abs(x[ii]-y[ii]) # 表示 print d 𝒙と 𝒚の距離= 𝑥1 − 𝑦1 + ⋯ + 𝑥 𝑁 − 𝑦 𝑁 各要素の差の絶対値の和 絶対値
  20. マンハッタン距離:プログラミング (7) 20 import numpy #xとyの定義 x = numpy.array([60,180]) Y = numpy.array([60,150]) #xとyの距離の計算 d = numpy.linalg.norm(x-y, 1) こちらも、pythonに関数が用意されている。
  21. 練習1: 距離 ●ユークリッド距離(任意の次元)を計算する関数を自身で定義して、 下記のベクトル間のユークリッド距離を求めよ ●例1)A=[10,8], B=[5,3] ●例2)A=[10,8,3], B=[5,3,7] ●numpyのデフォルトの関数を実行して結果が同じか比較せよ ●マンハッタン距離(任意の次元)を計算する関数を自身で定義して、 上記のベクトル間のマンハッタン距離を求めよ 21
  22. 練習2:距離(2) ●csvファイル” height_weight.csv”を読み込み、 A=(180,75)からの各点へのユークリッド距離をそれぞれ算 出し、最も距離が近い点を表示 ●ヒント)1行目は項目名なので、無視 np.argmin()
  23. 分布の可視化 ●csvファイル” height_weight.csv”を読み込み、「横 軸:身長、縦軸:体重」としてプロットして、分布の形状を 確かめよう。点Aを別の色で表示しよう。 plt.scatter(vlist[:,0], vlist[:,1],c='blue',marker='o',s=30) plt.scatter(A[0], A[1],c=‘red’,marker=‘+’,s=100) 色 マーカー の形 マーカー のサイズ
  24. 距離の可視化(1) ●A=(180,75)からの各点へのユークリッド距離をそれぞれ 算出し、最も距離が近い順に並び替えて、距離に応じて色 を変えて表示 # compute distances A = np.array([180,75]) dlist = [] for row in vlist: d = np.linalg.norm(A-row) dlist.append(d) # 距離が短い順に並び替え sinds = np.argsort(dlist)[::-1]
  25. 距離の可視化(2) ●距離に応じて色を変えて表示 # visualize import matplotlib.cm as cm count = 0 # 距離の近い順にプロット for i in sinds: row = vlist[i] # 並び順に応じて色を決定 c = cm.hot(count/len(vlist)) # 決定した色を指定してプロット plt.scatter(row[0],row[1],color=c) count += 1 # 点Aの可視化 plt.scatter(A[0], A[1], c=‘green’, marker=‘+’, s=60)
  26. 練習3 ●csvファイル” height_weight.csv”を読み込み、 A=(180,75)からの各点へのマンハッタン距離をそれぞれ 算出し、最も距離の短い順に並び替えて表示 ●ヒント)1行目は項目名なので、無視 ●距離の長さで色を変えて、プロットせよ ●ヒント)import matplotlib.cm as cm cm.hot
  27. データ間の類似度 「どれくらい似てるか」を測る (お気づきのように,距離と似てますよね)
  28. ユークリッド距離で測る類似度 28 65536次元 ベクトル 𝒙 65536次元 ベクトル 𝒚 256 × 256 256 × 256 16957.99 人の目には 𝒛 より 𝒚 の方が 𝒙 に類似しているが、 ユークリッド距離だと、 𝒛 の方が 𝒙 からの距離が近い 256 × 256 65536次元 ベクトル 𝒛 画像間距離 𝒙 − 𝒚 画像間距離 𝒙 − 𝒚 12249.03 <
  29. データ間の距離・類似度 29 𝒙 𝒚 イメージ図 𝒛 < 16957.99 12249.03 輝度の強さが違うだけで、 ベクトルの方向は一緒 角度で類似度を測る
  30. 思い出そう:内積 ●なんかcos 𝜃 も出てきたような... → その通り.これ↓をつかって内積計算もできます. ●もっと大事なのは: ●-1 ≤ cos 𝜃 ≤ 1 ● 𝜃が0度(同じ向きのベクトル): 30 𝒙 ∙ 𝒚 = 𝒙 𝒚 cos 𝜃 𝒚 𝒙 長さ= 𝒙長さ= 𝒚 𝜃cos 𝜃 = 𝒙 ∙ 𝒚 𝒙 𝒚
  31. 思い出そう:内積 ●一定の大きさのベクトル𝒚を回転させながら𝒙と内積を取る と... 31 𝒙 𝒚 𝒙 ∙ 𝒚 = 𝟎 𝒙 ∙ 𝒚 →最大 𝒙 ∙ 𝒚 →最小 𝒙と𝒚が 同一方向なら大きい 逆方向なら小さい 𝒙と𝒚の 類似度に 使えそう!
  32. 正規化相関:プログラミング 32 cos 𝜃 = 𝒙 ∙ 𝒚 𝒙 𝒚 正規化相関 import numpy as np #xとyの定義 x = np.array([60,180]) y = np.array([60,150]) #コサイン類似度 D = np.dot(x,y); # 内積 xd = np.linalg.norm(x); #||x|| yd = np.linalg.norm(y); #||y|| C = D/(xd*yd); # コサイン類似度 print C # 表示
  33. 正規化相関で測る類似度 33 65536次元 ベクトル 𝒙 65536次元 ベクトル 𝒚 256 × 256 256 × 256 1.0 256 × 256 65536次元 ベクトル 𝒛 画像間距離 コサイン類似度 画像間 コサイン類似度 0.932 <
  34. 練習4:類似度 ●ベクトル間の正規化相間(類似度)を計算する関数を自身で定義 して、下記のベクトル間の類似度と距離を求めよ ●例1)A=[17,16], B=[5,3], C=[4,4] •A-B、B-C、C-A間についてそれぞれ求めよう ●点A,B、Cへ原点から線を引いて可視化せよ 可視化した点の距離と角度を見て、類似度と距離の違いを考えよ 34
  35. K-Means データのクラスタリング(分類)
  36. データ集合をグルーピングする ●我々は「距離」や「類似度」を手に入れた ●結果,「与えられたデータ集合」を「それぞれ似たデータ からなる幾つかのグループに分ける」ことが可能に! 36
  37. クラスタリング(clustering)= データの集合をいくつかの部分集合に分割する(グルーピング) ●各部分集合=「クラスタ」と呼ばれる 37
  38. 各クラスタから代表的なデータを選ぶと... 38 これらの代表データを見 るだけで,データ集合 全体の概略が見える
  39. どういう分割がよいのか? ● 𝑁個のデータを𝐾個に分割する方法はおよそ𝐾 𝑁通り ●100個のデータを10分割→およそ10100通り ●近くにあるデータが,なるべく同じ部分集合になるように 39
  40. 代表的なクラスタリング法: K-means法(0)初期代表パターン 40 例えばランダム に与える
  41. 代表的なクラスタリング法: K-means法(1)学習パターン分割 41 代表パターンの ファンクラブ (支持者集合)
  42. 代表的なクラスタリング法: K-means法(2)代表パターン更新 42 この中の学習 パターンの 平均に移動
  43. 代表的なクラスタリング法: K-means法(1)学習パターン分割 43
  44. 代表的なクラスタリング法: K-means法(2)代表パターン更新 44 以後,代表パターンが 動かなくなるまで反復
  45. K-means:プログラミング ●ステップ0: ●データ入力 ●クラスタ数の決定 45 import csv #データの入力 f = open(‘data.csv’,’rb’) Reader = csv.reader(f) vlist = [] for row in Reader: vlist.append([float(row[0]), float(row[1])]) vlist = np.array(vlist) f.close() #k(クラスタ数)の決定 K = 4;
  46. K-means:プログラミング ●ステップ1: ●初期代表点の決定(ランダム) 46 #random値の範囲決定 a = np.min(vlist[:,0]) b = np.max(vlist[:,0]) c = np.min(vlist[:,1]) d = np.max(vlist[:,1]) #ランダムに決定 Clist = np.c_[(b-a)*np.random.rand(K) + a, (d-c)*np.random.rand(K) + c] plt.scatter(vlist[:,0], vlist[:,1]) plt.scatter(Clist[:,0], Clist[:,1])
  47. K-means:プログラミング ●ステップ1: ●代表点の支持者決定 ⇒最も近い代表点を支持する 距離を活用! ●ある点Xに着目 •各代表点までの距離を算出 47 A C B D X #XとAの距離の計算 Ad = numpy.linalg.norm(X-A)
  48. K-means:プログラミング ●ステップ1: ●ある点Xに着目 ●距離が最も近い代表点を決定 48 A C B D X def nearest(X,Clist): minD = Inf; minId = 0; for ii in range(0,len(CList)): C = Clist(ii,:) d = numpy.linalg.norm(X-C) if d < minD minD = d; minId = ii; return minId
  49. K-means:プログラミング ●ステップ1: ●全ての点で代表点を決定 49 A C B D X def selectCluster(vList,Clist): cIList = []; for row in vList: cIList.append(nearest(row,Clist)) Return cIList
  50. K-means:プログラミング ●ステップ2:代表点を更新 ●各クラスタの支持者群の平均値を 代表点とする。 50 A C B D X def updateCenter(vlist,CIList): CList = [] for k in range(K): Z = [] for j in range(len(CIList)): if CIList[j] == k: Z.append(vlist[j]) mc = np.mean(Z,0) CList.append(mc) return CList
  51. K-means:プログラミング 51 アルゴリズム ステップ0 繰り返し •代表点の選択 •代表点の更新 •終了チェック def clustering(vList,K): Clist = random err = 0.1 while dd > err: preClist = Clist CIList = selectCluster(vList,Clist) Clist = updateCenter(CIList,vList,K) dd = average(preClist-Clist)
  52. K-meansクラスタリング 52
  53. K-meansクラスタリング 53
  54. K-meansクラスタリング 54
  55. K-meansクラスタリング 55
  56. K-meansクラスタリング 56
  57. K-meansクラスタリング 57
  58. K-meansクラスタリング 58 アイリスデータ 3クラス Iris-setosa Iris-versicolor Iris-virginica 指標 sepal length sepal width petal length petal width https://archive.ics.uci.edu/ml/machine-learning-databases/iris/iris.data
  59. アイリスデータ解析 59 Sepal length Sepalwide ・ Iris-setosa ・ Iris-versicolor ・ Iris-virginica
  60. アイリスデータ解析 60 Sepal length Sepalwide ・ Iris-setosa ・ Iris-versicolor ・ Iris-virginica Petal length petalwide Sepal length Petallength Sepal wide petalwide
  61. 演習
  62. 演習4-1 ●csvファイル” height_weight.csv”を読み込み、 A=(180,75)からの各点への正規化相間(類似度)を それぞれ算出し、最も類似度の高い順に並び替えて表示 ●ヒント)1行目は項目名なので、無視 ●距離の長さで色を変えてプロットせよ ●ヒント)import matplotlib.cm as cm cm.hot
  63. 演習4-2:クラスタリング:初期化(1) ●クラスタリングの対象となるcsvデータ“data.csv”を 読み込み ●各次元で上限、下限を取得 ●K個の初期値として、各次元で上限、下限の範囲内で ランダムに値を取得 ●データを黒点、代表点を色を変えて表示 63
  64. 演習4-2:クラスタリング:支持者の決定(2) ●各点ごとに各代表点との距離を求め、 最も距離が短い代表点を支持グループとする ●各点ごとに支持グループが決まったら、 色を代表点の色に合わせてプロット ●代表点は黒×印で表示 64
  65. 演習4-2:クラスタリング:代表点更新(3) ●同じ支持グループの点集合に対して、平均を求め、それを 新しい代表点とする。 65
  66. 課題4-2:クラスタリング:全体(4) ●課題4‐3、4‐4を代表点の移動の総和が設定した閾値を 下回るまで、繰り返し実施 ●繰り返し途中で、代表点及び支持グループを色を変えて、 表示 ●Kをいろいろ変えて、結果をみる ●ランダムな初期値によって、結果がどう変わるか? 66
  67. 課題4-3:クラスタリング:アイリスデータ ●“iris.csv”を読み込み、 Kの数を2、4と変えてみるとどうなるか? ●ランダムな初期値によって、結果がどう変わるか? 67
  68. 課題4-4:クラスタリング:アイリスデータ ●“iris.csv”を読み込み、以下の2つの指標だけで、 クラスタリング可能か確認せよ ●K=2の場合はどうなるか? ●指標1 ●sepal length ●sepal width ●指標2 ●sepal width ●petal width 68
Advertisement