最先接觸邏輯迴歸是在學習吳恩達老師的機器學習課程的時候,那個時候邏輯迴歸是跟在線性迴歸後面出現的,當時感受這應該就是個「hello world」級別的機器學習模型(好像確實是),如今看到《統計學習方法》中的各類推導,才發現本身瞭解的太少,靜下心來看邏輯迴歸模型和最大熵模型,發現確實蘊藏了不少統計學的基本原理,可是這系列博客重點是實現,因此這裏就不進行推導了,書中講的很詳細了。代碼地址https://github.com/bBobxx/statistical-learning/blob/master/src/logistic.cppgit
邏輯迴歸是一種分類模型,通常是二分類,書中給出了邏輯斯蒂分佈的機率分佈函數和圖像,在機器學習中,咱們須要獲得的是條件機率分佈,以二分類爲例:github
$ P(Y=1|x) = \frac{exp(wx)}{1+exp(wx)}$機器學習
$P(Y=0|x) = 1-P(Y=1|x) $函數
固然通常形式是採用Sigmoid函數那種形式:學習
$ P(Y=1|x) = \frac{1}{1+e^{-wx}}$優化
兩種形式是相等的,這裏的w是將偏移量b加入w後的向量,相應的x應該擴充爲\((x_1,x_2,...,x_n, 1)\)。咱們的目的是估計w的值。spa
模型的估計使用最大似然估計,對數似然函數:code
$L(w)=\sum_i[y_ilogP(Y=1|x)+(1-y_i)log(1-P(Y=0|x)] $blog
咱們的目的就是求出讓\(-L(w)\)最小的w,這裏咱們選擇使用梯度降低法。圖片
模型的概念介紹的比較簡單,你們看代碼就能看懂,這裏就不贅述了。
void Logistic::train(const int& step, const double& lr) { int count = 0; for(int i=0; i<step; ++i) { if (count == trainDataF.size() - 1) count = 0; count++; vector<double> grad = computeGradient(trainDataF[count], trainDataGT[count]); double fl; if (trainDataGT[count]==0) fl = 1; else fl = -1; w = w + fl*lr*grad; auto val = trainDataF[count]*w; double loss = -1*trainDataGT[count]*val + log(1 + exp(val)); cout<<"step "<<i<<", train loss is "<<loss<<" gt "<<trainDataGT[count]<<endl; } }
上面的w優化的時候根據類別肯定了梯度的正負(實際上是肯定要加上這部分梯度仍是減去),這個是公式上沒出現的。個人理解是前面計算梯度的公式在向量應用的時候有點問題,這部分若是有疑問就深刻討論。