** 簡介:學習機器學習已經半年時間了拦坠,在讀了李航博士的《統(tǒng)計學習方法》后受益匪淺盅安,一掃學習初期頭腦中的陰云网梢。然而,紙上得來終覺淺嘶窄,不親身實踐親手操作一下怎么能號稱自己入了機器學習的門呢。本系列分享將會使用python的sklearn庫距贷,將《統(tǒng)計學習方法》書中講解的各個算法進行實現(xiàn)柄冲,希望加深自己理解的同時和其他人一同學習交流。**
一忠蝗、感知機(perceptron)
感知機簡介:
- 感知機(perceptron)是二類分類的線性分類模型现横,其輸入為實例的特征向量,輸出為實例的類別。感知機對應于輸入空間(特征空間)中將實例劃分為正負兩類的分離超平面戒祠。感知機是一種線性分類模型骇两。
感知機實際上表示為輸入空間到輸出空間的映射函數(shù),如下所示:
其中姜盈,w和b稱為感知機的模型參數(shù)低千,w叫做權值(weight)或權值向量(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構成的
make_classification默認生成二分類的樣本葱绒,上面代碼中,x代表了生成的樣本空間(特征空間)斗锭,y代表了生成樣本的類別地淀,使用1和0分別表示正例和反例:
y=[0 0 0 1 0 1 1 1... 1 0 0 1 1 0]
然后將生成的樣本分為訓練數(shù)據(jù)和測試數(shù)據(jù),并將其中的正例和反例也分開:
#訓練數(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)
#使用訓練數(shù)據(jù)進行訓練
clf.fit(x_data_train,y_data_train)
#得到訓練結果,權重矩陣
print(clf.coef_)
#輸出為:[[-0.38478876,4.41537463]]
#超平面的截距豺撑,此處輸出為:[0.]
print(clf.intercept_)
此時烈疚,我們已經得到了訓練出的感知機模型參數(shù),那么這個感知機的分類能力怎么樣呢聪轿?我們利用測試數(shù)據(jù)對其進行驗證爷肝。
#利用測試數(shù)據(jù)進行驗證
acc = clf.score(x_data_test,y_data_test)
print(acc)
#得到的輸出結果為0.995,這個結果還不錯吧陆错。
最后灯抛,我們將結果用圖形顯示出來,直觀地看一下感知機的結果:
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:不得不說音瓷,簡書不能編輯公式這一點實在是太煩人对嚼。