Más contenido relacionado
La actualidad más candente (20)
Similar a 距離とクラスタリング (13)
距離とクラスタリング
- 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])