Three Linear Models

寫本文的目的主要是通過看他人的筆記加深印象以及理解難點(diǎn)。需要跟課堂看筆記的同學(xué)建議移步這里弄唧,課后習(xí)題的Python實(shí)現(xiàn)在這里候引。

注意點(diǎn)

  1. PLA中分割線垂直于W
  2. Linear regression中向量求導(dǎo)
  3. logistic regression中最大(極大)似然估計(jì)的概念<概率書p141>以及對(duì)分量求導(dǎo)澄干。


    Three Linear Models
一柠傍、PLA/Pocket

感知機(jī)模型惧笛,就是當(dāng)特征加權(quán)和與閾值的差大于或等于0,則輸出h(x)=1拜效;當(dāng)特征加權(quán)和與閾值的差小于0,則輸出h(x)=-1侮腹,而我們的目的就是計(jì)算出權(quán)值w和閾值threshold使全部分類正確稻励。

  • 題目:銀行貸款問題望抽,訓(xùn)練數(shù)據(jù)是客戶的n維資料和貸款與否
1. PLA
  1. Hypothesis公式
    公式

    公式中x_{i}表示每個(gè)貸款申請人的個(gè)人特征煤篙,w_{i}表示相對(duì)應(yīng)的個(gè)人信息的權(quán)重,threshold表示闕值苛茂。
    sign函數(shù)
    即當(dāng)特征加權(quán)和比threshold大時(shí)妓羊,h(x)為正(發(fā)放貸款)躁绸。
  2. 調(diào)整權(quán)重W
    調(diào)整權(quán)重W
    某次學(xué)習(xí)錯(cuò)誤將原本結(jié)果該為+1的y_n(t)誤判成-1净刮,這代表wx之間的角度太大硅则,所以我們透過w_t+1←w_t+(+1)x_{n}(t)來將夾角減小抢埋,使未來學(xué)習(xí)到這點(diǎn)時(shí)能正確的判斷成+1。如此逐個(gè)檢查所有點(diǎn)穷吮,直到不存在判斷錯(cuò)誤的點(diǎn)為止饥努。
  • 為什么分割線總是垂直與W
    w?x =||w||?||x||?cos(θ)當(dāng)wx的夾角θ小于90°時(shí)結(jié)果為正(圖中的圈圈)酷愧,大于90°時(shí)結(jié)果為負(fù)(圖中的叉叉)。因此與夾角垂直的線自然就成了正與負(fù)的分水嶺乍迄。
  1. 核心代碼
    W=np.zeros(5)
    while True:
        iscompleted=True
        #arr為訓(xùn)練集
        for i in range(0,len(arr)):
            #所有的特徵值乘上相對(duì)的權(quán)重加起來大於某個(gè)設(shè)定的門檻時(shí),就會(huì)回傳是褥伴,反之則否
            #將門檻值threshold轉(zhuǎn)換為w0*(+1),所以X的第一列多一列1
            X=np.ones(5)
            X[1:]=arr[i,:-1].copy()
            g=arr[i,-1]
            Y=np.dot(W,X.reshape(5,1))[0]#matrix multiply
            if np.sign(Y)*np.sign(g)==1:
                continue
            else:
                count+=1
                iscompleted=False
                #print(W,"+",g,"*",X)
                W=W+g*X   
        if iscompleted:
            break
2. Pocket

PLA存在一個(gè)缺點(diǎn)重慢,那就是當(dāng)X不是線性可分的(例如存在噪音)似踱,PLA將不會(huì)停止稽煤。如下圖,PLA找不到一條線使所有點(diǎn)都正確狞洋。

非線性可分

