菜单

python机器学习理论与实战(4)逻辑回归

2019年6月5日 - Php

         从那节算是初步进入“正规”的机械学习了啊,之所以“正规”因为它起初要树立价值函数(cost
function),接着优化价值函数求出权重,然后测试表明。这总体的流水生产线是机器学习必经环节。前日要读书的话题是逻辑回归,逻辑回归也是一种有监督学习方法(supervised
machine
learning)。逻辑回归一般用来做揣测,也得以用来做分类,预测是某些项目^.^!线性回归想比我们都不不熟悉了,y=kx+b,给定一群数办事处,拟合出k和b的值就行了,下一次给定X时,就足以测算出y,那正是回归。而逻辑回归跟这一个略带差别,它是一种非线性函数,拟合成效极为庞大,而且它是接2连三函数,能够对其求导,那一点很主要,如若3个函数不可求导,这它在机器学习用起来很麻烦,初期的海维赛德(Heaviside)阶梯函数就就此被sigmoid函数代替,因为可导意味着大家能够长足找到其极值点,那正是优化措施的最首要观念之一:利用求导,获得梯度,然后用梯度下跌法立异参数。

python机器学习理论与实战(四)逻辑回归,python学习理论

         从那节算是开端进入“正规”的机械学习了呢,之所以“正规”因为它先导要身无寸铁价值函数(cost
function),接着优化价值函数求出权重,然后测试申明。这1切的流水生产线是机器学习必经环节。后天要学习的话题是逻辑回归,逻辑回归也是1种有监督学习方法(supervised
machine
learning)。逻辑回归一般用来做测度,也能够用来做分类,预测是有些项目^.^!线性回归想比大家都不面生了,y=kx+b,给定一群数总部,拟合出k和b的值就行了,下一次给定X时,就足以测算出y,那正是回归。而逻辑回归跟那些略带差异,它是壹种非线性函数,拟合作用极为强大,而且它是连接函数,能够对其求导,那一点很要紧,就算贰个函数不可求导,那它在机械学习用起来很麻烦,开始时期的海维赛德(Heaviside)阶梯函数就就此被sigmoid函数替代,因为可导意味着我们可以长足找到其极值点,那正是优化措施的主要观念之1:利用求导,获得梯度,然后用梯度降低法立异参数。

        上面来探望逻辑回归的sigmoid函数,如(图一)所示:

图片 1

(图一)

            (图一)中上海体育场合是sigmoid函数在定义域[-5,5]
上的形状,而下图是在定义域[-60,60]上的形制,由那四个图能够看来,它相比较符合做2类的回归,因为严重两级差别。Sigmoid函数的如(公式一)所示:

图片 2

(公式一)

        
现在有了二类回归函数模型,就能够把特色映射到那个模型上了,而且sigmoid函数的自变量唯有四个Z,要是大家的性状为X=[x0,x1,x2…xn]。令图片 3,当给定大批判的锻练样本特征X时,我们借使找到适当的W=[w0,w1,w2…wn]来科学的把种种样本特征X映射到sigmoid函数的两级上,也正是说正确的达成了种类回归就行了,那么以往来个测试样本,只要和权重相乘后,带入sigmoid函数总括出的值就是预测值啦,相当粗略是啊。那怎么求权重W呢?

         
要总计W,就要进来优化求解阶段咯,用的办法是梯度下落法依旧私自梯度下跌法。提起梯度下落,梯度下跌一般对什么求梯度呢?梯度是多少个函数上涨最快的趋势,沿着梯度方向大家能够长足找到极值点。大家找什么样极值?仔细研商,当然是找陶冶模型的误差极值,当模型预测值和演习样本给出的精确值之间的标称误差和最小时,模型参数就是大家供给的。当然固有误差最小有希望导致过拟合,那些今后再说。大家先创设模型磨练偶尔误价格差别值函数(cost
function),如(公式2)所示:

图片 4

(公式二)

       
(公式二)中Y表示练习样本真实值,当J(theta)最小时的所得的theta就是我们渴求的模型权重,能够见见J(theta)是个凸函数,获得的最小值也是大局最小。对其求导后得出梯度,如(公式3)所示:

图片 5

(公式三)

       
由于大家是找非常的小值,而梯度方向是特大值方向,由此大家取负号,沿着负梯度方向更新参数,如(公式四)所示:

图片 6

(公式四)

       
遵照(公式四)的参数更新方法,当权重不再变化时,大家就扬言找到了极值点,此时的权重也是大家需要的,整个参数更新暗中表示图如(图2)所示:

图片 7

(图二)

