机器学习实战——笔记(Logistic 回归)

Logistic 回归

目录
  • logistics 概述
  • 梯度上升算法
  • 随机梯度上升算法
  • 改进的随机梯度上升算法
一、logistics 概述

谈到“逻辑回归”,不得不说的就是 sigmoid 函数

s i g m o i d ( z ) = 1 1 + e − z sigmoid(z) = \frac{1}{1+e^{-z}} sigmoid(z)=1+ez1

函数图像:
机器学习实战——笔记(Logistic 回归)_第1张图片

可以知道:
当z=0时,s(z)=0.5
当z→正无穷,s(z)趋于1
当z→负无穷,s(z)趋于0

二、梯度上升算法

与梯度下降算法一个道理,只不过梯度下降找的是最小值,所以加上了负号,而这边不需要负号
公式如下:
w = w + a ▽ w f ( w ) w = w + a▽_wf(w) w=w+awf(w)

代码如下:

from numpy import *
from numpy.ma import exp, array, arange
import matplotlib.pyplot as plt


# 加载数据集
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[2]))
    return dataMat, labelMat


# sigmoid公式
def sigmoid(inX):
    return 1.0/(1+exp(-inX))


# 梯度上升算法
def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)                 # 转成矩阵
    labelMat = mat(classLabels).transpose()     # transpose()是转置,行向量转成列向量
    m, n = shape(dataMatrix)                    # 100×3
    alpha = 0.001       # 向目标移动的步长,其实就是learning rate(学习率)
    maxCycles = 500     # 迭代次数
    weights = ones((n, 1))      # 设置初始权重都为1
    print(dataMatrix*weights)
    for k in range(maxCycles):              # heavy on matrix operations
        h = sigmoid(dataMatrix*weights)     # matrix mult
        error = (labelMat - h)              # vector subtraction
        weights = weights + alpha * dataMatrix.transpose()*error   # 解释:https://blog.csdn.net/kaka19880812/article/details/46993917
    return weights

其中这步不好理解:

        weights = weights + alpha * dataMatrix.transpose()*error  

解释如下:
机器学习实战——笔记(Logistic 回归)_第2张图片

三、随机梯度上升算法

随机梯度上升算法与梯度上升算法在代码上很相似,但也有一些区别:
第一,后者的变量h和误差erro都是向量,而前者则全是数值
第二,前者没有矩阵的转换过程,所有变量的数据类型都是NumPy数组

代码如下:

# 随机梯度上升算法
def stocGradAscent0(dataMatrix, classLabels):
    m, n = shape(dataMatrix)
    alpha = 0.01
    weights = ones(n)
    for i in range(m):
        h = sigmoid(sum(dataMatrix[i]*weights))
        error = classLabels[i] - h
        weights = weights + alpha * error * dataMatrix[i]
    return weights

随机梯度上升算法计算复杂度相对较低,它是一个个样本进行迭代参数。

四、改进的梯度上升算法

改进的地方就是:
1、learning rate :先大后小,随迭代次数不断变化
2、随机选取样本,并非按顺序

代码:

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    # apha decreases with iteration, does not
            randIndex = int(random.uniform(0, len(dataIndex)))   # go to 0 because of the constant
            h = sigmoid(sum(dataMatrix[randIndex]*weights))
            error = classLabels[randIndex] - h
            weights = weights + alpha * error * dataMatrix[randIndex]
            del(dataIndex[randIndex])
    return weights

你可能感兴趣的:(机器学习)