統計學習方法c++實現之五 邏輯斯蒂迴歸

邏輯迴歸

前言

最先接觸邏輯迴歸是在學習吳恩達老師的機器學習課程的時候,那個時候邏輯迴歸是跟在線性迴歸後面出現的,當時感受這應該就是個「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優化的時候根據類別肯定了梯度的正負(實際上是肯定要加上這部分梯度仍是減去),這個是公式上沒出現的。個人理解是前面計算梯度的公式在向量應用的時候有點問題,這部分若是有疑問就深刻討論。

相關文章
相關標籤/搜索