机器学习实战四(Logistic Regression)

机器学习实战四(Logistic Regression)

这一章会初次接触最优化算法,在日常生活中应用很广泛。这里我们会用到基本的梯度上升法,以及改进的随机梯度上升法。

Logistic回归

优点:计算代价不高,易于理解和实现

缺点:容易欠拟合,分裂精度可能不高

原理:根据现有数据堆分类边界线建立回归公式,依次进行分类。

这里的回归其实就是最佳拟合的意思。

1、基于Logistic回归和Sigmoid函数的分类。

我们需要一个这样的函数:接受所有的输入,然后预测出类别。例如,如果只有两类,则输出0和1,有个函数就有类似的性质,Sigmoid函数:

Sigmoid函数的具体计算公式如下:\(\sigma \left( z\right) =\dfrac {1}{1+e^{-z}}\)。

很容易证明界限在0-1之间,这样就保证,无论Sigmoid函数吃进去什么数,吐出来的数一定在0-1之间。

于是Logistic分类器就可以这样构造:对于每个特征乘以一个回归系数,然后相加,将这个数放入Sigmoid函数,如果得出来数字大于0.5,分类为1,否则为0.从这个角度来看,Logistic回归也是一种概率估计。

2、基于最优化方法的最佳回归系数确定

Sigmoid函数的输入记为z,那么:

\(z=w_{0}x_{0}+w_{1}x_{1}+\ldots +w_{n}x_{n}\),也可以写成:\(z=w^{T}x\),这里的向量w就是最佳回归系数。

这里我们采用的是梯度上升算法,具体原理按下不表,直接看代码。

from matplotlib import pyplot as plt
import numpy as np
import random

# 加载数据集
def loadDataSet():
    dataMat = []
    labelMat = []
    fr = open(‘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[-1]))
    return dataMat, labelMat

# Sigmoid函数
def sigmoid(inX):
    return 1.0 / (1 + np.exp(-inX))

# 梯度上升
def gradAscent(dataMatIn, classLabels):
    dataMatrix = np.mat(dataMatIn)
    labelMat = np.mat(classLabels).transpose()
    m, n = dataMatrix.shape
    alpha = 0.01
    maxCycles = 500
    weights = np.ones((n, 1))
    for k in range(maxCycles):
        h = sigmoid(dataMatrix * weights)
        error = (labelMat - h)
        weights = weights + alpha * dataMatrix.transpose() * error
    return weights

梯度上升算法在每次更新回归系数时都需要遍历整个数据集,这样的计算复杂度无疑是太高了。有一种改进的方法是每次只用一个样本点来更新回归系数,这种方法被称为随机梯度上升算法,在新的样本到来时可以增量更新,是一种在线学习算法。

