統(tǒng)計學(xué)習(xí)方法——修煉學(xué)習(xí)筆記2:感知機

一唇礁、感知機的定義

感知機是1957年由Rosenblatt提出勾栗,是神經(jīng)網(wǎng)絡(luò)與支持向量機的基礎(chǔ),是二分類線性分類模型盏筐,輸入為實例的特征围俘,輸出為實例類別,實例類別取+1和-1琢融。感知機是屬于判別模型界牡,因為其求出分離超平面直接將輸入實例劃分為正例和負例。

導(dǎo)入基于誤分類的損失函數(shù)漾抬,利用梯度下降法對損失函數(shù)進行極小化宿亡,求得感知機模型

二、感知機的數(shù)學(xué)表達式

感知機的數(shù)學(xué)表達式可以由下列式子進行表達:

f=sign(w?x+b)
其中纳令,sign(x) 是一個記號函數(shù)她混,表示
當(dāng)x>=0,sign(x)=+1 烈钞;
當(dāng)x<0,sign(x)=?1 ;

三坤按、感知機的幾何意義

幾何意義是將幾何坐標(biāo)系上的點通過分離超平面將其劃分為兩個類別:正例和負例毯欣。【對于二維坐標(biāo)系來說】
如果是多維坐標(biāo)系臭脓,相當(dāng)于是一個多維面了酗钞。比如,二維空間是一條線来累,三維空間是一個面等等砚作。

四、感知機的目標(biāo)函數(shù)

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

感知機的目標(biāo):在訓(xùn)練數(shù)據(jù)集線性可分的假設(shè)前提下嘹锁,求得一個能夠?qū)⒂?xùn)練集中的正負樣本實例點完全正確分開的分離超平面葫录。
看到這,有人說领猾,訓(xùn)練數(shù)據(jù)集線性可分啥意思啊米同,聽不懂啊,其實就是針對

所有正實例y=+1摔竿,w?x+b>0 面粮;
所有負實例y=?1,w?x+b<0 继低;

一張圖表示其實就是這個樣子的:


image.png

這個數(shù)據(jù)集就是可分的熬苍,中間一條虛線即為超平面,將整個數(shù)據(jù)集分為虛線右上和左下部分袁翁。

目標(biāo)函數(shù)推導(dǎo)

通常意義上來說柴底,損失函數(shù)我們可以看誤分類點的總數(shù)。但是這樣來看粱胜,這樣的損失函數(shù)不是參數(shù)w和b的連續(xù)可導(dǎo)函數(shù)似枕,不易優(yōu)化。
因此年柠,感知機選擇另一種形式的損失函數(shù):
誤分類點到超平面S的總距離。
而平面上一點(x0,y0) 到超平面S 的距離distance0為:


image.png

其中褪迟, ||w||是w的L2范數(shù)冗恨。

對于誤分類點有兩種情況:

image.png

五、感知機的優(yōu)化方法

目前味赃,感知機的優(yōu)化方法采用的是梯度下降的方法掀抹,也就是我們所熟知的隨機梯度下降或者批量梯度下降。因為感知機有原始形式和對偶形式兩種方式心俗,故而分開來說傲武。

1蓉驹、 原始形式

image.png

隨機梯度下降

image.png

批量梯度下降

image.png

為什么用隨機梯度下降而不用批量梯度下降
這一點在李航大大的書上并沒有提及,只是根據(jù)筆者自己理解來說明原因揪利。
主要是從時間復(fù)雜方向來考慮态兴。
假設(shè)我們有m個樣本【準確來說,這里說m個誤分類樣本更為合適疟位,但是對于我們來說瞻润,我們需要對所有樣本進行判斷,如果誤分類甜刻,更新w和b绍撞。如果不是誤分類,那么不更新得院。其實傻铣,判斷誤分類樣本的過程也相當(dāng)于遍歷整個樣本】,每個樣本有n維特征向量祥绞,我們來分別計算在該場景下的時間復(fù)雜度非洲。
我們寫一下偽代碼:

for i in range(0, m+1):
if y[i] * (w*x[i]+b) < 0:
更新w, b
else:
w, b不更新

