逻辑回归原理及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

    这个函数也可以使用分段的形式呈现,但是写成统一的形式更加简洁,后续也更好处理。

扫描二维码关注公众号,回复: 4833201 查看本文章

    而对此代价函数求偏导,可以得到如下迭代公式:

    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

    可以看到这个椭圆的决策边界比上面的模型要更好更精确。

猜你喜欢

转载自blog.csdn.net/qq_32216775/article/details/86072337