• 【笔记】浅谈逻辑回归以及逻辑回归的损失函数


    逻辑回归算法

    逻辑回归算法的概念不咋叙述

    逻辑回归算法看上去是解决回归问题的算法,但是其实是解决的分类问题,那么回归算法是如何解决分类问题呢?逻辑回归的原理是将样本的特征和样本发生的概率联系起来,即预测这个样本的发生概率是多少,而这个概率是一个数,因此可称这个为回归问题

    对于机器算法来说,其本质就是求解一个函数,将样本代入,经过函数计算以后可以得到一个预测的值,在线性回归和多项式回归中,预测的值和问题具有很强的关联性,但是在逻辑回归中,预测的值其本质就是概率值,也就是说,将样本代入函数计算以后,可以得到一个概率值,之后根据这个概率值进行分类,如果有一半的概率发生的话,就等于1,反之等于0(1和0的意义看问题)

    从上面的叙述中可以发现,逻辑回归算法既可以看做是一个回归算法,又可以看作是一个分类算法,如果没有最后的分类的话,其就是一个回归算法,算出来的是根据样本特征来拟合一个事件发生的概率,不过通常拿来用于作为分类算法,注意的是,其只能解决二分类的问题,对于多分类问题,其本身是不支持的

    逻辑回归的计算方式

    一个样本包含若干特征,经过函数的计算,就得到了对应的y值,对于线性回归来说,其就是

    这样得到的y值,其值域是正无穷到负无穷的,即通过线性回归的方式可以得到任意的值,对于概率来讲,只能在0和1之间取值,因此直接使用线性回顾的方式得到的结果没有值域的限制,这就让最后拟合出来的函数可信程度不高

    解决方案很简单,使用线性回归的方式得到的结果,将这结果作为特征值送到新的函数中

    经过转换以后就可以得到一个在0到1之间的值,这就得到了xb中发生某一个特定事件的概率是多少了

    新的函数一般使用sigmoid函数,其表达式为

    具体实现的操作

    (在notebook中)

    加载好包以后,定义sigmoid函数,设置绘制的x和y的范围,然后绘制

      import numpy as np
      import matplotlib.pyplot as plt
    
      def sigmoid(t):
          return 1 / (1 + np.exp(-t))
    
      x = np.linspace(-10,10,500)
      y = sigmoid(x)
    
      plt.plot(x,y)
    

    图像为

    对于这根曲线来说,左端和右端都趋向于0和1,也就是说值域是在0和1之间,可以发现,在t>0的时候,p>0.5,t<0时,p<0.5,使用函数,将求出来的结果进行sigmoid函数计算,之后根据得到的值来分类

    这就有了问题,对于给定的样本数据集,我们如何才能找到参数theta,使用这种方式可以最大程度的获得样本数据集对应的分类输出呢?

    逻辑回归的损失函数

    逻辑回归的整体框架如下

    那么应该怎么建模来求出theta?

    在线性回归中,在theta乘上xb之后就是估计值,让估计值减去真值,用这个差来度量估计的好坏,对这个差进行平方和以后再平均(MSE),作为损失函数,然后找到使损失函数最小的theta就行了

    对于逻辑回归,整体方向是一样的,只不过比较麻烦,由于逻辑回归解决的是个分类问题,所以得出的数据,要不是1,要不是0,需要根据先前计算出的概率来估计是1还是0,那么损失函数也可以分成两类,如果真值为1,p越小,cost越大,如果真值等于0,p越大,cost越大(cost为损失)

    也就是说首先根据分类的不同制定出了损失的大致趋势,根据真值的不同,分为两种情况

    根据log函数的图像的特性,可以使用log函数来设计损失函数

    在p取0的时候,此时函数趋近于正无穷,p取1的时候,函数为1,通过前面的分析和图像的理解,可以很清楚的明白其代表的意义

    很显然,这个函数用起来是不太方便的,那么就在两个式子前加上一个系数,用来表示y的状态,这样就合为了一个函数

    如果有m个样本,则就将这些损失加在一起

    其中的预测结果为

    那么整体的数学解函数就为(凸函数,只存在全局最优解)

    接下来就是找到一组theta,使上式得到最小值,这个函数没有公式解,只能使用梯度下降法来求解

    经过一系列的操作计算,最后可以得到对于逻辑回归的损失函数来说的相应的梯度为

    这样只用使用公式以及梯度下降法就可以解除逻辑回归算法的问题

  • 相关阅读:
    矩阵求逆的几种方法总结(C++)
    c++ 继承类强制转换时的虚函数表工作原理
    博客开通(附本博客样式)
    Python-SocketServer模块
    Python-UDP编程
    Python-TCP编程
    Python-logging模块
    Python-多线程+多进程包(concurrent包,处理并发)
    07数组与接口
    java作业 06
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14320995.html
Copyright © 2020-2023  润新知