Logistic回归之基于最优化方法的最佳回归系数确定

之前学习Java的时候,用过一个IDE叫做EditPlus,虽然他敲代码的高亮等体验度不及eclipse,但是打开软件特别快捷,现在也用他读python特别方便。

训练算法::使用梯度上升找到最佳参数

之前看过吴恩达的视频的同学们,听得比较多的就是梯度下降算法,但是梯度上升算法和梯度下降算法本质是是一样的,只是梯度计算的时候加减号不一样罢了。

 1 def loadDataSet():
 2     dataMat = []; labelMat = []
 3     fr = open(‘testSet.txt‘)
 4     for line in fr.readlines():
 5         lineArr = line.strip().split()
 6         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
 7         labelMat.append(int(lineArr[2]))
 8     return dataMat,labelMat
 9
10 def sigmoid(inX):
11     return 1.0/(1+exp(-inX))
12
13 def gradAscent(dataMatIn, classLabels):
14     dataMatrix = mat(dataMatIn)             #convert to NumPy matrix
15     labelMat = mat(classLabels).transpose() #convert to NumPy matrix
16     m,n = shape(dataMatrix)
17     alpha = 0.001
18     maxCycles = 500
19     weights = ones((n,1))
20     for k in range(maxCycles):              #heavy on matrix operations
21         h = sigmoid(dataMatrix*weights)     #matrix mult
22         error = (labelMat - h)              #vector subtraction
23         weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
24     return weights

第一个函数打开testSet。txt并逐行读取,每行前两个值分别是x1和x2,第三个值是对应的类别标签。为了方便计算,该函数还将x0的值设为1.0

第二个函数是sigmoid函数,x为0时,函数值为0.5,x增大时,函数值将不断增大逼近1。

第三个函数有两个参数,第一个是2维数组,每列代表不同的特征,每行代表每个训练样本。我们采用100个样本的简单数据集它包含两个特征x1,x2,再加上第0维特征x0,所以dataMatln里面存放的是100*3的矩阵。

分析数据:画出决策边界

 1 def plotBestFit(weights):
 2     import matplotlib.pyplot as plt
 3     dataMat,labelMat=loadDataSet()
 4     dataArr = array(dataMat)
 5     n = shape(dataArr)[0]
 6     xcord1 = []; ycord1 = []
 7     xcord2 = []; ycord2 = []
 8     for i in range(n):
 9         if int(labelMat[i])== 1:
10             xcord1.append(dataArr[i,1]); ycord1.append(dataArr[i,2])
11         else:
12             xcord2.append(dataArr[i,1]); ycord2.append(dataArr[i,2])
13     fig = plt.figure()
14     ax = fig.add_subplot(111)
15     ax.scatter(xcord1, ycord1, s=30, c=‘red‘, marker=‘s‘)
16     ax.scatter(xcord2, ycord2, s=30, c=‘green‘)
17     x = arange(-3.0, 3.0, 0.1)
18     y = (-weights[0]-weights[1]*x)/weights[2]
19     ax.plot(x, y)
20     plt.xlabel(‘X1‘); plt.ylabel(‘X2‘);
21     plt.show()
>>> from numpy import *
>>> reload(logRegres)
<module ‘logRegres‘ from ‘D:\Python27\logRegres.pyc‘>
>>> weights=logRegres.gradAscent(dataArr,labelMat)
>>> logRegres.plotBestFit(weights.getA())

训练算法:随机梯度上升

梯度上升算法在每次更新回归系数时都需要遍历整个数据集。改进的方法是一次仅使用一个样本点来更新回归系数,该方法称为随机梯度上升算法。由于可以在样本到来时对分类器进行增量式更新,因而随机梯度上升算法是一个在线学习算法。与在线学习相对应,一次处理所有数据被称作是批处理。

1 def stocGradAscent0(dataMatrix, classLabels):
2     m,n = shape(dataMatrix)
3     alpha = 0.01
4     weights = ones(n)   #initialize to all ones
5     for i in range(m):
6         h = sigmoid(sum(dataMatrix[i]*weights))
7         error = classLabels[i] - h
8         weights = weights + alpha * error * dataMatrix[i]
9     return weights
>>> from numpy import *
>>> reload(logRegres)
<module ‘logRegres‘ from ‘D:\Python27\logRegres.pyc‘>
>>> dataArr,labelMat=logRegres.loadDataSet()
>>> weights=logRegres.stocGradAscent0(array(dataArr),labelMat)
>>> logRegres.plotBestFit(weights)