這里時間復(fù)雜度相當(dāng)于是樣本數(shù)*更新w,b 的時間復(fù)雜度。
因此就谜,
對于隨機梯度下降來說怪蔑,每次隨機選取一個誤分類樣本進行更新,樣本數(shù)為1丧荐,其計算的時間復(fù)雜度為O(n)缆瓣,
而對于批量梯度下降來說,每次需要對所有誤分類點進行求和更新虹统,每一個樣本更新w,b的時間復(fù)雜度為O(n) 弓坞,那么對于m 個樣本來說,時間復(fù)雜度為O(m?n)车荔。
我們分3種情況分別討論不同情況下的時間復(fù)雜度情況:
1)當(dāng)樣本量特別少的時候渡冻,即n>>m 時,其實兩者時間復(fù)雜度應(yīng)該差不多忧便。如果更在意精度的話族吻,建議選擇批量梯度下降,因為其更新信息是利用全局誤分類點信息珠增,精度相對于隨機梯度下降更高一些超歌,更新方向更接近全局解。
2)當(dāng)樣本量特別特別大的時候蒂教,即m>>n 巍举,此時批量梯度下降的更新時間的劣勢凸顯更為明顯一些,時間復(fù)雜度陡增凝垛。在可以適當(dāng)舍棄精度的同時懊悯,建議選擇隨機梯度下降蜓谋。
3)當(dāng)樣本量與特征維度近似時,這個時候批量梯度下降的時間復(fù)雜度約為隨機梯度下降的一倍炭分。需要進行準確性和性能兩個方面的綜合考量桃焕。
綜上所述,整體上來說欠窒,從工程和性能兩個方面考慮來說覆旭,可以以犧牲較小的準確性為代價,選擇隨機梯度下降岖妄。

2型将、對偶形式

我們回顧下w,b 的更新方式【這里只看隨機梯度下降方式】:


image.png

這里是每次通過修改誤分類點來更新下w,b,這里可以這么來考慮荐虐,我們通過修改次數(shù)來表達w,b的更新七兜。


image.png

為什么要轉(zhuǎn)化成對偶形式
這個建議先看完對偶形式的這個小節(jié)再回頭來看原因,當(dāng)然福扬,如果對原始形式和對偶形式都非常熟悉的話腕铸,也可以直接看。
既然有了原始形式铛碑,而且用隨機梯度下降也能達到較好的效果狠裹,那么為什么還要考慮對偶形式,對偶形式的優(yōu)勢具體體現(xiàn)在什么地方呢汽烦?
我們對比下原始形式和對偶形式的w,b 更新形式:
原始形式:

image.png

六涛菠、【代碼】

適用問題:二類分類

實驗數(shù)據(jù):
由于是二分類器,所以將MINST數(shù)據(jù)集train.csv的label列進行了一些微調(diào)撇吞,label等于0的繼續(xù)等于0俗冻,label大于0改為1。這樣就將十分類的數(shù)據(jù)改為二分類的數(shù)據(jù)牍颈。獲取地址train_binary.csv

實現(xiàn)代碼:

# encoding=utf-8

import pandas as pd
import random
import time

from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score


class Perceptron(object):

    def __init__(self):
        self.learning_step = 0.001  # 學(xué)習(xí)率
        self.max_iteration = 5000  # 分類正確上界迄薄,當(dāng)分類正確的次數(shù)超過上界時,認為已訓(xùn)練好煮岁,退出訓(xùn)練

    def train(self, features, labels):        

        # 初始化w,b為0,b在最后一位
        self.w = [0.0] * (len(features[0]) + 1)

        correct_count = 0  # 分類正確的次數(shù)

        while correct_count < self.max_iteration:

            # 隨機選取數(shù)據(jù)(xi,yi)
            index = random.randint(0, len(labels) - 1) 
            x = list(features[index])
            x.append(1.0)  # 加上1是為了與b相乘
            y = 2 * labels[index] - 1  # label為1轉(zhuǎn)化為正實例點+1讥蔽,label為0轉(zhuǎn)化為負實例點-1

            # 計算w*xi+b
            wx = sum([self.w[j] * x[j] for j in range(len(self.w))])

            # 如果yi(w*xi+b) > 0 則分類正確的次數(shù)加1
            if wx * y > 0:
                correct_count += 1
                continue

            # 如果yi(w*xi+b) <= 0 則更新w(最后一位實際上b)的值
            for i in range(len(self.w)):
                self.w[i] += self.learning_step * (y * x[i])

    def predict_(self, x):
        wx = sum([self.w[j] * x[j] for j in range(len(self.w))])
        return int(wx > 0)  # w*xi+b>0則返回返回1,否則返回0

    def predict(self, features):
        labels = []
        for feature in features:
            x = list(feature)
            x.append(1)
            labels.append(self.predict_(x))
        return labels


