最美情侣中文字幕电影,在线麻豆精品传媒,在线网站高清黄,久久黄色视频

歡迎光臨散文網(wǎng) 會員登陸 & 注冊

[Quant 1.1] 嘗試只用Numpy實(shí)現(xiàn)邏輯回歸

2022-05-12 15:49 作者:安平生一人好_  | 我要投稿

之前關(guān)注了一個up主,看了兩個視頻之后感覺他講的非常好。因?yàn)楫?dāng)時還沒放假,所以就沒有仔細(xì)看,就想著放假之后一定好好修煉修煉技術(shù)。祝自己能堅(jiān)持下去,同時非常感謝大神的視頻。

從我的水平看,up調(diào)取了pytorch的包,把numpy array轉(zhuǎn)化成張量然后帶入到自己寫的邏輯回歸函數(shù)中循環(huán)。因?yàn)槲腋杏X短期可能沒法把pytorch學(xué)的那么扎實(shí),所以就想只用numpy試試能不能把邏輯回歸寫出來(我也不想做調(diào)包俠)。然后這個僅作為我看完原up視頻之后的一點(diǎn)小練習(xí)和記錄,所以我不會說的非常的細(xì)致。如果讀到這篇的朋友需要我在哪個地方詳細(xì)說明的話我會更新這篇。我會盡快附上代碼鏈接。感興趣的朋友可以私我一些意見/把我拉進(jìn)金工金數(shù)量化或者CFA2級備考的群,菜鳥不勝感激!


1. 模型

在開始講代碼之前,我們先整理一下邏輯,也相當(dāng)于復(fù)習(xí)一下邏輯回歸的框架了。

邏輯回歸模型是基于sigmoid激活函數(shù)的,也就是

f(z)%20%3D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-z%7D%7D

模型是

%5Cbegin%7Balign%7D%0AP(y%3D1%7Cx)%20%3D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-(wx%2Bb)%7D%7D%0A%5Cend%7Balign%7D

左邊的條件概率相當(dāng)于一個關(guān)于x的函數(shù)。x是一個樣本的attributes向量,例如對你來說,你有一個x向量,x_1%0A是你的身高,x_2是你的體重...。同樣,對你來說,你還有一個性別y(不好意思我這里暫時不考慮trans),y=1說明你是女性,y=0說明你是男性。w是針對所有的人來說每一個attribute對判斷你性別的影響,例如w1就是一個人的身高在判斷這個人是男是女的時候的重要性。

%5Cbegin%7Balign%7D%0A%5Cvec%7Bw%7D%20%26%3D%20(w_1%20%5C%2Cw_2%20%5C%2Cw_3%20...%20w_n)%20%5C%5C%0A%5Cvec%7Bx%7D%20%26%20%3D%20(x_1%20%5C%2C%20x_2%20%5C%2C%20x_3%20...%20x_n)%5ET%5C%5C%0A%5Cend%7Balign%7D


在線性回歸里面,我們用的損失函數(shù)是MSE。而在邏輯回歸里面我們要用的損失函數(shù)是cross entropy。

%5Cbegin%7Balign%7D%0Ag(y%2C%5Chat%7By%7D)%20%26%3D%20-y%20%5Ccdot%20log(%5Chat%7By%7D)%20-%20(1-y)%20%5Ccdot%20log(1-%5Chat%7By%7D)%0A%5Cend%7Balign%7D%0A

y是你真實(shí)的性別,%5Chat%7By%7D是之前預(yù)測的你的性別

這是因?yàn)樵谶壿嫽貧w模型下,損失函數(shù)MSE非凸,所以不能使用梯度下降法來求最小的loss。如果你在邏輯回歸中用了MSE,那么你要最小化的損失函數(shù)很可能長這個樣子。

Plot by Wolfram

但是如果你使用了cross entropy,損失函數(shù)基本就長這樣子。


Plot by Wolfram

多說一句,即使cross entropy損失函數(shù)是凸的,我們也沒辦法用first order condition來求解他的全局最小值,因?yàn)樗麤]有。我是愚蠢的用手推了很久才發(fā)現(xiàn)的。