改进的随机梯度上升算法

 1 def stocGradAscent1(dataMatrix, classLabels, numIter=150):
 2     m,n = shape(dataMatrix)
 3     weights = ones(n)   #initialize to all ones
 4     for j in range(numIter):
 5         dataIndex = range(m)
 6         for i in range(m):
 7             alpha = 4/(1.0+j+i)+0.0001    #apha decreases with iteration, does not
 8             randIndex = int(random.uniform(0,len(dataIndex)))#go to 0 because of the constant
 9             h = sigmoid(sum(dataMatrix[randIndex]*weights))
10             error = classLabels[randIndex] - h
11             weights = weights + alpha * error * dataMatrix[randIndex]
12             del(dataIndex[randIndex])
13     return weights

增加了亮出代码来进行改进。一方面,alpha在每次迭代的时候都会调整,虽然alpha会随着迭代次数不断减小,但永远不会减小到0,因为存在一个常数项。

另一方面,通过随机选取样本来更新回归系数。

>>> dataArr,labelMat=logRegres.loadDataSet()
>>> weights=logRegres.stocGradAscent1(array(dataArr),labelMat)
>>> logRegres.plotBestFit(weights)

从疝气病症预测病马的死亡率

 1 def classifyVector(inX, weights):
 2     prob = sigmoid(sum(inX*weights))
 3     if prob > 0.5: return 1.0
 4     else: return 0.0
 5
 6 def colicTest():
 7     frTrain = open(‘horseColicTraining.txt‘); frTest = open(‘horseColicTest.txt‘)
 8     trainingSet = []; trainingLabels = []
 9     for line in frTrain.readlines():
10         currLine = line.strip().split(‘\t‘)
11         lineArr =[]
12         for i in range(21):
13             lineArr.append(float(currLine[i]))
14         trainingSet.append(lineArr)
15         trainingLabels.append(float(currLine[21]))
16     trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000)
17     errorCount = 0; numTestVec = 0.0
18     for line in frTest.readlines():
19         numTestVec += 1.0
20         currLine = line.strip().split(‘\t‘)
21         lineArr =[]
22         for i in range(21):
23             lineArr.append(float(currLine[i]))
24         if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):
25             errorCount += 1
26     errorRate = (float(errorCount)/numTestVec)
27     print "the error rate of this test is: %f" % errorRate
28     return errorRate
29
30 def multiTest():
31     numTests = 10; errorSum=0.0
32     for k in range(numTests):
33         errorSum += colicTest()
34     print "after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))

第一个函数,如果sigmoid值大于0.5函数返回1,否则返回0.

第二个函数,用于打开测试集和训练集,并对数据进行格式化处理的函数。

第三个函数,调用第二个函数10次并求结果的平均值。

.-‘ _..`.                  /  .‘_.‘.‘                 | .‘ (.)`.                 ;‘   ,_   `. .--.__________.‘    ;  `.;-‘|  ./               /|  |               / `..‘`-._  _____, ..‘     / | |     | |\ \    / /| |     | | \ \   / / | |     | |  \ \  /_/  |_|     |_|   \_\ |__\  |__\    |__\  |__\

时间: 2024-10-16 04:31:52

Logistic回归之基于最优化方法的最佳回归系数确定的相关文章

【机器学习算法实现】logistic回归__基于Python和Numpy函数库

[机器学习算法实现]系列文章将记录个人阅读机器学习论文.书籍过程中所碰到的算法,每篇文章描述一个具体的算法.算法的编程实现.算法的具体应用实例.争取每个算法都用多种语言编程实现.所有代码共享至github:https://github.com/wepe/MachineLearning-Demo     欢迎交流指正! (2)logistic回归__基于Python和Numpy函数库 1.算法简介 本文的重点放在算法的工程实现上,关于算法的原理不具体展开,logistic回归算法很简单,可以看看A

机器学习实战读书笔记(五)Logistic回归