if __name__ == '__main__':

    print("Start read data")

    time_1 = time.time()

    raw_data = pd.read_csv('../data/train_binary.csv', header=0)  # 讀取csv數(shù)據(jù),并將第一行視為表頭画机,返回DataFrame類型
    data = raw_data.values

    features = data[::, 1::]
    labels = data[::, 0]

    # 避免過擬合冶伞,采用交叉驗證,隨機選取33%數(shù)據(jù)作為測試集色罚,剩余為訓(xùn)練集
    train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)

    time_2 = time.time()
    print('read data cost %f seconds' % (time_2 - time_1))

    print('Start training')
    p = Perceptron()
    p.train(train_features, train_labels)

    time_3 = time.time()
    print('training cost %f seconds' % (time_3 - time_2))

    print('Start predicting')
    test_predict = p.predict(test_features)
    time_4 = time.time()
    print('predicting cost %f seconds' % (time_4 - time_3))

    score = accuracy_score(test_labels, test_predict)
print("The accruacy score is %f" % score)

實現(xiàn)代碼(用sklearn實現(xiàn)):

# encoding=utf-8

import pandas as pd
import time

from sklearn.cross_validation import train_test_split
from sklearn.metrics import accuracy_score

from sklearn.linear_model import Perceptron



if __name__ == '__main__':

    print("Start read data...")
    time_1 = time.time()

    raw_data = pd.read_csv('../data/train_binary.csv', header=0)  # 讀取csv數(shù)據(jù),并將第一行視為表頭账劲,返回DataFrame類型
    data = raw_data.values

    features = data[::, 1::]
    labels = data[::, 0]

    # 隨機選取33%數(shù)據(jù)作為測試集戳护,剩余為訓(xùn)練集
    train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)

    time_2 = time.time()
    print('read data cost %f seconds' % (time_2 - time_1))

    print('Start training...')
    clf = Perceptron(alpha=0.0001,max_iter=2000) # 設(shè)置步長及最大迭代次數(shù)
    clf.fit(train_features,train_labels)
    time_3 = time.time()
    print('training cost %f seconds' % (time_3 - time_2))

    print('Start predicting...')
    test_predict = clf.predict(test_features)
    time_4 = time.time()
    print('predicting cost %f seconds' % (time_4 - time_3))

    score = accuracy_score(test_labels, test_predict)
print("The accruacy score is %f" % score)


【總結(jié)】

感知器模型

 適用問題:二類分類

 模型特點:分離超平面

 模型類型:判別模型

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

 學(xué)習(xí)策略:極小化誤分點到超平面距離    

 學(xué)習(xí)的損失函數(shù):誤分點超平面距離

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

 學(xué)習(xí)算法:隨機梯度下降
image.png

算法的收斂性

  證明:Novikoff定理
image.png
image.png
image.png
image.png
image.png

算法的對偶形式

  為了求解更簡單金抡,所以用對偶形式
image.png

image.png