规律到此甘休逻辑回归基本就说完了,下边进入代码实战阶段:

from numpy import * 

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 

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

下边多个函数分别是加载磨练集和定义sigmoid函数,都相比不难。下边发出梯度降低的代码:

def gradAscent(dataMatIn, classLabels): 
  dataMatrix = mat(dataMatIn)       #convert to NumPy matrix 
  labelMat = mat(classLabels).transpose() #convert to NumPy matrix 
  m,n = shape(dataMatrix) 
  alpha = 0.001 
  maxCycles = 500 
  weights = ones((n,1)) 
  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 #matrix mult 
  return weights 

        
梯度下落输入练习集和对应标签,接着就是迭代跟新参数,计算梯度,然后更新参数,注意尾数第壹句正是遵守(公式三)和(公式肆)来更新参数。

为了直观的看看大家赢得的权重是或不是科学的,大家把权重和范本打字与印刷出来,上边是相关打字与印刷代码:

def plotBestFit(weights): 
  import matplotlib.pyplot as plt 
  dataMat,labelMat=loadDataSet() 
  dataArr = array(dataMat) 
  n = shape(dataArr)[0]  
  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) 
  ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') 
  ax.scatter(xcord2, ycord2, s=30, c='green') 
  x = arange(-3.0, 3.0, 0.1) 
  y = (-weights[0]-weights[1]*x)/weights[2] 
  ax.plot(x, y) 
  plt.xlabel('X1'); plt.ylabel('X2'); 
  plt.show() 

打字与印刷的功力图如(图3)所示:

图片 8

(图三)

      
能够见见效果蛮不错的,小错误是免不了的,即使陶冶集未有不当反而危急,聊到那基本就说完了,然而思考到那几个办法对一丢丢样书(几百的)还不错,在实际中当遇到10亿数码级时,而且特征维数上千时,这种办法很害怕,光总结梯度就要消耗多量时刻,因而要动用随机梯度降低方法。随机梯度下跌算法和梯度下落算法原理一样,只是计算梯度不再使用全体样本,而是利用三个如故一小批来测算梯度,那样可以削减总括代价,即使权重更新的门路很波折,但提起底也会熄灭的,如(图肆)所示

图片 9

(图四)

上边也产生随机梯度下跌的代码:

def stocGradAscent1(dataMatrix, classLabels, numIter=150): 
  m,n = shape(dataMatrix) 
  weights = ones(n)  #initialize to all ones 
  for j in range(numIter): 
    dataIndex = 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 

末段也提交1个分拣的代码,只要把阈值设为0.⑤,大于0.5划为1类,小于0.五划为另一类就行了,代码如下:

def classifyVector(inX, weights): 
  prob = sigmoid(sum(inX*weights)) 
  if prob > 0.5: return 1.0 
  else: return 0.0 

总结:

        优点:总计量不高,轻易达成,对切实数据也很轻松描述

        缺点:很轻巧欠拟合,精度可能也会不高

参谋文献:

    [1] machine learning in action. Peter Harrington

    [2] machine learning.Andrew Ng

上述就是本文的全体内容,希望对我们的上学抱有援助,也期待我们多多协助帮客之家。

http://www.bkjia.com/Pythonjc/1295417.htmlwww.bkjia.comtruehttp://www.bkjia.com/Pythonjc/1295417.htmlTechArticlepython机器学习理论与实战(四)逻辑回归,python学习理论
从那节算是早先进入“正规”的机器学习了呢,之所以“正规”因为它初阶要两手空空…

        上面来看望逻辑回归的sigmoid函数,如(图一)所示:

图片 10

(图一)

            (图1)中上海体育场面是sigmoid函数在定义域[-5,5]
上的形态,而下图是在定义域[-60,60]上的造型,由那五个图能够见见,它相比较相符做2类的回归,因为严重两级差别。Sigmoid函数的如(公式1)所示:

图片 11

(公式一)

        
今后有了2类回归函数模型,就足以把特色映射到那一个模型上了,而且sigmoid函数的自变量唯有叁个Z,即便大家的特征为X=[x0,x1,x2…xn]。令图片 12,当给定大批判的练习样本特征X时,大家只要找到确切的W=[w0,w1,w2…wn]来不易的把各种样本特征X映射到sigmoid函数的两级上,也正是说准确的到位了档案的次序回归就行了,那么之后来个测试样本,只要和权重相乘后,带入sigmoid函数总计出的值正是预测值啦,很简短是吧。那怎么求权重W呢?

         
要总结W,就要进入优化求解阶段咯,用的点子是梯度下跌法依然随意梯度下落法。谈起梯度下落,梯度降低一般对怎么求梯度呢?梯度是多少个函数上涨最快的势头,沿着梯度方向我们能够比异常快找到极值点。我们找什么极值?仔细想想,当然是找磨炼模型的抽样误差极值,当模型预测值和练习样本给出的准确值之间的误差和最刻钟,模型参数就是大家渴求的。当然抽样误差最小有比较大可能率引致过拟合,那些未来再说。大家先创造模型练习抽样误价格差别值函数(cost
function),如(公式二)所示:

