用Python實現感知機 (python機器學習一)


0x01 感知機

感知機是一種二類分類的線性分類器,屬於判別模型(另一種是生成模型)。簡單地說,就是通過輸入特征,利用超平面,將目標分為兩類。感知機是神經網絡和支持向量機的基礎。

假設輸入空間為,輸出空間是.其中為一個特征向量,

定義從輸入空間到輸出空間的函數:為感知機。為感知機的權重,為偏置量,

感知機最終得到的結果是通過一個超平面,將正實例點和負實例點區分開。對應於二維平面,即通過確定一條直線對分布於平面坐標系中的兩種點進行區分,已達到給出一個點的坐標(特征向量),就能確定這個點的類別。

0x02 算法

監督學習有三大要素,模型,策略,和算法。我們采用的是感知機學習模型,下面我們說一下算法和學習策略。

具體步驟:

  1. 確定初始的
  2. 隨機從訓練樣本中選取點,預測值為
  3. 如果預測值不等於真實值,即,更新
  4. 重復步驟2、3,直到達到訓練次數或小於指定誤差;
  5. 輸入未知點的特征向量

而在第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-近鄰算法。

本人也是機器學習新手,上面的介紹都是我在學習過程中的總結,如有不正確的地方,歡迎指正。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM