狠狠撸

狠狠撸Share a Scribd company logo
「距离とクラスタリング」
九州大学 大学院システム情報科学研究院
情報知能工学部門
データサイエンス実践特別講座
備瀬竜馬,Diego Thomas, 末廣 大貴
データ間の距離
「どれくらい違うか」を測る
データ解析における「距離」とは?
●データ解析における「距離」
●要するにデータ間の差異 (似てない具合)
●距離が小さい2データは「似ている」
●単位がある場合もない場合も
3
?
?
?
距離がわかると何に使えるか?
実は超便利!
●データ間の比較が定量的にできる
●「xとyは全然違う/結構似ている」 「xとyは28ぐらい違う」
●「xにとっては,yよりもzのほうが似ている」
●データ集合のグルーピングができる
●似たものとどおしでグループを作る
●データの異常度が測れる
●他に似たデータがたくさんあれば正常,
一つもなければ異常
[Goldstein, Uchida, PLoSONE, 2016]
データ間の距離?類似度:ユークリッド距離
5
?地図上の2点 ? =
?1
?2
, ? =
?1
?2
?1
?2
?2
?1
?
?
この間の距離は?
最も代表的な距離:ユークリッド距離 (3)
● ?と ?の距離の二乗 = ?1 ? ?1
2 + ?2 ? ?2
2
6
?1
?2
?2
?1
?
?
最も代表的な距離:ユークリッド距離 (5)
● ?と ?の距離の二乗 = ?1 ? ?1
2
+ ?2 ? ?2
2
+ ?3 ? ?3
2
7
?1
?2
?2
?1
?
?
この間の距離は?
?3
?3
最も代表的な距離:ユークリッド距離 (6)
●2次元の場合
●3次元の場合
8
?と ?の距離の二乗
?1
?2
?1
?2
要素の差の二乗
要素の差の二乗
?1
?2
?3
?1
?2
?3
?と ?の距離の二乗
要素の差の二乗
要素の差の二乗
要素の差の二乗
? ?
? ?
最も代表的な距離:ユークリッド距離 (7)
● ?次元の場合
9
?1
?
? ?
?1
?
? ?
?と ?の距離の二乗
要素の差の二乗
要素の差の二乗
? ?
?
というわけで,何次元ベクトルでも距離は計算可能
もちろん1次元ベクトル(数値)間の距離も計算可能
?1 ? ?1
2
ユークリッド距離:プログラミング (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
ユークリッド距離:プログラミング (9)
11
●2次元の場合 ? =
70
160
, ? =
40
130
import math
#xとyの距離の二乗:各要素の二乗和
d2 = (70-40)**2 + (160-130)**2;
#平方根
d = math.sqrt(d2)
# 表示
print d
違う値になると、もう一度書き直さないといけない。
ユークリッド距離:プログラミング (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
なるべく一般化してプログラムを記載!
これなら、 ? と ? への入力後は同じ
ユークリッド距離:プログラミング (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個分の要素を書かないといけない?
ユークリッド距離:プログラミング (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
何次元になっても、同じプログラムで表記できる。
?関数にしておくと、繰り返し簡単に使える。
ユークリッド距離:プログラミング (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
65536次元ベクトル ? 65536次元ベクトル ?
画像間距離
? ? ?
256 × 256 256 × 256
numpy.linalg.norm(x-y)
38574.86
ユークリッド距離だけじゃない:
様々な距離
L1距離
(マンハッタン距離)
ユークリッド距離
17
マンハッタン?
●斜めには行けない街
●平安京距離
●平城京距離
●札幌距離
でもいいかも
●「市街地距離」と
呼ばれることも
18Google map
どのコースも同じ
マンハッタン距離!
マンハッタン距離:プログラミング (7)
19
●N次元の場合 ? =
?1
?
? ?
, ? =
?1
?
?3
for ii in range(len(x)):
d2 += numpy.abs(x[ii]-y[ii])
# 表示
print d
?と ?の距離= ?1 ? ?1 + ? + ? ? ? ? ?
各要素の差の絶対値の和
絶対値
マンハッタン距離:プログラミング (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に関数が用意されている。
練習1: 距離
●ユークリッド距離(任意の次元)を計算する関数を自身で定義して、
下記のベクトル間のユークリッド距離を求めよ
●例1)A=[10,8], B=[5,3]
●例2)A=[10,8,3], B=[5,3,7]
●numpyのデフォルトの関数を実行して結果が同じか比較せよ
●マンハッタン距離(任意の次元)を計算する関数を自身で定義して、
上記のベクトル間のマンハッタン距離を求めよ
21
練習2:距離(2)
●csvファイル” height_weight.csv”を読み込み、
A=(180,75)からの各点へのユークリッド距離をそれぞれ算
出し、最も距離が近い点を表示
●ヒント)1行目は項目名なので、無視
np.argmin()
分布の可視化
●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)
色 マーカー
の形
マーカー
のサイズ
距離の可視化(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]
距離の可視化(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)
練習3
●csvファイル” height_weight.csv”を読み込み、
A=(180,75)からの各点へのマンハッタン距離をそれぞれ
算出し、最も距離の短い順に並び替えて表示
●ヒント)1行目は項目名なので、無視
●距離の長さで色を変えて、プロットせよ
●ヒント)import matplotlib.cm as cm
cm.hot
データ間の類似度
「どれくらい似てるか」を測る
(お気づきのように,距離と似てますよね)
ユークリッド距離で測る類似度
28
65536次元
ベクトル ?
65536次元
ベクトル ?
256 × 256 256 × 256
16957.99
人の目には ? より ? の方が ? に類似しているが、
ユークリッド距離だと、 ? の方が ? からの距離が近い
256 × 256
65536次元
ベクトル ?
画像間距離
? ? ?
画像間距離
? ? ?
12249.03 <
データ間の距離?類似度
29
?
?
イメージ図
?
<
16957.99
12249.03
輝度の強さが違うだけで、
ベクトルの方向は一緒
角度で類似度を測る
思い出そう:内積
●なんかcos ? も出てきたような...
→ その通り.これ↓をつかって内積計算もできます.
●もっと大事なのは:
●-1 ≤ cos ? ≤ 1
● ?が0度(同じ向きのベクトル):
30
? ? ? = ? ? cos ?
?
?
長さ= ?長さ= ?
?cos ? =
? ? ?
? ?
思い出そう:内積
●一定の大きさのベクトル?を回転させながら?と内積を取る
と...
31
?
?
? ? ? = ?
? ? ? →最大
? ? ? →最小 ?と?が
同一方向なら大きい
逆方向なら小さい
?と?の
類似度に
使えそう!
正規化相関:プログラミング
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
65536次元
ベクトル ?
65536次元
ベクトル ?
256 × 256 256 × 256
1.0
256 × 256
65536次元
ベクトル ?
画像間距離
コサイン類似度
画像間
コサイン類似度
0.932 <
練習4:類似度
●ベクトル間の正規化相間(類似度)を計算する関数を自身で定義
して、下記のベクトル間の類似度と距離を求めよ
●例1)A=[17,16], B=[5,3], C=[4,4]
?A-B、B-C、C-A間についてそれぞれ求めよう
●点A,B、Cへ原点から線を引いて可視化せよ
可視化した点の距離と角度を見て、類似度と距離の違いを考えよ
34
K-Means
データのクラスタリング(分類)
データ集合をグルーピングする
●我々は「距離」や「類似度」を手に入れた
●結果,「与えられたデータ集合」を「それぞれ似たデータ
からなる幾つかのグループに分ける」ことが可能に!
36
クラスタリング(clustering)=
データの集合をいくつかの部分集合に分割する(グルーピング)
●各部分集合=「クラスタ」と呼ばれる
37
各クラスタから代表的なデータを選ぶと...
38
これらの代表データを見
るだけで,データ集合
全体の概略が見える
どういう分割がよいのか?
● ?個のデータを?個に分割する方法はおよそ? ?通り
●100個のデータを10分割→およそ10100通り
●近くにあるデータが,なるべく同じ部分集合になるように
39
代表的なクラスタリング法:
K-means法(0)初期代表パターン
40
例えばランダム
に与える
代表的なクラスタリング法:
K-means法(1)学習パターン分割
41
代表パターンの
ファンクラブ
(支持者集合)
代表的なクラスタリング法:
K-means法(2)代表パターン更新
42
この中の学習
パターンの
平均に移動
代表的なクラスタリング法:
K-means法(1)学習パターン分割
43
代表的なクラスタリング法:
K-means法(2)代表パターン更新
44
以後,代表パターンが
動かなくなるまで反復
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;
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])
K-means:プログラミング
●ステップ1:
●代表点の支持者決定
?最も近い代表点を支持する
距離を活用!
●ある点Xに着目
?各代表点までの距離を算出
47
A C
B
D
X
#XとAの距離の計算
Ad = numpy.linalg.norm(X-A)
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
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
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
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)
K-meansクラスタリング
52
K-meansクラスタリング
53
K-meansクラスタリング
54
K-meansクラスタリング
55
K-meansクラスタリング
56
K-meansクラスタリング
57
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
Sepal length
Sepalwide
? Iris-setosa
? Iris-versicolor
? Iris-virginica
アイリスデータ解析
60
Sepal length
Sepalwide
? Iris-setosa
? Iris-versicolor
? Iris-virginica
Petal length
petalwide
Sepal length
Petallength
Sepal wide
petalwide
演习
演习4-1
●csvファイル” height_weight.csv”を読み込み、
A=(180,75)からの各点への正規化相間(類似度)を
それぞれ算出し、最も類似度の高い順に並び替えて表示
●ヒント)1行目は項目名なので、無視
●距離の長さで色を変えてプロットせよ
●ヒント)import matplotlib.cm as cm
cm.hot
演习4-2:クラスタリング:初期化(1)
●クラスタリングの対象となるcsvデータ“data.csv”を
読み込み
●各次元で上限、下限を取得
●K個の初期値として、各次元で上限、下限の範囲内で
ランダムに値を取得
●データを黒点、代表点を色を変えて表示
63
演习4-2:クラスタリング:支持者の決定(2)
●各点ごとに各代表点との距離を求め、
最も距離が短い代表点を支持グループとする
●各点ごとに支持グループが決まったら、
色を代表点の色に合わせてプロット
●代表点は黒×印で表示
64
演习4-2:クラスタリング:代表点更新(3)
●同じ支持グループの点集合に対して、平均を求め、それを
新しい代表点とする。
65
課題4-2:クラスタリング:全体(4)
●課題4‐3、4‐4を代表点の移動の総和が設定した閾値を
下回るまで、繰り返し実施
●繰り返し途中で、代表点及び支持グループを色を変えて、
表示
●Kをいろいろ変えて、結果をみる
●ランダムな初期値によって、結果がどう変わるか?
66
課題4-3:クラスタリング:アイリスデータ
●“iris.csv”を読み込み、
Kの数を2、4と変えてみるとどうなるか?
●ランダムな初期値によって、結果がどう変わるか?
67
課題4-4:クラスタリング:アイリスデータ
●“iris.csv”を読み込み、以下の2つの指標だけで、
クラスタリング可能か確認せよ
●K=2の場合はどうなるか?
●指標1
●sepal length
●sepal width
●指標2
●sepal width
●petal width
68

More Related Content

距离とクラスタリング