图片 13

(公式二)

       
(公式二)中Y表示演习样本真实值,当J(theta)最时辰的所得的theta就是大家须求的模子权重,能够观望J(theta)是个凸函数,获得的最小值也是全局最小。对其求导后得出梯度,如(公式3)所示:

图片 14

(公式三)

       
由于大家是找非常小值,而梯度方向是巨大值方向,因而我们取负号,沿着负梯度方向更新参数,如(公式肆)所示:

图片 15

(公式四)

       
根据(公式四)的参数更新方法,当权重不再变化时,我们就声称找到了极值点,此时的权重也是大家须求的,整个参数更新暗中提示图如(图贰)所示:

图片 16

(图二)

规律到此结束逻辑回归基本就说完了,上边进入代码实战阶段:

from numpy import * 

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 

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

下面四个函数分别是加载磨练集和定义sigmoid函数,都比较轻便。上面发出梯度降低的代码:

def gradAscent(dataMatIn, classLabels): 
  dataMatrix = mat(dataMatIn)       #convert to NumPy matrix 
  labelMat = mat(classLabels).transpose() #convert to NumPy matrix 
  m,n = shape(dataMatrix) 
  alpha = 0.001 
  maxCycles = 500 
  weights = ones((n,1)) 
  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 #matrix mult 
  return weights 

        
梯度下落输入锻练集和呼应标签,接着正是迭代跟新参数,总结梯度,然后更新参数,注意倒数第1句正是比照(公式叁)和(公式四)来更新参数。

为了直观的观察大家得到的权重是或不是科学的,大家把权重和样本打字与印刷出来,上面是相关打印代码:

def plotBestFit(weights): 
  import matplotlib.pyplot as plt 
  dataMat,labelMat=loadDataSet() 
  dataArr = array(dataMat) 
  n = shape(dataArr)[0]  
  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) 
  ax.scatter(xcord1, ycord1, s=30, c='red', marker='s') 
  ax.scatter(xcord2, ycord2, s=30, c='green') 
  x = arange(-3.0, 3.0, 0.1) 
  y = (-weights[0]-weights[1]*x)/weights[2] 
  ax.plot(x, y) 
  plt.xlabel('X1'); plt.ylabel('X2'); 
  plt.show() 

打字与印刷的成效图如(图3)所示:

图片 17

(图三)

      
能够见见效果蛮不错的,小错误是在劫难逃的,如若陶冶集未有不当反而危险,谈起那基本就说完了,然则怀想到那个措施对一点点样书(几百的)还可以,在事实上中当碰着十亿数量级时,而且特征维数上千时,这种办法很恐惧,光总括梯度将要开销多量时日,由此要选拔随机梯度降低方法。随机梯度降低算法和梯度降低算法原理同样,只是一个钱打二十六个结梯度不再动用具备样本,而是采用四个要么一小批来总计梯度,那样能够减去总计代价,尽管权重更新的路径很波折,但最后也会消退的,如(图四)所示

图片 18

(图四)

上面也时有发生随机梯度降低的代码:

def stocGradAscent1(dataMatrix, classLabels, numIter=150): 
  m,n = shape(dataMatrix) 
  weights = ones(n)  #initialize to all ones 
  for j in range(numIter): 
    dataIndex = 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 

末尾也交由一个分拣的代码,只要把阈值设为0.伍,大于0.5划为一类,小于0.5划为另一类就行了,代码如下:

def classifyVector(inX, weights): 
  prob = sigmoid(sum(inX*weights)) 
  if prob > 0.5: return 1.0 
  else: return 0.0 

总结:

        优点:总结量不高,轻便完成,对现实数据也很轻便描述

        缺点:很轻便欠拟合,精度恐怕也会不高

参谋文献:

    [1] machine learning in action. Peter Harrington

    [2] machine learning.Andrew Ng

如上便是本文的全体内容,希望对大家的上学抱有支持,也愿意我们多多帮忙脚本之家。

您或者感兴趣的小说:

相关文章

发表评论

电子邮件地址不会被公开。 必填项已用*标注

网站地图xml地图