0x01 感知機
感知機是一種二類分類的線性分類器,屬於判別模型(另一種是生成模型)。簡單地說,就是通過輸入特征,利用超平面,將目標分為兩類。感知機是神經網絡和支持向量機的基礎。
假設輸入空間為
,輸出空間是
.其中
,
為一個特征向量,
。
定義從輸入空間到輸出空間的函數:
為感知機。
為感知機的權重,
為偏置量,
。
感知機最終得到的結果是通過一個超平面,將正實例點和負實例點區分開。對應於二維平面,即通過確定一條直線對分布於平面坐標系中的兩種點進行區分,已達到給出一個點的坐標(特征向量),就能確定這個點的類別。
0x02 算法
監督學習有三大要素,模型,策略,和算法。我們采用的是感知機學習模型,下面我們說一下算法和學習策略。
具體步驟:
- 確定初始的
和
; - 隨機從訓練樣本中選取點
,預測值為
; - 如果預測值不等於真實值,即
,更新
和
; - 重復步驟2、3,直到達到訓練次數或小於指定誤差;
- 輸入未知點
的特征向量
,
。
而在第3步中如何更新
和
,則由學習策略來決定。這里我們的損失函數采用所有誤分類點到超平面的總距離,即
,
為誤分類點的集合。根據最小梯度下降法,
,
。這就是感知機學習模型的全部算法,下面用python來實現感知機。
0x03 代碼實現
首先定義符號函數:
1 # 符號函數 2 def sign(v): 3 if v > 0: 4 return 1 5 else: 6 return -1
訓練函數:
1 def training(): 2 train_data1 = [[1, 3, 1], [2, 5, 1], [3, 8, 1], [2, 6, 1]] # 正樣本 3 train_data2 = [[3, 1, -1], [4, 1, -1], [6, 2, -1], [7, 3, -1]] # 負樣本 4 train_datas = train_data1 + train_data2 # 樣本集 5 6 weight = [0, 0] # 權重 7 bias = 0 # 偏置量 8 learning_rate = 0.5 # 學習速率 9 10 train_num = int(raw_input("train num: ")) # 迭代次數 11 12 for i in range(train_num): 13 train = random.choice(train_datas) 14 x1, x2, y = train 15 predict = sign(weight[0] * x1 + weight[1] * x2 + bias) # 輸出 16 print("train data: x: (%d, %d) y: %d ==> predict: %d" % (x1, x2, y, predict)) 17 if y * predict <= 0: # 判斷誤分類點 18 weight[0] = weight[0] + learning_rate * y * x1 # 更新權重 19 weight[1] = weight[1] + learning_rate * y * x2 20 bias = bias + learning_rate * y # 更新偏置量 21 print("update weight and bias: "), 22 print(weight[0], weight[1], bias) 23 24 print("stop training: "), 25 print(weight[0], weight[1], bias) 26 27 return weight, bias
測試函數:
1 # 測試函數 2 def test(): 3 weight, bias = training() 4 while True: 5 test_data = [] 6 data = raw_input('enter test data (x1, x2): ') 7 if data == 'q': break 8 test_data += [int(n) for n in data.split(',')] 9 predict = sign(weight[0] * test_data[0] + weight[1] * test_data[1] + bias) 10 print("predict ==> %d" % predict)
0x04 總結
感知機是神經網絡和支持向量機的基礎,實現起來並不難,但是涉及到很多思想。接下來會寫寫k-近鄰算法。
本人也是機器學習新手,上面的介紹都是我在學習過程中的總結,如有不正確的地方,歡迎指正。