這時(shí)就需要使用Pocket算法,即在調(diào)整過程中記錄犯更少錯(cuò)誤的庐橙,當(dāng)?shù)螖?shù)達(dá)到要求時(shí),選取犯錯(cuò)個(gè)數(shù)最少的直線對(duì)應(yīng)的转培,即為我們最終想要得到的權(quán)重值浸须。

    while True:
        for i in range(0,len(arr)):
            #所有的特徵值乘上相對(duì)的權(quán)重加起來大於某個(gè)設(shè)定的門檻時(shí)邦泄,就會(huì)回傳是,反之則否
            #將門檻值threshold轉(zhuǎn)換為w0*(+1),所以X的第一列多一列1
            X=np.ones(5)
            X[1:]=arr[i,:-1].copy()
            g=arr[i,-1]
            Y=np.dot(W,X.reshape(5,1))[0]#matrix multiply
            if np.sign(Y)*np.sign(g)!=1:
                count+=1
                W=W+g*X
            err=0 
            for j in range(0,len(arr)):
                
                XX=np.ones(5)
                XX[1:]=arr[j,:-1].copy()
                gg=arr[j,-1]
                YY=np.dot(W,XX.reshape(5,1))[0]#matrix multiply
                if np.sign(YY)*np.sign(gg)!=1:
                    err+=1
                
            if err<pocket_err:
                pocket_err=err
                pocket_wei=W.copy()
            if count==50:#調(diào)整達(dá)50次后結(jié)束
                break
        if count==50:
            break
二肌索、linear regression
  • 題目:銀行貸款問題诚亚,訓(xùn)練數(shù)據(jù)是客戶的n維資料和貸款與否
1. 公式

Hypothesis

誤差衡量為平方差,損失函數(shù):
損失函數(shù)

目標(biāo)求解使損失函數(shù)最小的闸准。

2. 求解
  1. 將損失函數(shù)轉(zhuǎn)換成矩陣運(yùn)算形式:
    轉(zhuǎn)換過程

    當(dāng)X為一維空間時(shí)夷家,損失函數(shù)如下圖:
    函數(shù)圖

    可以發(fā)現(xiàn)損失函數(shù)最小值位于“谷底”瘾英,即求解?E_in=0(導(dǎo)函數(shù)為0)缺谴。
  2. 求?E_{in}耳鸯。
    求導(dǎo)
  3. 求解w
    令?E_{in}=0县爬,解得w,即為最終解:w=(x^Tx)^{-1}x^Ty
    其中(x^Tx)^{-1}x^T叫做矩陣X的偽逆(pseudo-inverse)察迟。注意此處輸入矩陣X在很少的情況下才是方陣(N=d+1時(shí))耳高,這種偽逆矩陣的形式和方陣中的逆矩陣具有很多相似的性質(zhì)泌枪。
2. 核心代碼
# target function f(x1, x2) = sign(x1^2 + x2^2 - 0.6)
def target_function(x1, x2):
    if (x1 * x1 + x2 * x2 - 0.6) >= 0:
        return 1
    else:
        return -1


# create train_set
def training_data_with_random_error(num=1000):
    features = np.zeros((num, 3))
    labels = np.zeros((num, 1))

    #random.uniform隨機(jī)生成一個(gè)實(shí)數(shù),它在 [x,y] 范圍內(nèi)
    #round返回浮點(diǎn)數(shù)x的四舍五入值
    points_x1 = np.array([round(random.uniform(-1, 1), 2) for i in range(num)])
    points_x2 = np.array([round(random.uniform(-1, 1), 2) for i in range(num)])

    for i in range(num):
        # create random feature
        features[i, 0] = 1
        features[i, 1] = points_x1[i]
        features[i, 2] = points_x2[i]
        labels[i] = target_function(points_x1[i], points_x2[i])
        # choose 10% error labels
        if i <= num * 0.1:
            if labels[i] < 0:
                labels[i] = 1
            else:
                labels[i] = -1
    return features, labels


def error_rate(features, labels, w):
    wrong = 0
    for i in range(len(labels)):
        if np.dot(features[i], w) * labels[i, 0] < 0:
            wrong += 1
    return wrong / (len(labels) * 1.0)


def linear_regression_closed_form(X, Y):
    """
        linear regression:
        model     : g(x) = Wt * X
        strategy  : squared error
        algorithm : close form(matrix)
        result    : w = (X.T·X)^-1·X.T·Y
        林老師上課講的公式
    """
    #np.linalg.inv():矩陣求逆
    return np.linalg.inv(np.dot(X.T, X)).dot(X.T).dot(Y)


if __name__ == '__main__':

    # 13
    error_rate_array = []
    for i in range(1000):
        (features, labels) = training_data_with_random_error(1000)
        w13 = linear_regression_closed_form(features, labels)
        error_rate_array.append(error_rate(features, labels, w13))
