機器學習之權重、偏置自動調參
阿新 • • 發佈:2018-11-01
背景
這段時間在學習神經網路相關的內容,神經網路的演算法裡面只要給定它特徵值丟進去,演算法就會自身跟新權重和誤差(偏置)。其實學習機器學習內容的時候,我對這些演算法過程是理解的,但是我對細節是模糊的。
所以,我需要寫點程式碼,在電腦裡面跑一下,自己才能領會到演算法的真正含義。
開始講解
那麼,下面我就列舉一個輸入為二維的特徵值,輸出為一維的簡單的神經網路模擬。
例如:A有兩個特徵值,一個特徵值是他有棍子,另一個特徵值是他會躁動。現在我們有10組樣本,每個樣本的特徵值對應著A是否會和你打架的真實值。
x = [(1,1),(0.9,1.8),(2.3,1),(2.8,1.5),(1.3,4),(6,4.6),(4.2,5.1),(5.1,6.6),(6.2,5.6),(4.6,5.2)] y = [-1,-1,-1,-1,1,1,1,1,1,1]
例如上面,x
就是特徵值,比如第一個樣本(1,1)
就是A有棍子的概率為1,A會躁動的概率為1,此時對應y
真實值是-1
,那麼表示A不會生氣。再比如,最後一個樣本(4.6,5.2)
,就是A有棍子的概率為4.6,A會躁動的概率為5.2,此時A對應的真實值為1,那麼表示此時A會生氣。
上面10組樣本就是真實情況下發生的,可以理解我10次惹了A,其中4次A沒有生氣,6次A生氣了。
那麼,我現在想弄一個演算法出來,當下一次我再惹A時候,我輸入A有棍子的概率和A會躁動的概率,然後演算法自動給出此時會不會生氣,那麼根據演算法來判斷我該不該惹A了,哈哈哈,是不是很好玩。
程式碼
我使用的是PyCharm軟體進行程式碼編寫,程式碼寫的也比較簡單,需要匯入matplotlib
另外,我對引數 進行初始賦值,分別為0.5,0.5,0.5 。這個初始值可以隨便賦值,反正你把樣本丟進去,這些引數會自動調參。因為我的樣本比較少,訓練個5~6邊權重和偏置基本就穩定下來了。
好了,廢話不多說,直接上程式碼~
import matplotlib.pyplot as plt
class Perceptron:
w1, w2, b = 0.5, 0.5, 0.5
x = [(1,1),(0.9,1.8),(2.3,1),(2.8,1.5),(1.3,4),(6,4.6),(4.2,5.1),(5.1,6.6),(6.2,5.6),(4.6,5.2)]
y = [-1,-1,-1,-1,1,1,1,1,1,1]
# 設定X軸標籤
plt.xlabel('X')
# 設定Y軸標籤
plt.ylabel('Y')
def show(self):
mark = []
color = []
# 把特徵值提取出來,x1是其中一個特徵值,使用元組來儲存,有多維
x1, x2 = zip(*self.x)
for i in range(10):
s = self.w1 * x1[i] + self.w2 * x2[i] + self.b
if s>0:
color.append('red')
mark.append('x')
else:
color.append('blue')
mark.append('o')
for _k,_c,_x1,_x2 in zip(mark,color,x1,x2):
plt.scatter(_x1,_x2,s=100,c=_c)
# mark引數不能用,不知道為什麼
# plt.scatter(_x1, _x2,mark = _k, s=100, c=_c)
s1 = (0,-self.b/self.w2)
s2 = (8,(-self.b-8*self.w1)/self.w2)
plt.plot([s1[0],s2[0]],[s1[1],s2[1]],'k-',linewidth=2.0,color='g')
plt.show()
def learn(self):
x1,x2 = zip(*self.x)
# 訓練次數10
for _ in range(10):
# 開始對每組樣本的特徵進行調參
for i in range(10):
s = self.w1 * x1[i] + self.w2 * x2[i] + self.b
if(s*self.y[i] <=0 ):
self.w1 += self.y[i] * x1[i]
self.w2 += self.y[i] * x2[i]
self.b += self.y[i]
print(self.w1,self.w2,self.b)
self.show()
#main
p = Perceptron()
p.learn()