码迷,mamicode.com
首页 > 其他好文 > 详细

LR(逻辑回归)

时间:2017-12-17 18:07:29      阅读:202      评论:0      收藏:0      [点我收藏+]

标签:end   image   utf-8   open   gpo   oat   img   es2017   ret   

首先说一下线性回归模型:它试图学得一个通过属性的线性组合来进行预测的函数,即:

h(x) = w0 + w1x1 + w2x2 + ... + wnxn

写成向量形式为:h(x) = wTx

逻辑回归是一种分类算法,本质上是线性回归,它通过引入对数几率函数将线性回归得到的连续值映射到0~1之间,

从而可以用在分类问题上

逻辑回归的预测函数为:

技术分享图片

对于任意确定的x和w,有:

技术分享图片

可以合并写成:

技术分享图片

对P(y|x,w)取极大似然函数:

技术分享图片

取对数似然函数:

(即令每个样本属于其真实类别的概率总和越大越好)

技术分享图片

上面的函数是关于w的凸函数,通过梯度上升法求对数似然函数的极大值(即最大值),

可以得到回归系数的更新方程为:

技术分享图片

 

逻辑回归算法的优缺点:

优点:实现简单,易于理解和实现,计算代价不高,速度很快,存储资源低;

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

适用数据类型:数值型和标称型

 

逻辑回归算法的python实现

参考链接:http://blog.csdn.net/moxigandashu/article/details/72779856

 1 #coding=utf-8
 2 
 3 from numpy import *
 4 
 5 # 创建测试数据
 6 def loadDataSet():
 7     dataMat = []; labelMat = []
 8     fr = open(testSet.txt)     # 测试数据的规格:100*3
 9     for line in fr.readlines():
10         lineArr = line.strip().split()     # strip():删除首尾处的空格;split():不带参数时以空格进行分割
11         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
12         labelMat.append(int(lineArr[2]))
13     return dataMat,labelMat
14 
15 def sigmoid(inX):
16     return 1.0/(1+exp(-inX))
17 
18 # 用梯度上升法求回归系数
19 def gradAscent(dataMatIn, classLabels):
20     dataMatrix = mat(dataMatIn)     #将输入数据转换为矩阵
21     labelMat = mat(classLabels).transpose()     #将分类标签的行向量转换为列向量
22     m,n = shape(dataMatrix)     # 输入数据的规格:100*3
23     alpha = 0.001       #迭代步长
24     maxCycles = 500     #迭代次数
25     weights = ones((n,1))     #权重向量的初始值设为1,列向量
26     for k in range(maxCycles):
27         h = sigmoid(dataMatrix*weights)     #计算预测函数的值
28         error = (labelMat - h)
29         weights = weights + alpha * dataMatrix.transpose()* error     #更新权重向量
30     return weights
31 
32 # 用学习到的回归系数来画出决策边界
33 def plotBestFit(weights):
34     import matplotlib.pyplot as plt
35     dataMat,labelMat=loadDataSet()
36     dataArr = array(dataMat)
37     n = shape(dataArr)[0] 
38     xcord1 = []; ycord1 = []
39     xcord2 = []; ycord2 = []
40     for i in range(n):
41         if int(labelMat[i])== 1:
42             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
43         else:
44             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
45     fig = plt.figure()
46     ax = fig.add_subplot(111)
47     ax.scatter(xcord1, ycord1, s=30, c=red, marker=s)     # marker=‘s‘:表示用小正方形画点
48     ax.scatter(xcord2, ycord2, s=30, c=green)
49     x = arange(-3.0, 3.0, 0.1)
50     y = (-weights[0,0]-weights[1,0]*x)/weights[2,0]     # 得到最后的预测函数:f(x)=w0 + w1x1 + w2x2,令f(x)=0,得到:x2=(-w0-w1x1)/w2
51     ax.plot(x, y)
52     plt.xlabel(X1); plt.ylabel(X2);
53     plt.show()
54 
55 # 测试逻辑回归算法
56 dataArr,labelMat=loadDataSet()
57 weights=gradAscent(dataArr,labelMat)
58 plotBestFit(weights)

 

 测试的分类结果:

技术分享图片

 

LR(逻辑回归)

标签:end   image   utf-8   open   gpo   oat   img   es2017   ret   

原文地址:http://www.cnblogs.com/hhh123/p/8052527.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!