Logistic回归的一般过程 1.收集数据:采用任意方法收集 2.准备数据:由于需要进行距离计算,因此要求数据类型为数值型.另外,结构化数据格式则最佳 3.分析数据:采用任意方法对数据进行分析 4.训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数 5.测试算法:一旦训练步骤完成,分类将会很快. 6.使用算法:首 先,我们需要输入一些数据,并将其转换成对应的结构化数值:接着,基于训练好的回归系数就可以对这些数值进行简单回归计算,判定它们属于哪个类别:在这之后,我们就可以在输

5 Logistic回归(一)

首次接触最优化算法.介绍几个最优化算法,并利用它们训练出一个非线性函数用于分类. 假设现在有一些数据点,我们利用一条直线对这些点进行拟合(该直线为最佳拟合直线),这个拟合过程称作回归. 利用Logistic回归进行分类思想:根据现有数据对分类边界线建立回归公式,以此进行分类. 这里的“回归”一词源于最佳拟合,表示找到最佳拟合参数.训练分类器的做法:寻找最佳拟合参数,使用的是最优化算法(梯度上升法.改进的随机梯度上升法). 5.1 基于Logistic回归和Sigmoid函数的分类 Logisti

《机器学习实战》学习笔记:Logistic回归&amp;预测疝气病证的死亡率

前言: 生活中,人们经常会遇到各种最优化问题,比如如何在最短时间从一个地点到另外一个地点?如何在投入最少的资金而却能得到最高的受益?如何设计一款芯片使其功耗最低而性能最好?这一节就要学习一种最优化算法--Logistic回归,设计最优化算法的目的依然是用于分类.在这里,Logistic回归的主要思想是根据现有的数据对分类边界线建立回归公式,达到分类的目的.假设我们有一堆数据,需要划一条线(最佳直线)对其分类,这就是Logistic回归的目的. 而"Logistic回归"中的"

第五章:Logistic回归

本章内容 □sigmod函数和logistic回归分类器 □最优化理论初步□梯度下降最优化算法□数据中的缺失项处理 这会是激动人心的一章,因为我们将首次接触到最优化算法.仔细想想就会发现,其实我们日常生活中遇到过很多最优化问题,比如如何在最短时间内从入点到达氏点?如何投人最少工作量却获得最大的效益?如何设计发动机使得油耗最少而功率最大?可风,最优化的作用十分强大.接下来,我们介绍几个最优化算法,并利用它们训练出一个非线性函数用于分类.读者不熟悉回归也没关系,第8章起会深入介绍这一主题.假设现在有

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

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

Logistic回归随笔

假设现在有一些数据点,我们用一条直线对这些点进行拟合,这个拟合过程称作回归.利用logistic回归进行分类的主要思想是:根据现有数据对分类边界线建立回归公式,以此进行分类. 基于Logistic回归和Sigmoid函数的分类 我们想要的函数应该是,能接受所有的输入然后预测出类别.在两个分类的情况下,上述函数输出0或者1.我们可以选择sigmoid函数,计算公式如下: y=1/(1+e-x). 为了实现Logistic回归分类器,我们可以在每个特征上都乘以一个回归 系数,然后把所有的结果值相加,

机器学习实践之Logistic回归

    关于本文说明,本人原博客地址位于http://blog.csdn.net/qq_37608890,本文来自笔者于2017年12月17日 19:18:31所撰写内容(http://blog.csdn.net/qq_37608890/article/details/78827013). 本文根据最近学习机器学习书籍 网络文章的情况,特将一些学习思路做了归纳整理,详情如下.如有不当之处,请各位大拿多多指点,在此谢过. (今天发现第二部分 第4点中,部分代码不整齐,重新梳理了.2017.12.2

Logistic回归

Logistic回归 主要思想: 根据训练集找到一个适合的预测函数(线性函数),一般用h表示,该函数就是我们需要找的分类函数,用它来预测输入数据的分类. 构造一个Cost(损失函数),该函数为每个输入数据的预测类别(h)与真实数据的类别(y)之间的偏差,可以以二者间的差值,即(h-y)或其他形式来计算偏差.由于需要综合考虑所有训练数据的损失,需要将数据的损失求和或求平均,表示所有训练数据预测出的类别与实际类别的偏差,将Cost求和或者求平均,记为J(θ),表示所有训练数据预测值与实际值得偏差.