統(tǒng)計(jì)學(xué)習(xí)方法筆記:2.感知機(jī)

這是我參加mlhub123組織的書(shū)籍共讀計(jì)劃的讀書(shū)筆記,活動(dòng)見(jiàn)mlhub第一期讀書(shū)計(jì)劃

  • 閱讀章節(jié):第二章:感知機(jī)
  • 開(kāi)始時(shí)間:2018-09-18
  • 結(jié)束時(shí)間:2018-09-21
  • 目標(biāo):讀完第二章,掌握基本概念,產(chǎn)出一篇筆記
  • 博客地址

本章主要介紹了二類分類的線性分類模型:感知機(jī):

  • 感知機(jī)模型
  • 感知機(jī)學(xué)習(xí)策略
  • 感知機(jī)學(xué)習(xí)算法

說(shuō)明:個(gè)人感覺(jué)這本書(shū)偏理論化,講究的是一招定天下,好處是內(nèi)功深厚自然無(wú)敵,一通百通,但難處是語(yǔ)言有點(diǎn)晦澀,這章可以考慮結(jié)合我之前的一篇關(guān)于感知器的筆記,或許能加深理解,見(jiàn)這里

感知機(jī)模型

感知機(jī)(perceptron):是一個(gè)二類分類的線性判斷模型,其輸入為實(shí)例的特征向量,輸出為實(shí)例的類別,取+1–1值,屬于判別模型

注:+1 -1 分別代表正負(fù)類,有的可能用 1 0 表示

在介紹感知機(jī)定義之前,下面幾個(gè)概念需要說(shuō)明一下:

  • 輸入空間:輸入所有可能取值的集合
  • 輸出空間:輸出所有可能取值的集合
  • 特征空間:每個(gè)具體的輸入是一個(gè)實(shí)例,由特征向量表示

所以對(duì)于一個(gè)感知機(jī)模型,可以這樣表示:

  • 輸入空間(特征空間):\chi \subseteq \mathbb{R} ^n
  • 輸出空間:\gamma = \\{+1,-1 \\}

那么感知機(jī)就是由輸入空間到輸出空間的函數(shù):

\displaystyle f( x) \ =\ sign( w\cdot x+b)

其中:

  • sign: 符號(hào)函數(shù)
  • w: 權(quán)值(weight)或權(quán)值向量(weight vector)
  • b: 偏置(bias)

感知機(jī)的幾何解釋如下:線性方程

w\cdot x + b =0

如果是二維空間,感知機(jī)就是一個(gè)線性函數(shù),將正負(fù)樣本一分為二,如何是三維空間,那么感知機(jī)就是一個(gè)平面將類別一切為二,上升到n維空間的話,其對(duì)應(yīng)的是特征空間\mathbb{R} ^n的一個(gè)超平面S

  • w: 超平面的法向量
  • b: 超平面的截距

感知機(jī)學(xué)習(xí)策略

數(shù)據(jù)集的線性可分性

什么是數(shù)據(jù)集的線性可分性,很簡(jiǎn)單,對(duì)于一個(gè)數(shù)據(jù)集:

T = \{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}

如果存在上面一節(jié)說(shuō)的超平面Sw\cdot x + b =0,能夠?qū)?shù)據(jù)集的正實(shí)例點(diǎn)和負(fù)實(shí)例點(diǎn)完全正確地劃分到超平面的兩側(cè),則稱數(shù)據(jù)集T為線性可分?jǐn)?shù)據(jù)集(linearly separable data set),否則,稱數(shù)據(jù)集T線性不可分

感知機(jī)學(xué)習(xí)策略

找出超平面S,其實(shí)就是確定感知機(jī)模型參數(shù):w b,根據(jù)統(tǒng)計(jì)學(xué)習(xí)方法三要素,此時(shí)我們需要確定一個(gè)學(xué)習(xí)策略,比如前面所說(shuō)的損失函數(shù)(經(jīng)驗(yàn)函數(shù)),并使其最小化(猜也猜得到策略講完,后面就是說(shuō)學(xué)習(xí)算法了哈哈)

上一章以線性代數(shù)為例子,用損失函數(shù)來(lái)度量預(yù)測(cè)錯(cuò)誤的程度,這里的損失函數(shù)可以用誤分類點(diǎn)到超平面S的總距離,輸入空間\mathbb{R} ^n中任一點(diǎn)x_0到超平面S的距離:

\frac{1}{||w||}|w\cdot x_0+b|

其中,||w||wL_2范數(shù),假設(shè)超平面S的誤分類點(diǎn)集合為M,那么所有誤分類點(diǎn)到超平面S的總距離為:

-\frac{1}{||w||}\sum_{x_i\in M} y_i(w\cdot x_i + b)

最終推導(dǎo)出感知機(jī)學(xué)習(xí)的損失函數(shù):

L(w,b) =-\sum_{x_i\in M} y_i(w\cdot x_i + b)

感知機(jī)學(xué)習(xí)算法

上面一節(jié)已經(jīng)確定了學(xué)習(xí)策略,按照統(tǒng)計(jì)學(xué)習(xí)方法三要素,目前需要一個(gè)算法來(lái)求解,目前最優(yōu)化的方法是隨機(jī)梯度下降法

感知機(jī)學(xué)習(xí)算法的原始形式

現(xiàn)在感知機(jī)學(xué)習(xí)算法就是對(duì)下面最優(yōu)化問(wèn)題的算法:

\min\_{w,b} L(w,b) =-\sum_{x_i\in M} y_i(w\cdot x_i + b)

現(xiàn)在的問(wèn)題就轉(zhuǎn)化成,求出參數(shù)wb,使得上列損失函數(shù)達(dá)到極小化,這里我直接貼出書(shū)中的算法,后面的例子我會(huì)用Python代碼實(shí)現(xiàn):

image

有了解題方法怎么能沒(méi)有題目呢?李杭老師自然是考慮到了,請(qǐng)聽(tīng)題:

image

image

借用Linus Torvalds大佬的一句話:Talk less, show me your code,所以直接看代碼吧:

#!/usr/bin/env python
"""
 Created by howie.hu at 2018/9/20.
"""
import numpy as np


class Perceptron:
    """
    李航老師統(tǒng)計(jì)學(xué)習(xí)方法第二章感知機(jī)例2.1代碼實(shí)現(xiàn)
    """

    def __init__(self, input_nums=2):
        # 權(quán)重 已經(jīng)確定只會(huì)有兩個(gè)二進(jìn)制輸入
        self.w = np.zeros(input_nums)
        # 偏置項(xiàng)
        self.b = 0.0

    def fit(self, input_vectors, labels, learn_nums=10, rate=1):
        """
        訓(xùn)練出合適的 w 和 b
        :param input_vectors: 樣本訓(xùn)練數(shù)據(jù)集
        :param labels: 標(biāo)記值
        :param learn_nums: 學(xué)習(xí)多少次
        :param rate: 學(xué)習(xí)率
        """
        for i in range(learn_nums):
            for index, input_vector in enumerate(input_vectors):
                label = labels[index]
                delta = label * (sum(self.w * input_vector) + self.b)
                if delta <= 0:
                    self.w += label * input_vector * rate
                    self.b += rate * label
                    break
        print("最終結(jié)果:此時(shí)感知器權(quán)重為{0},偏置項(xiàng)為{1}".format(self.w, self.b))
        return self

    def predict(self, input_vector):
        if isinstance(input_vector, list):
            input_vector = np.array(input_vector)
        y = sum(self.w * input_vector) + self.b
        return 1 if y > 0 else -1


if __name__ == '__main__':
    input_vectors = np.array([[3, 3], [4, 3], [1, 1]])
    labels = np.array([1, 1, -1])
    p = Perceptron()
    model = p.fit(input_vectors, labels)
    print(model.predict([3, 3]))
    print(model.predict([4, 3]))
    print(model.predict([1, 1]))

輸出如下:

最終結(jié)果:此時(shí)感知器權(quán)重為[ 1.  1.],偏置項(xiàng)為-3.0
1
1
-1

算法的收斂性

對(duì)于線性可分?jǐn)?shù)據(jù)集感知機(jī)學(xué)習(xí)算法原始形式收斂,即經(jīng)過(guò)有限次迭代可以得到一個(gè)將訓(xùn)練數(shù)據(jù)集完全正確劃分的分離超平面及感知機(jī)模型,定理2.1如下:

假設(shè)訓(xùn)練數(shù)據(jù)集T = \{(x_1,y_1),(x_2,y_2),...,(x_n,y_n)\}是線性可分的,其中x_i\in \chi =\mathbb{R} ^n,y_i \in \gamma =\\{-1, 1\\},i=1,2,...,N,則有:

image

感知機(jī)學(xué)習(xí)算法的對(duì)偶形式

為什么要介紹感知機(jī)學(xué)習(xí)算法的對(duì)偶形式,主要目的就是減少運(yùn)算量,這里一個(gè)知乎回答得挺好:

image
image

代碼實(shí)現(xiàn)如下:

#!/usr/bin/env python
"""
 Created by howie.hu at 2018/9/21.
"""

import numpy as np


class Perceptron:
    """
    李航老師統(tǒng)計(jì)學(xué)習(xí)方法第二章感知機(jī)例2.2對(duì)偶形式代碼實(shí)現(xiàn)
    """

    def __init__(self, alpha_length=3):
        self.alpha = np.zeros(alpha_length)
        # 權(quán)重
        self.w = np.zeros(2)
        # 偏置項(xiàng)
        self.b = 0.0

    def fit(self, input_vectors, labels, learn_nums=7):
        """
        訓(xùn)練出合適的 w 和 b
        :param input_vectors: 樣本訓(xùn)練數(shù)據(jù)集
        :param labels: 標(biāo)記值
        :param learn_nums: 學(xué)習(xí)多少次
        """
        gram = np.matmul(input_vectors, input_vectors.T)

        for i in range(learn_nums):

            for input_vector_index, input_vector in enumerate(input_vectors):
                label = labels[input_vector_index]
                delta = 0.0
                for alpha_index, a in enumerate(self.alpha):
                    delta += a * labels[alpha_index] * gram[input_vector_index][alpha_index]
                delta = label * delta + self.b
                if delta <= 0:
                    self.alpha[input_vector_index] += 1
                    self.b += label
                    break
        self.w = sum([j * input_vectors[i] * labels[i] for i, j in enumerate(self.alpha)])
        print("最終結(jié)果:此時(shí)感知器權(quán)重為{0},偏置項(xiàng)為{1}".format(self.w, self.b))
        return self

    def predict(self, input_vector):
        if isinstance(input_vector, list):
            input_vector = np.array(input_vector)
        y = sum(self.w * input_vector) + self.b
        return 1 if y > 0 else -1


if __name__ == '__main__':
    input_vectors = np.array([[3, 3], [4, 3], [1, 1]])
    labels = np.array([1, 1, -1])
    p = Perceptron()
    model = p.fit(input_vectors, labels)
    print(model.predict([3, 3]))
    print(model.predict([4, 3]))
    print(model.predict([1, 1]))
最終結(jié)果:此時(shí)感知器權(quán)重為[ 1.  1.],偏置項(xiàng)為-3.0
1
1
-1

說(shuō)明

一些概念的詳細(xì)解釋:

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖,帶你破解...
    沈念sama閱讀 227,797評(píng)論 6 531
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 98,179評(píng)論 3 414
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人,你說(shuō)我怎么就攤上這事。” “怎么了?”我有些...
    開(kāi)封第一講書(shū)人閱讀 175,628評(píng)論 0 373
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)。 經(jīng)常有香客問(wèn)我,道長(zhǎng),這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 62,642評(píng)論 1 309
  • 正文 為了忘掉前任,我火速辦了婚禮,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘。我一直安慰自己,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 71,444評(píng)論 6 405
  • 文/花漫 我一把揭開(kāi)白布。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上,一...
    開(kāi)封第一講書(shū)人閱讀 54,948評(píng)論 1 321
  • 那天,我揣著相機(jī)與錄音,去河邊找鬼。 笑死,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 43,040評(píng)論 3 440
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起,我...
    開(kāi)封第一講書(shū)人閱讀 42,185評(píng)論 0 287
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 48,717評(píng)論 1 333
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 40,602評(píng)論 3 354
  • 正文 我和宋清朗相戀三年,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 42,794評(píng)論 1 369
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情,我是刑警寧澤,帶...
    沈念sama閱讀 38,316評(píng)論 5 358
  • 正文 年R本政府宣布,位于F島的核電站,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 44,045評(píng)論 3 347
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 34,418評(píng)論 0 26
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)。三九已至,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 35,671評(píng)論 1 281
  • 我被黑心中介騙來(lái)泰國(guó)打工, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 51,414評(píng)論 3 390
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 47,750評(píng)論 2 370

推薦閱讀更多精彩內(nèi)容