注:統(tǒng)計學(xué)習(xí)方法——修煉學(xué)習(xí)筆記系列參考學(xué)習(xí)資料:
《統(tǒng)計學(xué)習(xí)方法》第2版 李航
補充學(xué)習(xí)資料:
http://www.reibang.com/p/db7f5e841a56 李威威學(xué)習(xí)筆記
https://blog.csdn.net/weixin_43374508/article/details/102784079 城序猿
https://blog.csdn.net/qfire/article/details/77905787
代碼學(xué)習(xí)資料:https://github.com/WenDesi/lihang_book_algorithm

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市腌且,隨后出現(xiàn)的幾起案子梗肝,更是在濱河造成了極大的恐慌,老刑警劉巖铺董,帶你破解...
    沈念sama閱讀 218,204評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件巫击,死亡現(xiàn)場離奇詭異,居然都是意外死亡精续,警方通過查閱死者的電腦和手機坝锰,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,091評論 3 395
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來重付,“玉大人顷级,你說我怎么就攤上這事∪返妫” “怎么了弓颈?”我有些...
    開封第一講書人閱讀 164,548評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長删掀。 經(jīng)常有香客問我翔冀,道長,這世上最難降的妖魔是什么披泪? 我笑而不...
    開封第一講書人閱讀 58,657評論 1 293
  • 正文 為了忘掉前任纤子,我火速辦了婚禮,結(jié)果婚禮上付呕,老公的妹妹穿的比我還像新娘计福。我一直安慰自己,他們只是感情好徽职,可當(dāng)我...
    茶點故事閱讀 67,689評論 6 392
  • 文/花漫 我一把揭開白布象颖。 她就那樣靜靜地躺著,像睡著了一般姆钉。 火紅的嫁衣襯著肌膚如雪说订。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,554評論 1 305
  • 那天潮瓶,我揣著相機與錄音陶冷,去河邊找鬼。 笑死毯辅,一個胖子當(dāng)著我的面吹牛埂伦,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播思恐,決...
    沈念sama閱讀 40,302評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼沾谜,長吁一口氣:“原來是場噩夢啊……” “哼膊毁!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起基跑,我...
    開封第一講書人閱讀 39,216評論 0 276
  • 序言:老撾萬榮一對情侶失蹤婚温,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后媳否,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體栅螟,經(jīng)...
    沈念sama閱讀 45,661評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,851評論 3 336
  • 正文 我和宋清朗相戀三年篱竭,在試婚紗的時候發(fā)現(xiàn)自己被綠了力图。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,977評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡室抽,死狀恐怖搪哪,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情坪圾,我是刑警寧澤晓折,帶...
    沈念sama閱讀 35,697評論 5 347
  • 正文 年R本政府宣布,位于F島的核電站兽泄,受9級特大地震影響漓概,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜病梢,卻給世界環(huán)境...
    茶點故事閱讀 41,306評論 3 330
  • 文/蒙蒙 一胃珍、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蜓陌,春花似錦觅彰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,898評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至隧期,卻和暖如春飒责,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仆潮。 一陣腳步聲響...
    開封第一講書人閱讀 33,019評論 1 270
  • 我被黑心中介騙來泰國打工宏蛉, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人性置。 一個月前我還...
    沈念sama閱讀 48,138評論 3 370
  • 正文 我出身青樓拾并,卻偏偏與公主長得像,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子嗅义,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 44,927評論 2 355

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

  • 線性模型 根據(jù)周志華老師的定義來說芥喇,線性模型是指其通過屬性的線性組合來進行預(yù)測的函數(shù),即用一般向量形式凰萨,則寫成其中...
    懷柔小龍蝦閱讀 4,191評論 1 24
  • 以西瓜書為主線继控,以其他書籍作為參考進行補充,例如《統(tǒng)計學(xué)習(xí)方法》胖眷,《PRML》等 第一章 緒論 1.2 基本術(shù)語 ...
    danielAck閱讀 4,519評論 0 6
  • 【概述】 SVM訓(xùn)練分類器的方法是尋找到超平面武通,使正負樣本在超平面的兩側(cè)(分類正確性即“分得開”),且樣本到超平面...
    sealaes閱讀 11,076評論 0 7
  • 什么是感知機 是一種人工神經(jīng)網(wǎng)絡(luò)?? 感知機可以通過數(shù)學(xué)統(tǒng)計學(xué)方法完成對函數(shù)的估計或近似珊搀,能在外界信息的基礎(chǔ)上改變...
    efan閱讀 2,380評論 0 2
  • 【概述】 1冶忱、感知機模型特征:感知機對應(yīng)于輸入空間中將實例劃分為正負兩類的分離超平面,屬于判別模型境析。 2囚枪、感知機策...
    sealaes閱讀 3,115評論 2 3