Logistic回归

本文介绍了逻辑回归的基本概念,从线性模型出发,探讨了最小二乘法和极大似然估计在求解中的应用,包括梯度上升算法和随机梯度改进。重点讲解了sigmoid函数如何处理非线性问题,以及logistic回归的优点,如概率预测和优化算法的使用。

logistic回归简介

线性模型与回归

线性模型的一般形式为

其中的X1,X2....Xd是由d维属性描绘的样本,其中的Xi是表明在第i个属性的取值

它的向量形式为

其中的W1,W2.....Wd为待求解系数

线性学习的目的

学习一个线性模型尽可能预测实际输出

最小二乘

因为线性学习的目的

引入参数/模型估计:最小二乘法(least square method)

Xi是一堆数据,那么就有误差,设回归值f(Xi)和实际值yi的误差是ei

那么就要求误差的最小值

最小化均方误差

求最小值 求导

然后对w,b求偏导

使上面两个式子都等于0得出

对数线性回归

线性回归模型 f(x)=wx+b,取合适的w和b使得预测值逼近真实标记y

那么怎么通过线性模型预测非线性复杂的函数呢

将线性回归模型推广

其中g是单调可微函数

例如假设g(x)=e^x 取x的对数lny就可以得到对数线性回归模型

logistic回归(分类问题)

线性模型衍生出一般形式

g是lnx函数

寻找函数将分类标记与线性回归模型输出联系起来。

逻辑斯蒂函数(logistic/sigmoid function)

单调可微、任意阶可导

逻辑回归是拟合“y的sigmoid函数”

运用sigmoid函数

极大似然法

极大似然估计 recap

计算每个样本的X1,X2,,Xn的概率密度构造似然密度函数

通过似然函数最大化(求导为零),求解未知参数

梯度下降

求参数

求解得

牛顿法迭代t+1代后

\beta的一阶和二阶导数如上

实例

import numpy as np
import array
import random
 
#数据加载
def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open('C:/Users/zhoutao/Desktop/testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
        labelMat.append(int(lineArr[2]))
    return dataMat,labelMat
 
 
#Sigmoid函数
def sigmoid(inX):
    return 1.0/(1+np.exp(-inX))
 
 
def gradAscent(dataMathIn,classLabel):
    dataMatrix = np.mat(dataMathIn) #将列表转化为numpy的矩阵
    labelMat = np.mat(classLabel).transpose()   #将列表转化为矩阵,并求转置(transpose)
    m,n = np.shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500     #迭代次数
    weight = np.ones((n,1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix*weight)
        error = labelMat - h    #(y-h)误差值
        weight = weight + alpha*dataMatrix.transpose()*error #w=w+alpha*(y-h)*x梯度上升的迭代公式
    return weight
 
 
#画出决策边界
def plotBestFit(weight):
    import matplotlib.pyplot as plt
    dataMat,labelMat = loadDataSet()
    dataArr = np.array(dataMat)
    n = np.shape(dataArr)[0] #[0]求dataArr的行数,1,是求列数
    xcord1 = []
    ycord1 = []
    xcord2 = []
    ycord2 = []
    for i in range(n):  #分类
        if int(labelMat[i]==1):
            xcord1.append(dataArr[i,1])
            ycord1.append(dataArr[i,2])
        else:
            xcord2.append(dataArr[i,1])
            ycord2.append(dataArr[i,2])
 
    fig = plt.figure()
    ax = fig.add_subplot(111)   #添加subplot
    ax.scatter(xcord1,ycord1,s = 30,c='red',marker = 's')   #绘制正样本
    ax.scatter(xcord2,ycord2,s = 30, c = 'green')   #绘制负样本
    w = np.array(weight)
    x = np.arange(-3.0,3.0,0.1) #X轴的取值范围
    y = (-w[0] - w[1] * x) / w[2] #设sigmoid =0,因为sigmoid = 0是两种类别的分界线  sigmoid = w0x0+w1x1+w2x2 = 0
    ax.plot(x,y)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()
 
 
#随机梯度上升
def stoGradAscent0(dataMatrix,classLabels):
    dataMatrix=np.array(dataMatrix)
    m,n = np.shape(dataMatrix)
    alpha = 0.01
    weight = np.ones(n)
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i]*weight))
        error = classLabels[i] - h
        weight = weight +alpha*error*dataMatrix[i]
    return weight
 
 
#随机梯度算法的改进
def stoGradAscent1(dataMatrix,classLabels,numIter = 150):
    dataMatrix=np.array(dataMatrix)
    m,n = np.shape(dataMatrix)
    weight = np.ones(n)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.01 #降低alpha的大小,每次减小1/(j+i)。
            randIndex = int(random.uniform(0,len(dataIndex))) #随机选取样本,可以实现随机选取更新
            h = sigmoid(sum(dataMatrix[randIndex]*weight))
            error = classLabels[randIndex] - h
            weight = weight + alpha*error*dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weight
 
 
 
 
dataMat,labelMat = loadDataSet()
# weight=gradAscent(dataMat,labelMat)
weight = stoGradAscent1(dataMat,labelMat)
plotBestFit(weight)

小结

Logistic回归优点

无需事先假设数据分布

可得到“类别”的近似概率预测(概率值还可用于后续应用)

可直接应用现有数值优化算法(如牛顿法)求取最优解,具有快速、高效的特点

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值