点と直線の距離と交点を求めて、matplotlibで可視化する
ヘッセの公式
点\(A(x_0,y_0)\)と直線\(l:ax + by + c = 0\) の距離dを求める公式です。 \[d=\dfrac{|ax_0+by_0+c|}{\sqrt{a^2+b^2}}\]
点と直線の距離、交点を作図する
作図は直線l(青線)、点A(赤点)、交点H、距離d(緑破線)を描画しています。
- 直線l(ax+by+c=0)は、係数a,係数b,定数cの値で指定
- 点Aの座標は、ax、ayで指定
%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
# 直線Lの式 ax + by + c = 0
a = 0.8
b = 1
c = 0
La = - a / b # 直線Lの傾き
Lb = - c / b # 直線Lの切片
# 点Aの座標(ax,ay)
ax, ay = (10, 5)
# A点と直線Lの距離計算
d = (abs(a*ax+b*ay+c))/((a**2+b**2)**(1/2)) # ヘッセの公式で距離計算
# 交点H(hx, hy) の座標計算
hx = (La*(ay-Lb)+ax)/(La**2+1)
hy = La*(La*(ay-Lb)+ax)/(La**2+1)+Lb
# d = ((ax-hx)**2+(ay-hy)**2)**(1/2) 点Aと交点Hの座標からdを計算する場合
# 直線プロットデータ
if ax > hx:
Lx_max = ax + abs(ax - hx) / 1
Lx_min = hx - abs(ax - hx) / 1
else:
Lx_max = hx + abs(ax - hx) / 1
Lx_min = ax - abs(ax - hx) / 1
Lx = np.array([Lx_min, Lx_max])
Ly = La * Lx + Lb
# 垂線テキスト座標
dx_center = (ax + hx) / 2
dy_center = (ay + hy) / 2
# 描画
plt.figure(figsize=(6, 6))
plt.plot(Lx, Ly, color='blue') # 直線Lプロット
plt.scatter(ax, ay, color='red') # 点Aプロット
plt.plot([ax, hx],[ay, hy], color='green', linestyle='--', zorder=0) # 垂線プロット(点A-点H)
plt.axis('scaled') # 垂直に見えるようにスケール調整
# テキスト
ts = (Lx_max - Lx_min)*0.03
plt.title("l: ax + by + c = 0 (a={0},b={1},c={2})".format(a, b, c),fontsize=14)
plt.text(ax+ts, ay-ts, "A({0},{1})".format(ax, ay),fontsize=14)
plt.text(hx+ts, hy-ts, "H({0:.1f},{1:.1f})".format(hx, hy),fontsize=14)
plt.text(dx_center+ts, dy_center-ts, "d={0:.1f}".format(d),fontsize=14)
plt.show()
機械学習でマージン最大化の解説を読んでいたとき、試しに作図してみました。
0 件のコメント :
コメントを投稿