** 簡介:學(xué)習(xí)機器學(xué)習(xí)已經(jīng)半年時間了,在讀了李航博士的《統(tǒng)計學(xué)習(xí)方法》后受益匪淺,一掃學(xué)習(xí)初期頭腦中的陰云。然而,紙上得來終覺淺,不親身實踐親手操作一下怎么能號稱自己入了機器學(xué)習(xí)的門呢。本系列分享將會使用python的sklearn庫,將《統(tǒng)計學(xué)習(xí)方法》書中講解的各個算法進(jìn)行實現(xiàn),希望加深自己理解的同時和其他人一同學(xué)習(xí)交流。**
一、感知機(perceptron)
感知機簡介:
- 感知機(perceptron)是二類分類的線性分類模型,其輸入為實例的特征向量,輸出為實例的類別。感知機對應(yīng)于輸入空間(特征空間)中將實例劃分為正負(fù)兩類的分離超平面。感知機是一種線性分類模型。
感知機實際上表示為輸入空間到輸出空間的映射函數(shù),如下所示:

其中,w和b稱為感知機的模型參數(shù),w叫做權(quán)值(weight)或權(quán)值向量(weight vector),b叫做偏置(bias),sign是符號函數(shù),其定義形式如下:

雖然有了感知機的定義形式,也知道了它的作用,但這樣看起來仍然不直觀,現(xiàn)在我用sklearn庫來做一個二維空間的感知機來演示一下感知機的實際效果。
首先,使用sklearn中的make_classification來生成一些用來分類的樣本。
from sklearn.datasets import make_classification
x,y = make_classification(n_samples=1000, n_features=2,n_redundant=0,n_informative=1,n_clusters_per_class=1)
#n_samples:生成樣本的數(shù)量
#n_features=2:生成樣本的特征數(shù),特征數(shù)=n_informative() + n_redundant + n_repeated
#n_informative:多信息特征的個數(shù)
#n_redundant:冗余信息,informative特征的隨機線性組合
#n_clusters_per_class :某一個類別是由幾個cluster構(gòu)成的
make_classification默認(rèn)生成二分類的樣本,上面代碼中,x代表了生成的樣本空間(特征空間),y代表了生成樣本的類別,使用1和0分別表示正例和反例:
y=[0 0 0 1 0 1 1 1... 1 0 0 1 1 0]
然后將生成的樣本分為訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù),并將其中的正例和反例也分開:
#訓(xùn)練數(shù)據(jù)和測試數(shù)據(jù)
x_data_train = x[:800,:]
x_data_test = x[800:,:]
y_data_train = y[:800]
y_data_test = y[800:]
#正例和反例
positive_x1 = [x[i,0] for i in range(1000) if y[i] == 1]
positive_x2 = [x[i,1] for i in range(1000) if y[i] == 1]
negetive_x1 = [x[i,0] for i in range(1000) if y[i] == 0]
negetive_x2 = [x[i,1] for i in range(1000) if y[i] == 0]
接下來,就開始真正的分類工作,首先定義一個感知機(percetpron):
from sklearn.linear_model import Perceptron
#定義感知機
clf = Perceptron(fit_intercept=False,n_iter=30,shuffle=False)
#使用訓(xùn)練數(shù)據(jù)進(jìn)行訓(xùn)練
clf.fit(x_data_train,y_data_train)
#得到訓(xùn)練結(jié)果,權(quán)重矩陣
print(clf.coef_)
#輸出為:[[-0.38478876,4.41537463]]
#超平面的截距,此處輸出為:[0.]
print(clf.intercept_)
此時,我們已經(jīng)得到了訓(xùn)練出的感知機模型參數(shù),那么這個感知機的分類能力怎么樣呢?我們利用測試數(shù)據(jù)對其進(jìn)行驗證。
#利用測試數(shù)據(jù)進(jìn)行驗證
acc = clf.score(x_data_test,y_data_test)
print(acc)
#得到的輸出結(jié)果為0.995,這個結(jié)果還不錯吧。
最后,我們將結(jié)果用圖形顯示出來,直觀地看一下感知機的結(jié)果:
from matplotlib import pyplot as plt
#畫出正例和反例的散點圖
plt.scatter(positive_x1,positive_x2,c='red')
plt.scatter(negetive_x1,negetive_2,c='blue')
#畫出超平面(在本例中即是一條直線)
line_x = np.arange(-4,4)
line_y = line_x * (-clf.coef_[0][0] / clf.coef_[0][1]) - clf.intercept_
plt.plot(line_x,line_y)
plt.show()
得到的圖如下所示:

PS:不得不說,簡書不能編輯公式這一點實在是太煩人。