所以之后要做的事情就是:我們先猜想一組?%5Cvec%7Bw%7D?和?b,然后我們把a(bǔ)ttributes向量一個一個的代入到這個邏輯回歸模型里面。我們就會獲得1個預(yù)測值,然后用1個預(yù)測值和1個真實(shí)值來計(jì)算出1個對應(yīng)的loss。然后計(jì)算這個loss對各個attribute的偏導(dǎo)數(shù),就可以更新我們的%5Cvec%7Bw%7Db了。

%5Cbegin%7Balign%7D%0A%5Cvec%7Bw%7D_1%20%26%3D%20%5Cvec%7Bw%7D_0%20-%20%5Calpha%20%5Cnabla%20g%7C_%7B%5Cvec%7Bw%7D_0%7D%5C%5C%0Ab_1%20%26%3D%20b_0%20-%20%5Calpha%20%5Cfrac%7B%5Cpartial%20g%7D%7B%5Cpartial%20b%7D%7C_%7Bb_0%7D%0A%5Cend%7Balign%7D%0A

這里因?yàn)樵谟?jì)算?%5Chat%7By%7D?的時候要用到?%5Cvec%7Bw%7D?和?b?,所以g也是關(guān)于?%5Cvec%7Bw%7D?和?b?的函數(shù)。

%5Chat%7By%7D%20%3D%20%5Cfrac%7B1%7D%7B1%2Be%5E%7B-(%5Cvec%7Bx%7D_0%5Cvec%7Bw%7D_0%2Bb_0)%7D%7D

而實(shí)際上,我們可以選擇多個attributes向量一起代入,得到多個loss的平均值,然后求這個平均loss的對?X%20?和?b?的偏導(dǎo)數(shù),在用上面同樣的式子來更新參數(shù)。在這種情況下,向量乘法會變成矩陣乘法,大神在視頻2中有詳細(xì)講解。


2. 代碼

除了numpy之外,sklearn主要是導(dǎo)入和up同樣的數(shù)據(jù)庫來檢驗(yàn)我自己建立的邏輯回歸模型的表現(xiàn)。matplotlib拿來畫圖。

然后是定義sigmoid函數(shù)和cross entropy函數(shù),數(shù)學(xué)表達(dá)式就是上面寫到的激活函數(shù)和損失函數(shù)。

下一個函數(shù)是計(jì)算損失,大致就是先用X?(把前面提到的?%5Cvec%7Bx%7D?縱向堆疊到一起),?%5Cvec%7Bw%7D?和?b?來求出?%5Chat%7By%7D?,再對應(yīng)實(shí)際的?y?計(jì)算出的多個樣本對應(yīng)損失的平均值。樣本個數(shù)就是矩陣X?的行數(shù)。

下面是用來求梯度的函數(shù),因?yàn)閚umpy本身的diff函數(shù)是計(jì)算離散數(shù)列鄰項(xiàng)的差的,因此不能用來求偏導(dǎo)。因此我來定義一個函數(shù),用來求解loss函數(shù)在%5Cvec%7Bw%7D?各個方向的梯度。

提取數(shù)據(jù),劃分訓(xùn)練集和測試集(和原up的代碼相同),把?%5Cvec%7Bw%7D?和?b?都初始化為0向量。

下面是主函數(shù)。

我的代碼用了5000次迭代,最后的loss是0.20495,下面是最后得到的?%5Cvec%7Bw%7D?和?b?的結(jié)果。

這個和原up的回歸結(jié)果有一些出入,但是還好。。

loss隨迭代次數(shù)的變化

最后計(jì)算一下預(yù)測的準(zhǔn)確率

計(jì)算出來是92.647%

[Quant 1.1] 嘗試只用Numpy實(shí)現(xiàn)邏輯回歸的評論 (共 條)

分享到微博請遵守國家法律
闽清县| 渭源县| 台东县| 石门县| 青田县| 进贤县| 咸丰县| 岚皋县| 玉屏| 台江县| 民乐县| 长岛县| 湘阴县| 林西县| 佛学| 沈丘县| 广平县| 卫辉市| 成都市| 新晃| 麟游县| 黎城县| 上林县| 三原县| 天气| 东辽县| 新民市| 满洲里市| 南昌市| 麻阳| 邵东县| 社旗县| 潢川县| 呼图壁县| 长乐市| 宝兴县| 仙游县| 右玉县| 黄石市| 信宜市| 铜川市|