机器学习_4:logistic回归

文章目录

  • 实验背景
  • 1.logistic回归算法原理
    • 1.1.线性回归
    • 1.2.对数线性回归
    • 1.3.logistic回归
  • 2.logistic回归算法代码分析
  • 3.logistic回归算法实验
  • 4.总结

实验背景

相比k近邻算法和决策树算法,logistic回归算法算是真正意义上的机器学习基础算法,哪怕是现在的深度学习,一样有用到logistic回归算法的内容。而logistic回归算法很大程度上和线性回归以及对数线性回归有关,本次实验就来介绍logistic回归算法的原理和作为分类算法的效果。

1.logistic回归算法原理

1.1.线性回归

假设有这么一堆数据集
在这里插入图片描述
我们的目标就是找到
在这里插入图片描述
比如我们要找到房子价格的线性回归函数,在考虑该函数只与房子面积相关的情况下有
机器学习_4:logistic回归_第1张图片
核心目标就是找到这个w和b,使得估计的f(x)符合对应的y。对于我们来说,这个f(x)和y的差距越小越好,所以我们使用最小二乘法来进行判断
机器学习_4:logistic回归_第2张图片
高中的时候我们已经学习过最小二乘法的计算公式,这里我们列出完整的解决过程,已解决求多个w的问题,我们对w和b求偏导,并令他们等于0,可得到公式
机器学习_4:logistic回归_第3张图片
机器学习_4:logistic回归_第4张图片
这就是只有一个w的情况下,w和b的解。那么w代表什么呢?w会影响到线性回归函数的斜率,也就是说w可以理解为实例的属性,而多个w就可以理解为实例的各个属性,这些属性共同影响实例的值
。同理,对于多个w,我们可以分别对他们进行偏导并令其等于0,解开这个多元一次方程组就可以找到我们想要的线性回归方程。
机器学习_4:logistic回归_第5张图片
该图就是两个w的情况下,回归函数与x的关系。

1.2.对数线性回归

虽然线性回归方程看起来很美好,但实际上,生活中很少有单纯用线性回归函数就能描述的现象。这时候我们就需要用到对数线性回归函数,使得我们在保留线性回归函数特性的同时更好的预测非线性复杂函数。
线性回归模型:
在这里插入图片描述
可推广至:
在这里插入图片描述
实际上这个函数可以不停地进行嵌套得到一个复杂的套娃函数。我们举个简单的例子
机器学习_4:logistic回归_第6张图片
机器学习_4:logistic回归_第7张图片
这就是最基础的对数线性回归,logistic就是基于这种回归来改进与完善的。

1.3.logistic回归

logistic回归一般用来解决分类问题,尽管其对解决的问题规模并没有限制,但一般来说,最适合他解决的问题是二分类问题。对于线性函数来说,二分类问题最好分成y=0与y=1的阶跃函数。
机器学习_4:logistic回归_第8张图片
那么问题显而易见,这是不连续且不可微的。当预测目标处于范围边界的情况下,我们该如何进行判断他到底属于哪一类呢?
logistic函数(sigmoid)函数就是解决这个问题的
机器学习_4:logistic回归_第9张图片
机器学习_4:logistic回归_第10张图片
机器学习_4:logistic回归_第11张图片
很明显,当x的取值范围扩大后,对应y的取值十分接近0或1,这就是其适合解决二分类的问题的原因
那么求w与b的值,我们可以采用极大似然估计法,假设我们有数据集
在这里插入图片描述
我们要找到
机器学习_4:logistic回归_第12张图片

在这里插入图片描述

在这里插入图片描述
可简写为
在这里插入图片描述
再令
在这里插入图片描述
x对应y为1的几率
在这里插入图片描述
x对应y为0的几率
则有
在这里插入图片描述
x对应y的取值,为y=1的概率和y=0概率乘以实际值的和
y=1的概率和y=0的概率我们通过对数几率来求取
机器学习_4:logistic回归_第13张图片
机器学习_4:logistic回归_第14张图片
机器学习_4:logistic回归_第15张图片
最后我们可以得到
机器学习_4:logistic回归_第16张图片
根据sigmoid函数,似然函数可重写为:
在这里插入图片描述
最后求解得:
在这里插入图片描述
可以明确的说,该函数无法通过数学来得出明确的解,所以我们只能通过牛顿法来不断地调整参数使得我们求解的值接近我们理想中的数值。
牛顿法第t+1轮迭代解的更新公式
在这里插入图片描述
机器学习_4:logistic回归_第17张图片

2.logistic回归算法代码分析

from numpy import *
#sigmoid函数
def sigmoid(inX):
    return 1.0/(1.0+exp(-inX))
#计算0,1概率
def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: 
        return 1.0
    else: 
        return 0.0
#迭代计算权重
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m,n = shape(dataMatrix)
    weights = ones(n)
    for j in range(numIter):
        dataIndex = list(range(m))
        for i in range(m):
            alpha = 4/(1.0+j+i)+0.0001
            randIndex = int(random.uniform(0,len(dataIndex)))
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights
#训练返回错误率
def colicTest():
    #训练集
    frTrain = open('D:/vscode/python/.vscode/test_data.txt')
    #测试集
    frTest = open('D:/vscode/python/.vscode/train_data.txt')
    trainingSet = []
    trainingLabels = []
    #训练集
    for line in frTrain.readlines():
        currLine = line.strip().split('\t')
        lineArr =[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        trainingSet.append(lineArr)
        trainingLabels.append(float(currLine[21]))
    trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 500)
    errorCount = 0
    numTestVec = 0.0
    #测试集
    for line in frTest.readlines():
        numTestVec += 1.0
        #切割属性
        currLine = line.strip().split('\t')
        lineArr =[]
        for i in range(21):
            lineArr.append(float(currLine[i]))
        #判断值是否和真实值一致
        if int(classifyVector(array(lineArr), trainWeights))!= int(float(currLine[21])):
            errorCount += 1
    #计算错误率
    errorRate = (float(errorCount)/numTestVec)
    print ("本次训练的错误率为%f" % errorRate)
    return errorRate
#多次调用函数,求得平均错误率
def multiTest():
    numTests = 100
    errorSum=0.0
    for k in range(numTests):
        errorSum += colicTest()
    print ("%d 次训练的平均错误率为: %f" % (numTests, errorSum/float(numTests)))

3.logistic回归算法实验

本次实验使用了优秀文章数据集,通过点击数,阅读量等20个属性数据来判断一篇文章是否优秀文章。100次实验结果如下
机器学习_4:logistic回归_第18张图片

4.总结

Logistic回归优点
1.无需事先假设数据分布
2.可得到“类别”的近似概率预测(概率值还可用于后续应用)
3.可直接应用现有数值优化算法(如牛顿法)求取最优解,具有快速、高效的特点
本次实验查找了大量数据集,发现如果属性的取值范围为-1~1之间的话,很难进行准确的分类,更换数据集将数字范围扩大后则效果有着明显提升。

你可能感兴趣的:(算法,python,机器学习)