下面是機器學(xué)習的《監督式學(xué)習》課程的一篇試讀文章,進(jìn)行了一下重新排版,然后展示在這里。由于格式的限制,缺少了一些習題、可運行的代碼、證明、注釋等,可能會(huì )導致解釋差強人意,所以介意的同學(xué)可以直接訪(fǎng)問(wèn)感知機的暴力實(shí)現,以獲得最佳的閱讀體驗。
我們知道,直線(xiàn)(或者超平面)的方程為(下面的 

本文就來(lái)介紹感知機如何通過(guò)一種看似暴力的方法來(lái)尋找合適的 

2.1 點(diǎn)積的正負與夾角的大小
根據點(diǎn)積的知識,可以知道點(diǎn)積的正負與夾角的大小如下:

2.2 法向量


比如二維空間中, 


同樣的道理,在三維空間中 


2.3 超平面的兩側







比如二維空間中的直線(xiàn) 

根據上述結論可得:





三維空間也是一樣的,假設平面 

根據上述結論可得:





3.1 隨便找的直線(xiàn)
下面是用來(lái)作例子的數據集,其中 


然后隨便(對,就是隨便,要不怎么叫暴力實(shí)現)找一條直線(xiàn) 


3.2 是否分對
下面來(lái)判斷該直線(xiàn)的對錯。我們希望標簽 y=+1的特征向量在直線(xiàn) 







同理,分錯的點(diǎn) 


3.3 小結
綜上,判斷 
分對:
分錯:
如果所有的 




4.1 拉近
比如下面是標簽 y=+1 的







那就想辦法將法向量拉近一些。根據向量加法的平行四邊形法則,可以看到



所以用 



4.2 推遠
而下面是標簽 y=-1 的 



所以用 



4.3 小結
總結下,當標簽為 


此時(shí),只需要令 


下面給一個(gè)例子來(lái)進(jìn)一步說(shuō)明該結論。
4.4 錯誤糾正的例子
例 如下圖所示:

標簽為 y=-1 的向量

解 通過(guò)看圖,或者進(jìn)行計算(該直線(xiàn)的法向量為 

應該將法向量 

修正后的直線(xiàn)為 




5.1 
只需要


糾錯后, 
5.2 持續糾錯
可是,原本沒(méi)有錯的 



5.3 找到?jīng)Q策邊界
還有錯,還得繼續:

最后,法向量為 

(1)令權重向量 


所以初始函數為:

(2)順序遍歷數據集,從中得到 
(3)如果分錯了,即

則進(jìn)行更正(因為剛開(kāi)始 

(4)轉至(2),直到找到合適的 




此時(shí)可以說(shuō),該超平面 
6.1 實(shí)現
語(yǔ)言描述的算法可能有歧義,下面是按照上面步驟實(shí)現的代碼,可以幫助同學(xué)們精確理解感知機的暴力實(shí)現:
import numpy as npimport matplotlib.pyplot as pltfrom sklearn.linear_model import Perceptronfrom 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 是向量的點(diǎn)積
# 歷史信用卡發(fā)行數據# 這里的數據集不能隨便修改,否則下面的暴力實(shí)現可能停不下來(lái)X = np.array([[5,2], [3,2], [2,7], [1,4], [6,1], [4,5]])y = np.array([-1, -1, 1, 1, -1, 1])
# 感知機的暴力實(shí)現is_modified = True # 記錄是否有分錯的點(diǎn)while is_modified: # 循環(huán),直到?jīng)]有分錯的點(diǎ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
# 下面是繪制的代碼,主要展示暴力實(shí)現的結果,看不懂也沒(méi)有關(guān)系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 中的感知機,這里是為了借用該感知機的接口,便于繪制決策區域clf = Perceptron().fit(X, y)# 根據上面暴力實(shí)現得到的 w 和 b 來(lái)修改感知機clf.coef_[0][0], clf.coef_[0][1], clf.intercept_[0] = w[0], w[1], b
# 設置字體大小plt.rcParams.update({'font.size': 14})# 設置畫(huà)布和坐標系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')
# 決定繪制區域的大小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())
# 繪制決策區域plot_contours(ax, clf, xx, yy, cmap=cm, alpha=0.4)
# 繪制決策直線(xiàn)lx = np.linspace(xx.min(), xx.max())ly = - w[0] / w[1] * lx - b / w[1]ax.plot(lx, ly, 'k-')
# 根據類(lèi)別不同,繪制不同形狀的點(diǎn)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()我們通過(guò)通俗易懂、圖形化的方式,對機器學(xué)習中的《監督式學(xué)習》進(jìn)行了精講,目前還在連載中,可以享受早鳥(niǎo)價(jià)格,可以點(diǎn)擊下面的鏈接購買(mǎi):
?? 也可以直接點(diǎn)擊下面這個(gè)圖片購買(mǎi)機器學(xué)習的前置課程,《線(xiàn)性代數》、《單變量微積分》、《多變量微積分》、《概率論與數理統計》:

馬同學(xué)高等數學(xué)
看圖學(xué)數學(xué)
微信公眾號ID :matongxue314
聯(lián)系客服