三、logistic regression
  • 題目:輸入訓(xùn)練集是病人的信息修壕,標(biāo)記是得病與否,要求目標(biāo)函數(shù)判斷得病的概率
1. 梯度下降

1.目標(biāo)函數(shù)

目標(biāo)函數(shù)

2.Logistic Hypothesis
風(fēng)險(xiǎn)分?jǐn)?shù):
risk score

利用sigmoid函數(shù)將分?jǐn)?shù)轉(zhuǎn)化為0-1:
sigmoid

logistic regression:

  1. 損失函數(shù)
    目標(biāo)函數(shù)f(x)形式轉(zhuǎn)換:
    轉(zhuǎn)換

  2. minimizeE_{in}(w)
    E_{in}(w)函數(shù)為連續(xù)、可微像棘、凹函數(shù),因此其最小值在梯度為零時(shí)取得截歉。
    對(duì)權(quán)值向量w的各個(gè)分量求解偏微分:
    使?E_{in}(w)=0有兩種情況:
    ①所有的θ(·) =0瘪松,這就要求y_nw^tx_n遠(yuǎn)大于0宵睦,即所有的y_nw^tx_n(score)都是同號(hào)墅诡,代表所有的w^t都是好的,那么訓(xùn)練集D就是線性可分的烟馅,所以不適用于非線性可分的問題然磷。
    ②累加和為0。所以接下來是調(diào)整w使E_{in}變小寡润。
  3. 核心代碼
# gradient descent
def gradient_descent(X, y, w):
    # -YnWtXn
    tmp = -y * (np.dot(X, w))

    # θ(-YnWtXn) = exp(tmp)/1+exp(tmp)
    # weight_matrix = np.array([math.exp(_)/(1+math.exp(_)) for _ in tmp]).reshape(len(X), 1)
    weight_matrix = np.exp(tmp) / ((1 + np.exp(tmp)) * 1.0)
    gradient = 1 / (len(X) * 1.0) * (sum(weight_matrix * -y * X).reshape(len(w), 1))

    return gradient

# fit model
def fit(self, X, y, Eta=0.001, max_iteration=2000, sgd=False):
    # ?E/?w = 1/N * ∑θ(-YnWtXn)(-YnXn)
    self.__w = np.zeros((len(X[0]), 1))
        for i in range(max_iteration):
            self.__w = self.__w - Eta * gradient_descent(X, y, self.__w)
2. 隨機(jī)梯度下降
  1. 計(jì)算梯度過程中悦穿,每次的梯度計(jì)算包含一個(gè)連加业踢,是一個(gè)o(N)的時(shí)間復(fù)雜度知举,如果樣本量過大太伊,幾乎是一個(gè)不可完成過程。如果是在線學(xué)習(xí)锰提,訓(xùn)練樣本無法一次給清,同樣無法代入上面公式边坤。我們把1/N的連加換成一個(gè)隨機(jī)選擇點(diǎn)的過程谅年,隨機(jī)梯度值可以看做真實(shí)的梯度值加上一個(gè)噪音,使用隨機(jī)梯度取代真實(shí)梯度做梯度下降的算法稱作隨機(jī)梯度下降(stochastic gradient descent)旺订,簡稱SGD超燃。這種替代的理論基礎(chǔ)是在迭代次數(shù)足夠多的情況下,平均的隨機(jī)梯度和平均的真實(shí)梯度相差不大樱调。

    SDG中的x_n為隨機(jī)選擇的一個(gè)點(diǎn)洽瞬。
    SGD是大錯(cuò)大更新,小錯(cuò)小更新(0~1之間的值)菩颖;PLA是有錯(cuò)就更新为障,無錯(cuò)不更新;兩者其實(shí)是類似的呻右。關(guān)于迭代次數(shù)和步長(學(xué)習(xí)速率)的選擇:因?yàn)闊o法真正確定梯度為0的地方鞋喇,所以確定一個(gè)t很困難,通常做法是選擇一個(gè)足夠大的迭代次數(shù)t落塑;步長的經(jīng)驗(yàn)算法是0.1。
    2.核心代碼
