1. 程式人生 > >邏輯迴歸原理及matlab實現

邏輯迴歸原理及matlab實現

個人部落格文章連結:  http://www.huqj.top/article?id=163

對於某些分類問題,自變數可能是連續的,但是因變數卻可能是離散的,例如:根據腫瘤大小判斷該腫瘤是否是良性。這種問題不適合用線性迴歸來解決,雖然可以將連續的因變數值對映到離散的分類上,但是效果和訓練複雜度都不盡如人意。因此,邏輯迴歸(logistic regression)就成為了一個解決分類問題的好方法。

    所謂邏輯迴歸,就是通過函式模型將因變數的值控制到0~1之間,然後通過梯度下降法求出模型的引數,最後使用一個值域在(0,1)的函式進行預測,預測的結果就是分類為1的概率。

    使用一個叫做sigmoid函式的和普通的線性迴歸函式組成複合函式就可以將函式的值域控制在0到1之間,sigmoid函式如下:

    image.png

    該函式的函式影象如下:

    image.png

    該複合函式就是邏輯迴歸的函式模型,而代價函式不適合使用線性迴歸相同的函式,因為線性迴歸函式的代價函式是和絕對誤差成二次方比例的,不能很好的衡量訓練誤差,對於邏輯迴歸中的訓練誤差,我們需要一個更加強的懲罰,這個函式就是指數型函式,因為指數型函式的函式值在0~1之間導數絕對值極大,可以達到很好的訓練誤差“懲罰”效果:即訓練出現誤差的時候,代價函式會很大。

    因此邏輯迴歸的代價函式如下:

    image.png

    這個函式也可以使用分段的形式呈現,但是寫成統一的形式更加簡潔,後續也更好處理。

    而對此代價函式求偏導,可以得到如下迭代公式:

    image.png

    ==》

    image.png

    應用梯度下降法實現邏輯迴歸的matlab程式碼如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

34

35

function theta=LogisticRegression(data, maxIndex, alpha, threshold, maxTimes)

    %測試邏輯迴歸

     

    %測試資料

%     data = [0 0 0; 0 1 0; 0 1.5 0; 0.5 0.5 0; 0.5 1 0; 1 0.95 0; 0.5 1.4 0; 1.5 0.51 0; 2 0 0; 

%         1.9 0 0; 0 3 1; 0 2.1 1; 0.5 1.8 1; 0.8 1.5 1; 1 1.2 1; 1.5 2 1; 3 0 1; 3 1 1; 2 2 1; 

%         3 4 1; 1.8 0.5 1];

%     maxIndex = 2;

%     alpha = 0.1;

%     threshold = 0.00001;

%     maxTimes = 1000;

     

    dataSize = size(data);

    dataLen = dataSize(1);

    paramLen = maxIndex + 1;

    theta = zeros(paramLen, 1);

    theta0 = theta;

     

    times = 0;

    cost0 = 0;

    cost1 = 1;

     

    while abs(cost1-cost0) > threshold && times < maxTimes

        times = times + 1;

        theta0 = theta;

        cost0 = LogisticRegressionCostFun(theta, data);

        for i = 1 : dataLen

            tmp = ((1 / (1 + exp(-theta0' * [1, data(i,1:maxIndex)]'))) - data(i, paramLen)) / dataLen; 

            theta(1) = theta(1) - alpha * tmp;

            for j = 2 : paramLen

               theta(j) = theta(j) - alpha * tmp * data(i, j - 1); 

            end

        end

        cost1 = LogisticRegressionCostFun(theta, data);

    end

     代價函式:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

function cost=LogisticRegressionCostFun(theta, data)

    %邏輯迴歸的代價函式計算

     

    paramLen = length(theta);

    X = zeros(paramLen, 1);

    dataSize = size(data);

    dataLen = dataSize(1);

    cost = 0;

    for i = 1 : dataLen

        X(1) = 1;

       for k = 1 : paramLen - 1

          X(k + 1) = data(i, k); 

       end

       cost = cost + 

           (-data(i, 3) * log(1/(1 + exp(-(theta' * X)))) 

           - (1 - data(i, 3)) * log(1 - 1/(1 + exp(-(theta' * X)))));

    end

    cost = cost / dataLen;

    使用一個決策邊界為直線的訓練資料集訓練,可以得到如下的影象:

    image.png

    其中橫縱座標分別代表兩個自變數,紅白顏色代表兩種類別,綠色的線則是訓練出來的決策邊界。

    

    上面是決策邊界為直線的情況,還有很多時候決策邊界並非直線,例如下面這種情況:

    image.png

    這時候就不能選擇線性模型來訓練,而要想辦法提高變數的指數

    使用x1變數最高二次方但是x2變數一次方的模型訓練出來的邊界如下(實際就是一個二次函式的影象)

    image.png

    但是這個模型仍然不能很好的模擬,所以選擇將x2變數也提高至二次方,得到如下決策邊界:

    image.png

    可以看到這個橢圓的決策邊界比上面的模型要更好更精確。