距离とクラスタリング
- 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
何次元になっても、同じプログラムで表記できる。
?関数にしておくと、繰り返し簡単に使える。
- 19. マンハッタン距離:プログラミング (7)
19
●N次元の場合 ? =
?1
?
? ?
, ? =
?1
?
?3
for ii in range(len(x)):
d2 += numpy.abs(x[ii]-y[ii])
# 表示
print d
?と ?の距離= ?1 ? ?1 + ? + ? ? ? ? ?
各要素の差の絶対値の和
絶対値
- 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)
色 マーカー
の形
マーカー
のサイズ
- 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)
- 30. 思い出そう:内積
●なんかcos ? も出てきたような...
→ その通り.これ↓をつかって内積計算もできます.
●もっと大事なのは:
●-1 ≤ cos ? ≤ 1
● ?が0度(同じ向きのベクトル):
30
? ? ? = ? ? cos ?
?
?
長さ= ?長さ= ?
?cos ? =
? ? ?
? ?
- 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 # 表示
- 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])