今天看了林軒田老師的感知機算法,心血來潮想要做個可視化過程,以便觀察更新的過程。
現將學習成果做個記錄,下面是畫出來的圖,這是初始的狀態,後面會通過算法找到一條經過原點的直線將兩堆數據分割開來。
直線以及兩堆數據是隨機生成的,下面介紹畫出這個圖的步驟主要有哪些:
導入需要的工具包,這個沒得說,而且是在jupyter notebook中,所有會使用
%matplotlib inline
import numpy as np import matplotlib.pyplot as plt %matplotlib inline
生成數據
# 設置隨機種子 np.random.seed(325) # 隨機生成o數據 o_data_x = np.random.randint(40, 80, 5) o_data_y = np.random.randint(20, 80, 5) o_label = np.array([0,0,0,0,0]) # 隨機生成x數據 x_data_x = np.random.randint(10, 50, 5) x_data_y = np.random.randint(60, 90, 5) x_label = np.array([1,1,1,1,1]) # 隨機生成初始的直線 w1_w2 = np.random.random(2) t = np.linspace(-100,100, 18)
畫圖
# 設置畫布 plt.figure(figsize=(8, 8)) # 作點 plt.scatter(o_data_x, o_data_y, c='b', marker='o', label='0') plt.scatter(x_data_x, x_data_y, c='r', marker='x', label='1') plt.legend() # 作初始線 plt.plot(t, -w1_w2[0]/w1_w2[1]*t) # 獲取當前的座標軸, gca = get current axis ax = plt.gca() # 設置標題,也可用plt.title()設置 ax.set_title('Inital', fontsize=20, loc='left') # 設置右邊框和上邊框,隱藏 ax.spines['right'].set_color('none') ax.spines['top'].set_color('none') # 設置x座標軸爲下邊框 ax.xaxis.set_ticks_position('bottom') # 設置y座標軸爲左邊框 ax.yaxis.set_ticks_position('left') # 設置x軸, y軸在(0, 0)的位置 ax.spines['bottom'].set_position(('data', 0)) ax.spines['left'].set_position(('data', 0)) # ax.set_xticks與plt.xticks功能一樣,都是自行定義x座標軸的刻度;y軸同理。在這裏使用避免原點出現兩個同樣的0 ax.set_xticks([-100, -75, -50, -25, 0, 25, 50, 75, 100]) ax.set_yticks([-100, -75, -50, -25, 25, 50, 75, 100]) plt.savefig('output.jpg')
總結
上述畫圖涉及的知識點包括:
- 畫直線圖
- 畫散點圖
- 設置座標軸的原點、刻度等