# 随机梯度上升
def stocGradAscent(dataMatrix, classLabel, numIter=150):
    dataIndex = np.array(dataMatrix)
    classLabel = np.array(classLabel)
    m, n = dataMatrix.shape
    weights = np.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(np.sum(dataMatrix[randIndex] * weights))
            error = classLabel[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del dataIndex[randIndex]
    return weights

书中的预测病马死亡率的例子不难实现,而且介绍到数据预处理在机器学习中的重要性,因为机器学习的算法输入数据是有格式要求的,有时我们获取的数据会存在异常值或者缺失值的时候,就有进行预处理的必要。

Logistic小结:

寻找一个非线性函数Sigmoid的最佳拟合参数,求解过程由最优化算法完成,常用梯度上升算法,但是计算量大,可以由随机梯度上升算法改进,这是一个在线算法,在新数据到来时完成参数更新,不需要重新读取整个数据集。



Next:支持向量机,一种与Logistic回归类似的分类算法,被认为是目前最好的现成的算法之一。

总结:Logistic的原理并不复杂,这里只是初步接触最优化算法,像梯度上升和梯度下降之类的,还需要好好的研究。

References:https://github.com/plantree/Machine-Learing-In-Action/chapter5

原文地址:https://www.cnblogs.com/lucifer25/p/8259103.html

时间: 2024-11-07 16:25:57

机器学习实战四(Logistic Regression)的相关文章

机器学习实战python3 Logistic Regression

代码及数据:https://github.com/zle1992/MachineLearningInAction logistic regression 优点:计算代价不高,易于理解实现,线性模型的一种. 缺点:容易欠拟合,分类精度不高.但是可以用于预测概率. 适用数据范围:数值型和标称型. 准备数据: 1 def loadDataSet(): 2 dataMat,labelMat = [],[] 3 with open(filename,"r") as fr: #open file

《机器学习实战》Logistic回归算法(1)

===================================================================== <机器学习实战>系列博客是博主阅读<机器学习实战>这本书的笔记也包含一些其他python实现的机器学习算法 算法实现均采用python github 源码同步:https://github.com/Thinkgamer/Machine-Learning-With-Python ==================================

机器学习实战之Logistic回归

Logistic回归一.概述 1. Logistic Regression 1.1 线性回归 1.2 Sigmoid函数 1.3 逻辑回归 1.4 LR 与线性回归的区别 2. LR的损失函数 3. LR 正则化 3.1 L1 正则化 3.2 L2 正则化 3.3 L1正则化和L2正则化的区别 4. RL 损失函数求解 4.1 基于对数似然损失函数 4.2 基于极大似然估计 二. 梯度下降法 1. 梯度 2. 梯度下降的直观解释 3. 梯度下降的详细算法 3.1 梯度下降法的代数方式描述 3.2

机器学习实战:Logistic回归

第一眼看到逻辑回归(Logistic Regression)这个词时,脑海中没有任何概念,读了几页后,发现这非常类似于神经网络中单个神经元的分类方法. 书中逻辑回归的思想是用一个超平面将数据集分为两部分,这两部分分别位于超平面的两边,且属于两个不同类别(和SVM的想法有些相似),如下图: 因此,一般的逻辑回归只能处理两分类问题,同时两个类别必须是线性可分的.对于线性不可分问题,在SVM中,可以使用核函数升维的方式解决,不过那都是后话了.还是先看看逻辑回归吧. 一.Sigmoid函数 了解神经网络

Deep learning:四(logistic regression练习)

前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex4/ex4.html.这里给出的训练样本的特征为80个学生的两门功课的分数,样本值为对应的同学是否允许被上大学,如果是允许的话则用'1'表示,否则不允许就用'0'表示,这是一个典型的二分类问题.在此问题中,给出的80个

转载 Deep learning:四(logistic regression练习)

前言: 本节来练习下logistic regression相关内容,参考的资料为网页:http://openclassroom.stanford.edu/MainFolder/DocumentPage.php?course=DeepLearning&doc=exercises/ex4/ex4.html.这里给出的训练样本的特征为80个学生的两门功课的分数,样本值为对应的同学是否允许被上大学,如果是允许的话则用'1'表示,否则不允许就用'0'表示,这是一个典型的二分类问题.在此问题中,给出的80个

机器学习实战精读--------logistic回归

Logistic回归的主要目的:寻找一个非线性函数sigmod最佳的拟合参数 拟合.插值和逼近是数值分析的三大工具 回归:对一直公式的位置参数进行估计 拟合:把平面上的一些系列点,用一条光滑曲线连接起来 logistic主要思想:根据现有数据对分类边界线建立回归公式.以此进行分类 sigmoid函数:在神经网络中它是所谓的激励函数.当输入大于0时,输出趋向于1,输入小于0时,输出趋向0,输入为0时,输出为0.5 梯度上升:要找到某个函数的最大值,最好的方法是沿着该函数的梯度方向探寻 收敛:随着迭

机器学习基石(10)--Logistic Regression

如果我们想要知道的并不是绝对的是或者非,我们只想知道在是非发生的概率(只想知道概率,不想知道结果)是多少的时候: 虽然我们想要知道左边的完美数据,但是在实际生活中,我们只有右边的数据,也就是一些确定的结果,不可能有概率值这个事情让我们知道.而右边的数据可以看成是有噪声的不完美的数据. 怎么解决这样的问题呢? 有一种叫做sigmoid的函数可以满足这些要求. 这个函数(logistic function)可以把任何数转化成0到1之间的值.那么logistics regression的Ein怎么衡量

机器学习实战 logistic回归

logistic回归 梯度上升法 import numpy as np """ function: 加载数据 parameter: 无 returns: dataMat - 数据集 labelMat - 标签集 """ def loadDataSet(): dataMat = []#数据集 labelMat = []#标签集 fr = open('testSet.txt') for line in fr.readlines(): lineArr