機器學習 - 感知機


1.感知機模型

1.1感知機定義

假設輸入空間(特征空間)是X\subseteq R^n,輸出空間是y\in\lbrace +1,-1 \rbrace,輸入x \in X表示實例的特征向量,對應于輸入空間特征空間)的點盒音,輸出y \in Y表示實例的類別表鳍。由輸入空間到輸出空間的如下函數:
f(x) = sign(w \cdot x+b)
稱為感知機,其中wb稱為感知機模型參數祥诽,w \in R^n 叫做權值(weights)或權值向量(weight vector)譬圣,b \in R叫做偏置,w \cdot x表示wx雄坪。
感知機有如下幾何解釋厘熟,線性方程:
w \cdot x + b = 0
對應于特征空間R^n的一個超平面S,其中w是超平面的法向量,b是超平面的截距。這個超平面將特征空間劃分為兩個部分绳姨,位于兩部分的點就被劃分為正登澜、負兩類,即:
(1)若w \cdot x + b > 0就缆,則 x為正例,f(x)=sign(w \cdot x + b)=1
(2)若w \cdot x + b < 0帖渠,則 x為負例,f(x)=sign(w \cdot x + b) = -1

2.感知機學習策略

2.1 數據集的線性可分性

給定一個數據集T=\lbrace (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \rbrace,其中 x_i \in X = R^n,y \in Y = \lbrace +1, -1 \rbrace,i=1,2,..,N,如果存在某個超平面S:
w \cdot x + b = 0
能夠將數據集的正實例點和負實例點完全正確的劃分到超平面的兩側竭宰,即對所有的y_i = +1的實例i,有w \cdot x + b > 0,對所有的y_i = -1的實例i空郊,有w \cdot x + b < 0,則稱數據集T為線性可分數據集(linearly separable data set),否則稱為不可分數據集。

2.2感知機的學習策略

損失函數的一個自然選擇是誤分類點的總數切揭,但是這樣的損失函數不是w , b的連續(xù)可導函數狞甚,不容易優(yōu)化。損失函數的另一個選擇是誤分類點到平面S的總距離廓旬。
輸入空間R^n中一個點x_0到超平面S的距離是:
|w \cdot x + b |\over ||w||
若某個點被誤分類哼审,即:
(1)x為正例,但w \cdot x + b < 0,f(x)=sign(w \cdot x + b)=-1, y = 1
(2)x為負例,但w \cdot x + b > 0孕豹,f(x)=sign(w \cdot x + b) = 1, y = -1
綜合考慮涩盾,即:
-y_i (w \cdot x + b ) > 0
因此,每個誤分類點x_i到超平面S的距離:
- y_i(w \cdot x + b) \over ||w||

假設超平面S的誤分類點的集合為M励背,那么所有的誤分類點到超平面S的總距離為:
- \sum_{x_i \in M} y_i (w \cdot x + b) \over ||w||
由于1\over ||w||是常量春霍,不考慮該常量,就可以得到感知機的損失函數:
L(w,b)= - \sum_{x_i \in M} y_i(w \cdot x + b)

2.3 感知機學習算法

2.3.1 感知機學習算法的原始形式

目標函數:
min L(w,b) = - \sum_{x_i \in M} y_i(w \cdot x + b)

求解:梯度下降算法
感知機學習算法是誤分類驅動的叶眉,具體采用梯度下降算法(stochastic gradient descent).首先址儒,任選一個超平面w_0,b_0,然后用梯度下降法不斷的極小化目標函數衅疙。極小化的過程不是一次性使用M中所有的點莲趣,而是每次只使用一個誤分類點進行梯度下降,當沒有誤分類點時饱溢,即找到想要的超平面S.

假設誤分類點的集合M是固定的喧伞,那么損失函數L(w,b)的梯度:
\nabla_w L(w,b) = -\sum_{x_i \in M}y_i(w \cdot x + b)
\nabla_b L(w,b) = -\sum_{x_i \in M}y_i
當前正遍歷到誤分類點(x_i,y_i),對w,b進行更新,過程如下:
w \leftarrow w + \eta y_i x_i
b \leftarrow b + \eta y_i

其中 \eta (0<\eta \leq 1)是步長理朋,在統計學習中又稱為學習率絮识。這樣,通過迭代可以期待損失函數L(w,b)不斷減小嗽上,直到為0.

算法2.1(感知機學習算法的原始形式)###

輸入:數據集T=\lbrace (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \rbrace,其中 x_i \in X = R^n,y \in Y = \lbrace +1, -1 \rbrace,i=1,2,..,N次舌,學習率\eta(0<\eta\leq1)
輸出:w,b,感知機模型f(x)=sign(w \cdot x + b)
(1)選取初值w_0,b_0
(2)在訓練數據集中,選取數據(x_i,y_i)
(3)如果y_i(w \cdot x +b) \leq 0:
w \leftarrow w + \eta y_i x_i
b \leftarrow b + \eta y_i
(4)轉至(2)兽愤,直到訓練集中彼念,沒有誤分類點挪圾。

實例(《統計學習方法》例2.1):
代碼如下:

import numpy as np

# 計算y值
def cacl_y(w, x, b):
    # print(w)
    # print(w.shape)
    # print(x)
    # print(x.shape)
    return np.sign(np.matmul(np.transpose(w), x) + b)

# 感知機計算過程
def perceptron(data_coord, data_label):
    # 0. 初始化參數:w,b, learning_rate
    learning_rate = 1
    w_star = np.zeros(shape=data_coord[0].shape) #zeros
    b_star = 0

    #1.開啟更新w,b的循環(huán):
    # 假設沒有不可分的數據逐沙,當全部數據分類正確時哲思,停止循環(huán)
    while True:
        count = 0;
        for i in range(len(data_coord)):
            # 2.1 對每個數據,查看分類是否錯誤
            x = data_coord[i]
            y_ = data_label[i]
            y = cacl_y(w_star, x, b_star)
            print("y_ = ", y_)
            print("y = ", y)
            print("\n\n")
            # 2.2 若分類錯誤(不大于0)吩案,更新w棚赔,b
            if y * y_ <= 0:  # update w,b
                w_star += learning_rate * y_ * x
                b_star += learning_rate * y_
                print("w_star = ",w_star)
                print("b_star = ",b_star)

            # 2.2 分類正確,對分類正確的數據個數 計數
            else:
                print("count = ", count)
                count += 1
            print("One Circle Again!")
        print("After going through all data, count = ", count)

        # 3.1 對所有數據分類正確徘郭,stop circle
        if count == len(data_label):
            print("\n\n")
            break;
        # 3.2 否則靠益,重啟 遍歷數據過程
        else:
            count = 0;
    # 4.結束:輸出 w b
    print("w_star = ", w_star)
    print("b_star = ", b_star)

# 準備3組測試數據,2個正例残揉, 1個負例
data_coord = np.asarray(((3, 3), (4, 3), (1, 1)))
data_label = np.asarray((1, 1, -1))
# start perceptron
perceptron(data_coord, data_label)

2.3.2 感知機學習算法的對偶形式

對偶形式的基本思想是胧后,將wb表示在實例x_i和標記y_i的線性組合的形式,通過求解其系數求得wb.不失一般性抱环,在上一個算法中壳快,將w_0b_0設置為0,對于誤分類點(x_i,y_i),通過:
w \leftarrow w + \eta y_i x_i
b \leftarrow b + \eta y_i
逐步修改wb,設修改n次镇草,則wba關于(x_i,y_i)的增量分別是\alpha_i y_i x_i\alpha_i y_i,其中\alpha_i = n_i \eta,這樣眶痰,經過學習之后,最終學習到的wb可以表示如下:
w = \sum_{i=1}^{n} \alpha_i y_i x_i
b = \sum_{i=1}^{n} \alpha_i y_i
其中梯啤,\alpha_i \geq 0, i=1,2,...,N

算法2.2 (感知機學習算法的對偶形式)

輸入:數據集T=\lbrace (x_1,y_1),(x_2,y_2),...,(x_N,y_N) \rbrace,其中 x_i \in X = R^n,y \in Y = \lbrace +1, -1 \rbrace,i=1,2,..,N凛驮,學習率\eta(0<\eta\leq1)
輸出:w,b,感知機模型f(x)=sign(\sum_{j=1}^{N} \alpha_j y_j x_j \cdot x + b)
(1)\alpha \leftarrow 0, b \leftarrow 0
(2)訓練集中選取數據(x_i,y_i)
(3)如果:y_i( \sum_{j=1}^{N} \alpha_j y_j x_j \cdot x + b ) \leq 0
\alpha_i \leftarrow \alpha_i + \eta
b \leftarrow b + \eta y_i
(4)轉至(2),直到沒有誤分類的數據条辟。

案例2.2:

import numpy as np

def perceptron_dual(x_input,y_input,gram):
    alpha_star = np.zeros(y_input.shape[0]) # alpha矩陣,x_input為n行矩陣
    b_star     = 0
    learning_rate = 1
    classification_right_count = 0 # 正確分類計數
    while True:
        for i in range(x_input.shape[0]):
            y = y_input[i]
            # 判斷是否滿足條件
            value = (np.sum(gram[i]*(alpha_star*y_input)) + b_star)
            if y*value <= 0:
                alpha_star[i] += learning_rate
                b_star += y
                print("update , alpha =", alpha_star)
                print("update , b_star = ",b_star)
            else:
                classification_right_count += 1
        # 若都已經分類正確,則退出
        if classification_right_count >= y_input.shape[0]: # y_input,行
            print("end, alpha = ",alpha_star)
            print("end, b_star = " , b_star)
            break
        # 否則宏胯,繼續(xù)循環(huán)
        else:
            classification_right_count = 0

# 1.準備數據
data_coord = np.asarray(((3, 3), (4, 3), (1, 1)))
data_label = np.asarray((1, 1, -1))
# 2.計算gram矩陣
x = np.asarray([data_coord[0],data_coord[1],data_coord[2]])
gram = np.matmul(x,x.T)
print("gram = ",gram)
# 3.感知機 對偶形式求解
perceptron_dual(data_coord,data_label,gram)

參考與致謝:
[1]《統計學習方法》
[2]感知機算法原理與實現
[3]WenDesi/lihang_book_algorithm

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末羽嫡,一起剝皮案震驚了整個濱河市,隨后出現的幾起案子肩袍,更是在濱河造成了極大的恐慌杭棵,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,820評論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件氛赐,死亡現場離奇詭異魂爪,居然都是意外死亡,警方通過查閱死者的電腦和手機艰管,發(fā)現死者居然都...
    沈念sama閱讀 94,648評論 3 399
  • 文/潘曉璐 我一進店門滓侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人牲芋,你說我怎么就攤上這事撩笆∞嗲颍” “怎么了?”我有些...
    開封第一講書人閱讀 168,324評論 0 360
  • 文/不壞的土叔 我叫張陵夕冲,是天一觀的道長氮兵。 經常有香客問我,道長歹鱼,這世上最難降的妖魔是什么泣栈? 我笑而不...
    開封第一講書人閱讀 59,714評論 1 297
  • 正文 為了忘掉前任,我火速辦了婚禮弥姻,結果婚禮上南片,老公的妹妹穿的比我還像新娘。我一直安慰自己蚁阳,他們只是感情好铃绒,可當我...
    茶點故事閱讀 68,724評論 6 397
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著螺捐,像睡著了一般颠悬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上定血,一...
    開封第一講書人閱讀 52,328評論 1 310
  • 那天赔癌,我揣著相機與錄音,去河邊找鬼澜沟。 笑死灾票,一個胖子當著我的面吹牛,可吹牛的內容都是我干的茫虽。 我是一名探鬼主播刊苍,決...
    沈念sama閱讀 40,897評論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼濒析!你這毒婦竟也來了正什?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,804評論 0 276
  • 序言:老撾萬榮一對情侶失蹤号杏,失蹤者是張志新(化名)和其女友劉穎婴氮,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體盾致,經...
    沈念sama閱讀 46,345評論 1 318
  • 正文 獨居荒郊野嶺守林人離奇死亡主经,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 38,431評論 3 340
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了庭惜。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片罩驻。...
    茶點故事閱讀 40,561評論 1 352
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖护赊,靈堂內的尸體忽然破棺而出鉴腻,到底是詐尸還是另有隱情迷扇,我是刑警寧澤,帶...
    沈念sama閱讀 36,238評論 5 350
  • 正文 年R本政府宣布爽哎,位于F島的核電站蜓席,受9級特大地震影響,放射性物質發(fā)生泄漏课锌。R本人自食惡果不足惜厨内,卻給世界環(huán)境...
    茶點故事閱讀 41,928評論 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渺贤。 院中可真熱鬧雏胃,春花似錦、人聲如沸志鞍。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,417評論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽固棚。三九已至统翩,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間此洲,已是汗流浹背厂汗。 一陣腳步聲響...
    開封第一講書人閱讀 33,528評論 1 272
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留呜师,地道東北人娶桦。 一個月前我還...
    沈念sama閱讀 48,983評論 3 376
  • 正文 我出身青樓,卻偏偏與公主長得像汁汗,于是被迫代替她去往敵國和親衷畦。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 45,573評論 2 359

推薦閱讀更多精彩內容