Python學習part7:感知機原理及理解
感知機介紹
感知機的思想很簡單,比如我們在一個平臺上有很多的男孩女孩,感知機的模型就是嘗試找到一條直線,能夠把所有的男孩和女孩隔離開。放到三維空間或者更高維的空間,感知機的模型就是嘗試找到一個超平面,能夠把所有的二元類別隔離開。
本篇文章我們主要以二維平面來進行介紹
感知機的直觀感受
當我們有可分區間時,就會計算出一條直線將兩類點分開
當沒有可分區間時直線會不固定(盪來盪去至迭代上限停止)
感知機模型的建造
爲了搭建感知機模型,我們要清楚高維數據的線性可分指什麼。因此我們需要定義一個超平面的概念
wx+b=0這裏的w和x指n維向量
由於本篇文章只研究二維平面,故可以將公式轉成
w1x1+w2x2+b=0(即Ax+By+C=0)
簡單來說就是通過Ax+By+C=0這條直線將平面上的不同類點分開
感知機的訓練
"""
令w1,w2,...wn,v都是實數(R) ,其中至少有一個wi不爲零,由所有滿足線性方程w1*x1+w2*x2+...+wn*xn=v
的點X=[x1,x2,...xn]組成的集合,稱爲空間R的超平面。
從定義可以看出:超平面就是點的集合。集合中的某一點X,與向量w=[w1,w2,...wn]的內積,等於v
特殊地,如果令v等於0,對於訓練集中某個點X:
w*X=w1*x1+w2*x2+...+wn*xn>0,將X標記爲一類
w*X=w1*x1+w2*x2+...+wn*xn<0,將X標記爲另一類
"""
import numpy as np
import matplotlib.pyplot as plt
#np.random.randn(x,y,z)中x指矩陣數,y指矩陣行數,z指矩陣列數,np.random.rand()同
#randn函數返回一個或一組樣本,具有標準正態分佈。
p_x = (np.random.randn(100, 2) *25) #目的獲得座標(x,y),*25表示放大25倍,一般x軸範圍在放大倍數的四倍,如放大25,則x範圍在(-50,50)最佳
p_y = np.zeros((100, 1)) #np.zeros(())指將設置p_y爲空數組
for i in range(len(p_x)):
p_y[i] = p_x[i][0] + p_x[i][1] - 25 #表示分界線y=-x+25,分界線以上爲正,以下爲負
#p_y[i] = p_x[i][0] + 0.5*p_x[i][1] - 25#分界線不唯一,可以考慮修改斜率
#np.sign()是取數字符號(數字前的正負號)的函數,如p_y<0則y=-1,p_y=0則y=0,p_y=1則y=1
y = np.sign(p_y).astype(np.int8) #目的轉換p_y的類型,及浮點數轉化整形
#判斷可分分界線上下不同點的顏色
for i in range(len(p_x)):
if y[i] == 1:
plt.plot(p_x[i][0], p_x[i][1], 'ro')
else:
plt.plot(p_x[i][0], p_x[i][1], 'bo')
#通過y=wx+b其中w,x均爲n維向量
w = np.array([0.,0.]) #初始化w,保證收斂性
b = 0 #初始化b
delta = 0.00001 #learning_rate(與循環次數要同步,學習率小,循環次數增加)
#訓練(因爲上面已經進行了標準化處理,我們通過y=wx+b來感知分佈區間的點)
for i in range(10000):
temp = -1
for j in range(len(p_x)):#這裏j爲非負數
if y[j] != np.sign(np.dot(w, p_x[j]) + b):
temp = j
break
if temp == -1:
break
#print(y[temp], p_x[temp], temp, np.dot(w, p_x[j]) + b, w, b)
#按照標準進行不斷的學習和改正w和b的值,使得分佈趨於正確
w += delta * y[temp] * p_x[temp]
b += delta * y[temp]
line_x = [-50, 50]#兩層
line_y = [0, 0]
for i in range(len(line_x)):
line_y[i] = (-w[0] * line_x[i] - b) / w[1]#Ax+By+C=0-->y=(-Ax-C)/B
print(w[0])#由於擬合斜率趨於-1,w[0],w[1]近乎相近
print(w[1])
plt.plot(line_x, line_y)
print(line_x, line_y)
plt.grid(True)#格子
plt.show()
下面是幾張訓練完的效果圖
初次接觸感知機,只是瞭解到皮毛,以上爲個人見解,若是有誤,歡迎交流
Ending!