# gradient descent
def stochastic_gradient_descent(X, y, w):
    # -YnWtXn
    tmp = -y * (np.dot(X, w))

    # θ(-YnWtXn) = exp(tmp)/1+exp(tmp)
    # weight = math.exp(tmp[0])/((1+math.exp(tmp[0]))*1.0)
    weight = np.exp(tmp) / ((1 + np.exp(tmp)) * 1.0)

    gradient = weight * -y * X
    return gradient.reshape(len(gradient), 1)

# fit model
def fit(self, X, y, Eta=0.001, max_iteration=2000, sgd=False):
    # ?E/?w = 1/N * ∑θ(-YnWtXn)(-YnXn)
    self.__w = np.zeros((len(X[0]), 1))
    index = 0
    for i in range(max_iteration):
        if (index >= len(X)):
            index = 0
        self.__w = self.__w - Eta * stochastic_gradient_descent(np.array(X[index]), y[index], self.__w)
        index += 1
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個(gè)濱河市散吵,隨后出現(xiàn)的幾起案子蟆肆,更是在濱河造成了極大的恐慌炎功,老刑警劉巖,帶你破解...
    沈念sama閱讀 221,635評(píng)論 6 515
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件亡问,死亡現(xiàn)場離奇詭異州藕,居然都是意外死亡酝陈,警方通過查閱死者的電腦和手機(jī),發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 94,543評(píng)論 3 399
  • 文/潘曉璐 我一進(jìn)店門锈死,熙熙樓的掌柜王于貴愁眉苦臉地迎上來穆壕,“玉大人,你說我怎么就攤上這事缨该〈ū常” “怎么了?”我有些...
    開封第一講書人閱讀 168,083評(píng)論 0 360
  • 文/不壞的土叔 我叫張陵膨更,是天一觀的道長缴允。 經(jīng)常有香客問我,道長矗漾,這世上最難降的妖魔是什么踢俄? 我笑而不...
    開封第一講書人閱讀 59,640評(píng)論 1 296
  • 正文 為了忘掉前任都办,我火速辦了婚禮,結(jié)果婚禮上势木,老公的妹妹穿的比我還像新娘歌懒。我一直安慰自己,他們只是感情好及皂,可當(dāng)我...
    茶點(diǎn)故事閱讀 68,640評(píng)論 6 397
  • 文/花漫 我一把揭開白布验烧。 她就那樣靜靜地躺著,像睡著了一般若治。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上端幼,一...
    開封第一講書人閱讀 52,262評(píng)論 1 308
  • 那天婆跑,我揣著相機(jī)與錄音,去河邊找鬼洽蛀。 笑死疟赊,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的驮审。 我是一名探鬼主播吉执,決...
    沈念sama閱讀 40,833評(píng)論 3 421
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼戳玫!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起币绩,我...
    開封第一講書人閱讀 39,736評(píng)論 0 276
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎缆镣,沒想到半個(gè)月后,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體寞蚌,經(jīng)...
    沈念sama閱讀 46,280評(píng)論 1 319
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡挟秤,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 38,369評(píng)論 3 340
  • 正文 我和宋清朗相戀三年眠蚂,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片昔脯。...
    茶點(diǎn)故事閱讀 40,503評(píng)論 1 352
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡笛臣,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出静陈,到底是詐尸還是另有隱情,我是刑警寧澤鲸拥,帶...
    沈念sama閱讀 36,185評(píng)論 5 350
  • 正文 年R本政府宣布刑赶,位于F島的核電站,受9級(jí)特大地震影響撞叨,放射性物質(zhì)發(fā)生泄漏浊洞。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 41,870評(píng)論 3 333
  • 文/蒙蒙 一枷餐、第九天 我趴在偏房一處隱蔽的房頂上張望苫亦。 院中可真熱鬧奕锌,春花似錦村生、人聲如沸饼丘。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,340評(píng)論 0 24
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽典徘。三九已至,卻和暖如春帜平,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背裆甩。 一陣腳步聲響...
    開封第一講書人閱讀 33,460評(píng)論 1 272
  • 我被黑心中介騙來泰國打工齐唆, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留,地道東北人箍邮。 一個(gè)月前我還...
    沈念sama閱讀 48,909評(píng)論 3 376
  • 正文 我出身青樓锭弊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親廷蓉。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 45,512評(píng)論 2 359