下面是機器學習的《監(jiān)督式學習》課程的一篇試讀文章,進行了一下重新排版,然后展示在這里。由于格式的限制,缺少了一些習題、可運行的代碼、證明、注釋等,可能會導致解釋差強人意,所以介意的同學可以直接訪問感知機的暴力實現,以獲得最佳的閱讀體驗。
我們知道,直線(或者超平面)的方程為(下面的 ):
本文就來介紹感知機如何通過一種看似暴力的方法來尋找合適的 和 ,從而找到將兩類點分開的直線(或者超平面)。
2.1 點積的正負與夾角的大小
根據點積的知識,可以知道點積的正負與夾角的大小如下:
2.2 法向量
比如二維空間中, 是一條直線, 就垂直于該直線:
同樣的道理,在三維空間中 是一個平面, 是該平面的法向量:
2.3 超平面的兩側
:在超平面的法向量 所指的一側
:在超平面的法向量 所指的另外一側
比如二維空間中的直線 周圍有三個向量:
根據上述結論可得:
:在直線的法向量 所指的一側
:在直線上
:在直線的法向量 所指的另外一側
三維空間也是一樣的,假設平面 周圍有兩個向量:
根據上述結論可得:
:在平面的法向量 所指的一側
:在平面的法向量 所指的另外一側
3.1 隨便找的直線
下面是用來作例子的數據集,其中 為某點的坐標,對應的 表示該點的類別:
然后隨便(對,就是隨便,要不怎么叫暴力實現)找一條直線 ,看看能不能將這些點分開(作圖時, y=+1 表示該點為 ·, y=-1 表示概率為 ):
3.2 是否分對
下面來判斷該直線的對錯。我們希望標簽 y=+1的特征向量在直線 法向量 所指的一側,而 y=-1 的特征向量在法向量 所指的另一側。據此,上圖中分對的點為 、
、 、 ,根據上面“超平面的兩側”的介紹,可知它們是有共同特征的:同理,分錯的點 、 也是有共同特征的(分錯邊或者分到了邊界線上都算錯):
3.3 小結
綜上,判斷 對錯的標準就是:
分對:
分錯:
如果所有的 都分對了,那么就說明 是正確的超平面。
4.1 拉近
比如下面是標簽 y=+1 的
,它被錯分到了直線 的法向量 所指另一側,或者說本來 和 的夾角 應該是銳角的,現在卻是鈍角:那就想辦法將法向量拉近一些。根據向量加法的平行四邊形法則,可以看到
就是和 夾角更小的向量:所以用 為法向量,直線方程被糾正為
,此時就可以正確分類 :4.2 推遠
而下面是標簽 y=-1 的 被錯分了,我們希望將法向量推遠一點,同樣根據向量加法的平行四邊形法則,可以看到 就是和 夾角更大的向量:
所以用 為法向量,直線方程被糾正為 ,此時就可以正確分類 :
4.3 小結
總結下,當標簽為 的 被錯分時,也就有
此時,只需要令 ,就可以得到修正后的 :
下面給一個例子來進一步說明該結論。
4.4 錯誤糾正的例子
例 如下圖所示:
標簽為 y=-1 的向量
分錯了嗎?如果分錯又如何糾正?解 通過看圖,或者進行計算(該直線的法向量為 ),都可以發(fā)現分錯了:
應該將法向量 推遠一點,修正后為:
修正后的直線為 ,從夾角來看,修正后的法向量 更遠了:
5.1 的糾錯
只需要
就可以得到新的超平面:糾錯后, 對了。
5.2 持續(xù)糾錯
可是,原本沒有錯的 卻錯了,令 進行糾錯;然后 又錯了,繼續(xù):
5.3 找到決策邊界
還有錯,還得繼續(xù):
最后,法向量為 的直線 將所有的點正確分開,這就是感知機的暴力實現所要尋找的決策邊界。
(1)令權重向量 和 都為0:
所以初始函數為:
(2)順序遍歷數據集,從中得到 。
(3)如果分錯了,即
則進行更正(因為剛開始 ,不更正的話,超平面的截距就一直是0,導致的后果是有可能不能將數據分開):
(4)轉至(2),直到找到合適的 和 ,使得 對于所有的 都滿足:
此時可以說,該超平面 將數據分為了兩類。該規(guī)范做法的正確性在下一節(jié)課中會進行證明。
6.1 實現
語言描述的算法可能有歧義,下面是按照上面步驟實現的代碼,可以幫助同學們精確理解感知機的暴力實現:
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import Perceptron
from matplotlib.colors import ListedColormap
# 初始化 w 和 b,np.array 相當于定義向量
w, b = np.array([0, 0]), 0
# 定義 d(x) 函數
def d(x):
return np.dot(w,x)+b # np.dot 是向量的點積
# 歷史信用卡發(fā)行數據
# 這里的數據集不能隨便修改,否則下面的暴力實現可能停不下來
X = np.array([[5,2], [3,2], [2,7], [1,4], [6,1], [4,5]])
y = np.array([-1, -1, 1, 1, -1, 1])
# 感知機的暴力實現
is_modified = True # 記錄是否有分錯的點
while is_modified: # 循環(huán),直到沒有分錯的點
is_modified = False
# 順序遍及數據集 X
for xi, yi in zip(X, y):
# 如果有分錯的
if yi*d(xi) <= 0:
# 更新法向量 w 和 b
w, b = w + yi*xi, b + yi
is_modified = True
break
# 下面是繪制的代碼,主要展示暴力實現的結果,看不懂也沒有關系
def make_meshgrid(x, y, h=.02):
'''Create a mesh of points to plot in
Parameters
----------
x: data to base x-axis meshgrid on
y: data to base y-axis meshgrid on
h: stepsize for meshgrid, optional
Returns
-------
xx, yy : ndarray
'''
x_min, x_max = x.min() - 1, x.max() + 1
y_min, y_max = y.min() - 1, y.max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
np.arange(y_min, y_max, h))
return xx, yy
def plot_contours(ax, clf, xx, yy, **params):
'''Plot the decision boundaries for a classifier.
Parameters
----------
ax: matplotlib axes object
clf: a classifier
xx: meshgrid ndarray
yy: meshgrid ndarray
params: dictionary of params to pass to contourf, optional
'''
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])
Z = Z.reshape(xx.shape)
out = ax.contourf(xx, yy, Z, **params)
return out
# 訓練 skrlearn 中的感知機,這里是為了借用該感知機的接口,便于繪制決策區(qū)域
clf = Perceptron().fit(X, y)
# 根據上面暴力實現得到的 w 和 b 來修改感知機
clf.coef_[0][0], clf.coef_[0][1], clf.intercept_[0] = w[0], w[1], b
# 設置字體大小
plt.rcParams.update({'font.size': 14})
# 設置畫布和坐標系
fig, ax = plt.subplots(figsize = (6, 3), nrows=1, ncols=1)
fig.subplots_adjust(left=0.25, right=0.75, top=0.999, bottom=0.001)
ax.set_xticks(()),ax.set_yticks(())
cm = ListedColormap(('blue', 'red'))
markers = ('x', 'o')
# 決定繪制區(qū)域的大小
X0, X1 = X[:, 0], X[:, 1]
xx, yy = make_meshgrid(X0, X1)
ax.set_xlim(xx.min(), xx.max())
ax.set_ylim(yy.min(), yy.max())
# 繪制決策區(qū)域
plot_contours(ax, clf, xx, yy, cmap=cm, alpha=0.4)
# 繪制決策直線
lx = np.linspace(xx.min(), xx.max())
ly = - w[0] / w[1] * lx - b / w[1]
ax.plot(lx, ly, 'k-')
# 根據類別不同,繪制不同形狀的點
vmin, vmax = min(y), max(y)
for cl, m in zip(np.unique(y), markers):
ax.scatter(x=X0[y==cl], y=X1[y==cl], c=y[y==cl], alpha=1, vmin = vmin, vmax = vmax, cmap=cm, edgecolors='k', marker = m)
plt.show()
我們通過通俗易懂、圖形化的方式,對機器學習中的《監(jiān)督式學習》進行了精講,目前還在連載中,可以享受早鳥價格,可以點擊下面的鏈接購買:
?? 也可以直接點擊下面這個圖片購買機器學習的前置課程,《線性代數》、《單變量微積分》、《多變量微積分》、《概率論與數理統計》:
馬同學高等數學
看圖學數學
微信公眾號ID :matongxue314
聯系客服