統計機器學習 感知機

2021-09-19 12:46:27 字數 4051 閱讀 9548

今天開始, 要開始學李航的統計機器學習了,雖然現在都是深度學習橫著走,但基礎的東西還是要學起來的,一直想學這本書,因為太多別的事情,一直在拖,今天決定不再拖延,在五一之前都專心學李航這本書,把該掌握的都掌握了。(立下乙個不可能實現的flag)

本部落格不會詳細介紹書裡的內容,主要作為我個人的筆記記錄,(畢竟有書,我沒必要把書抄一遍)。另外會貼大佬的**並進行必要的講解,不過終究是大佬的**,這次學習不打算自己復現模型,以快速學習為主要,部分深入學習的形式來學這本書。

我不會很細緻地講,因為我沒有這個水平。

感知機的公式為:f(x) = sign(w·x + b)

其中:w,b:為模型的訓練引數

x:為模型的輸入

f(x):為模型的輸出(也就是**結果,注意這裡不是正確答案,而是**答案,我剛開始學就沒分清楚這個,為我自己標註)。

sign(x):為符號函式(選擇函式):sign(x) = +1 if x>=0, -1 if x < 0。(emmm,這表示式好像有什麼不對的樣子)

為了方便起見,我們認為我們的目標是進行二分類,並且資料是線性可分的,所謂的線性可分,就是資料樣本可以被一條直線或者乙個超平面(注意是平的)劃分成兩部分,一部分是正樣本,一部分是負樣本(正負只是說法上的習慣,並不是說真的一定是正負的樣本,所以我為什麼這麼囉嗦)。

那麼,這個超平面s是什麼呢? 

書裡給出的公式是w·x + b = 0。

這裡有乙個需要注意的點,剛開始學機器學習的時候,總是會把習慣上的y = kx + b和模型中的y聯絡在一起,然而,因為我當時這麼聯絡,總是會在腦海中構建座標系的時候,把y也加進去,導致越學越亂,雖然加進去是對的,但是大多數教材都習慣性不建立這個y軸,畢竟在分類任務中,y的取值很有限,沒必要為了y值建立一條座標軸。所以,我們建立乙個沒有y軸的座標系,座標軸都有x(x1, x2, x3, .. , xn)組成,也就是特徵組成。

那麼到這裡就能清楚了,這個乙個在由座標軸x(x1, x2, x3, .., xn)組成的座標系中的乙個超平面,其中,w(w1, w2, w3, .. , wn),為每個特徵的係數(在二維平面上我們稱之為斜率,沒錯,是一樣的),b(b1, b2, b3, .. , bn)則是每個座標系上的截距。其實就是因為變成了向量形式,所以稍微需要轉轉彎才能想明白(像我就需要轉好多好多彎,才想明白)。

ok!有了超平面的公式了,現在的任務就是確定超平面,那麼怎麼確定超平面呢? 

我們首先明確,我們設定這個超平面是為了什麼?沒錯,正確劃分資料樣本,那麼只要能正確劃分資料樣本,這個超平面就是我們想要的超平面,那麼怎麼評判這個超平面正確劃分了資料樣本呢?

這個時候就由大名鼎鼎的損失函式登場了,書中選擇的損失函式是統計每個誤分類點到超平面s的距離。

其中點到超平面的距離公式為:

誤分類點xi到超平面的距離為

由於損失函式是所有誤分類點到超平面的距離的和,對應的公式為:

其中m為誤分類點集合。

學習演算法也就是訓練模型的方法,書中採用梯度下降的方式最小化損失函式(也就是訓練模型)。

梯度下降具體怎麼工作的,學過高數的同學肯定都知道,凸函式只有乙個極值,且這個極值為最值。為了便於理解,我們只討論二維平面上的凸函式,且這個極值就是極小值(最小值),當然,極大值也是可以的,只是換個方向,沒有太多變化。

