1. 程式人生 > >機器學習之權重、偏置自動調參

機器學習之權重、偏置自動調參

背景

這段時間在學習神經網路相關的內容,神經網路的演算法裡面只要給定它特徵值丟進去,演算法就會自身跟新權重和誤差(偏置)。其實學習機器學習內容的時候,我對這些演算法過程是理解的,但是我對細節是模糊的。

所以,我需要寫點程式碼,在電腦裡面跑一下,自己才能領會到演算法的真正含義。


開始講解

那麼,下面我就列舉一個輸入為二維的特徵值,輸出為一維的簡單的神經網路模擬。
例如: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

庫,因為我把樣本用散點圖的形式表示出來。

另外,我對引數 w 1 , w 2 , b

w_1,w_2,b 進行初始賦值,分別為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()