Python學習part7:感知機原理及理解

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!

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章