那麼梯度下降具體怎麼工作的呢?(這裡不打算討論細緻,感興趣的同學直接查閱梯度下降),其實梯度下降就是乙個找到極值點(損失函式的極值點)的操作,通過計算損失函式關於每個wi的導數,來更新每個wi,bi同理。至於為什麼可以這麼做呢,因為這樣可以讓損失變小,更具體的就不討論了,因為我懶。

感知機學習演算法的原始形式:(其他形式不討論)步驟如下:

1. 選取初值x0,b0。

2. 在訓練集中選取資料(xi, yi)。

3. 如果yi(w·x+b)<=0

w xiyi

b yi

4. 轉至2,直至訓練集中沒有誤分類點。

# 資料線性可分,二分類資料

# 此處為一元一次線性方程

class model:

def __init__(self):

self.w = np.ones(len(data[0])-1, dtype=np.float32)

self.b = 0

self.l_rate = 0.1

# self.data = data

def sign(self, x, w, b):

y = np.dot(x, w) + b

return y

# 隨機梯度下降法

def fit(self, x_train, y_train):

is_wrong = false

while not is_wrong:

wrong_count = 0

for d in range(len(x_train)):

x = x_train[d]

y = y_train[d]

if y * self.sign(x, self.w, self.b) <= 0:

self.w = self.w + self.l_rate*np.dot(y, x)

self.b = self.b + self.l_rate*y

wrong_count += 1

if wrong_count == 0:

is_wrong = true

return 'perceptron model!'

def score(self):

pass

perceptron = model()

perceptron.fit(x, y)

可以看到,model類中,有初始化init,符號函式sign,訓練函式fit

其中inti為初始化引數w,b,還有設定學習速率l_rate(也就是梯度下降的速度)。

符號函式sign,這個符號函式是假的,由於對於後面的計算,只需要判定結果是否為非負或者負即可,是不是符號函式並不影響。(大佬,我幫你把場子圓回來了)。

訓練函式fit,由於這個比較重要,我重點講一下,(敲黑板!!)。其中

wrong_count:表示模型誤分類的個數。

if y * self.sign(x, self.w, self.b) <= 0:為判斷當前樣本點是否會被誤分類,如果滿足條件,則為誤分類,則進行梯度下降並增加誤分類個數wrong_count。(這裡是<=0而不是>0是因為,他沒有加負號,所以沒有問題,自以為你們會在這裡有疑惑,因為跟上面不一樣)。

self.w = self.w + self.l_rate*np.dot(y, x)和self.b = self.b + self.l_rate*y:對w,b進行更新,也就是梯度下降。這個公式與我們第三節3對應。注意這裡的np.dot是矩陣乘法,不是點乘。所以np.dot(y, x)結果是乙個矩陣。

fit的最後就是乙個誤分類樣本都沒有了,不過這個太理想了,一般會設定閾值或者是訓練次數來提前結束訓練。

1.《統計機器學習》 -- 李航,清華大學出版社。(印次:2023年11月第16次印刷)。

2. github: 

機器學習 感知機

感知機是一種簡單的二類分類的線性分類模型,用於處理可以線性可分的二分類問題。感知機對應於輸入空間 特徵空間 中將例項劃分為正負兩類的分離超平面,屬於判別模型。模型。從輸入空間到輸出空間有如下函式 f x s ign wtx b 其中w 為權值,b為偏執。生成的超平面為 wt x b 0 其中w 為超...

機器學習 感知機

r nx rn 輸出空間為y 輸入x x x x表示例項的特徵向量,對應於輸入空間的點 輸出y y表示示例的類別。由輸入空間到輸出空間的函式為 x si gn w x b f x sign w x b x w x表示w和x的點積i 1mwi xi w 1x1 w2x2 wnx n i 1mwixi ...

機器學習 感知機

1 感知機是二分類的線性模型,輸入空間是例項的特徵向量,輸出是例項的類別 1,1 屬於判別模型。2 假設資料線性可分,感知機的學習目標是求得乙個能夠將訓練集資料正例和負例完全分開的分離超平面,如果訓練資料線性不可分,那麼就無法獲得這個超平面 抑或問題 針對抑或問題,解決方法是多層感知機組合。3 輸入...