机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

摘要:
Logisticregression可以用来回归,也可以用来分类,主要是二分类。实际上,SVM的类概率就是样本到边界的距离,这个活实际上就让logisticregression给干了。所以说,LogisticRegression就是一个被logistic方程归一化后的线性回归,仅此而已。

http://blog.csdn.net/zouxy09/article/details/20319673

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

zouxy09@qq.com

http://blog.csdn.net/zouxy09

机器学习算法与Python实践这个系列主要是参考《机器学习实战》这本书。因为自己想学习Python,然后也想对一些机器学习算法加深下了解,所以就想通过Python来实现几个比较常用的机器学习算法。恰好遇见这本同样定位的书籍,所以就参考这本书的过程来学习了。

这节学习的是逻辑回归(Logistic Regression),也算进入了比较正统的机器学习算法。啥叫正统呢?我概念里面机器学习算法一般是这样一个步骤:

1)对于一个问题,我们用数学语言来描述它,然后建立一个模型,例如回归模型或者分类模型等来描述这个问题;

2)通过最大似然、最大后验概率或者最小化分类误差等等建立模型的代价函数,也就是一个最优化问题。找到最优化问题的解,也就是能拟合我们的数据的最好的模型参数;

3)然后我们需要求解这个代价函数,找到最优解。这求解也就分很多种情况了:

a)如果这个优化函数存在解析解。例如我们求最值一般是对代价函数求导,找到导数为0的点,也就是最大值或者最小值的地方了。如果代价函数能简单求导,并且求导后为0的式子存在解析解,那么我们就可以直接得到最优的参数了。

b)如果式子很难求导,例如函数里面存在隐含的变量或者变量相互间存在耦合,也就互相依赖的情况。或者求导后式子得不到解释解,例如未知参数的个数大于已知方程组的个数等。这时候我们就需要借助迭代算法来一步一步找到最有解了。迭代是个很神奇的东西,它将远大的目标(也就是找到最优的解,例如爬上山顶)记在心上,然后给自己定个短期目标(也就是每走一步,就离远大的目标更近一点),脚踏实地,心无旁贷,像个蜗牛一样,一步一步往上爬,支撑它的唯一信念是:只要我每一步都爬高一点,那么积跬步,肯定能达到自己人生的巅峰,尽享山登绝顶我为峰的豪迈与忘我。

另外需要考虑的情况是,如果代价函数是凸函数,那么就存在全局最优解,方圆五百里就只有一个山峰,那命中注定了,它就是你要找的唯一了。但如果是非凸的,那么就会有很多局部最优的解,有一望无际的山峰,人的视野是伟大的也是渺小的,你不知道哪个山峰才是最高的,可能你会被命运作弄,很无辜的陷入一个局部最优里面,坐井观天,以为自己找到的就是最好的。没想到山外有山,人外有人,光芒总在未知的远处默默绽放。但也许命运眷恋善良的你,带给你的总是最好的归宿。也有很多不信命的人,觉得人定胜天的人,誓要找到最好的,否则不会罢休,永不向命运妥协,除非自己有一天累了,倒下了,也要靠剩下的一口气,迈出一口气能支撑的路程。好悲凉啊……哈哈。

呃,不知道扯那去了,也不知道自己说的有没有错,有错的话请大家不吝指正。那下面就进入正题吧。正如上面所述,逻辑回归就是这样的一个过程:面对一个回归或者分类问题,建立代价函数,然后通过优化方法迭代求解出最优的模型参数,然后测试验证我们这个求解的模型的好坏,冥冥人海,滚滚红尘,我们是否找到了最适合的那个她。

一、逻辑回归(LogisticRegression)

Logistic regression (逻辑回归)是当前业界比较常用的机器学习方法,用于估计某种事物的可能性。之前在经典之作《数学之美》中也看到了它用于广告预测,也就是根据某广告被用户点击的可能性,把最可能被用户点击的广告摆在用户能看到的地方,然后叫他“你点我啊!”用户点了,你就有钱收了。这就是为什么我们的电脑现在广告泛滥的原因了。

还有类似的某用户购买某商品的可能性,某病人患有某种疾病的可能性啊等等。这个世界是随机的(当然了,人为的确定性系统除外,但也有可能有噪声或产生错误的结果,只是这个错误发生的可能性太小了,小到千万年不遇,小到忽略不计而已),所以万物的发生都可以用可能性或者几率(Odds)来表达。“几率”指的是某事物发生的可能性与不发生的可能性的比值。

Logistic regression可以用来回归,也可以用来分类,主要是二分类。还记得上几节讲的支持向量机SVM吗?它就是个二分类的例如,它可以将两个不同类别的样本给分开,思想是找到最能区分它们的那个分类超平面。但当你给一个新的样本给它,它能够给你的只有一个答案,你这个样本是正类还是负类。例如你问SVM,某个女生是否喜欢你,它只会回答你喜欢或者不喜欢。这对我们来说,显得太粗鲁了,要不希望,要不绝望,这都不利于身心健康。那如果它可以告诉我,她很喜欢、有一点喜欢、不怎么喜欢或者一点都不喜欢,你想都不用想了等等,告诉你她有49%的几率喜欢你,总比直接说她不喜欢你,来得温柔。而且还提供了额外的信息,她来到你的身边你有多少希望,你得再努力多少倍,知己知彼百战百胜,哈哈。Logistic regression就是这么温柔的,它给我们提供的就是你的这个样本属于正类的可能性是多少。

还得来点数学。(更多的理解,请参阅参考文献)假设我们的样本是{x, y},y是0或者1,表示正类或者负类,x是我们的m维的样本特征向量。那么这个样本x属于正类,也就是y=1的“概率”可以通过下面的逻辑函数来表示:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第1张

这里θ是模型参数,也就是回归系数,σ是sigmoid函数。实际上这个函数是由下面的对数几率(也就是x属于正类的可能性和负类的可能性的比值的对数)变换得到的:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第2张

换句话说,y也就是我们关系的变量,例如她喜不喜欢你,与多个自变量(因素)有关,例如你人品怎样、车子是两个轮的还是四个轮的、长得胜过潘安还是和犀利哥有得一拼、有千尺豪宅还是三寸茅庐等等,我们把这些因素表示为x1, x2,…, xm。那这个女的怎样考量这些因素呢?最快的方式就是把这些因素的得分都加起来,最后得到的和越大,就表示越喜欢。但每个人心里其实都有一杆称,每个人考虑的因素不同,萝卜青菜,各有所爱嘛。例如这个女生更看中你的人品,人品的权值是0.6,不看重你有没有钱,没钱了一起努力奋斗,那么有没有钱的权值是0.001等等。我们将这些对应x1, x2,…, xm的权值叫做回归系数,表达为θ1, θ2,…, θm。他们的加权和就是你的总得分了。请选择你的心仪男生,非诚勿扰!哈哈。

所以说上面的logistic回归就是一个线性分类模型,它与线性回归的不同点在于:为了将线性回归输出的很大范围的数,例如从负无穷到正无穷,压缩到0和1之间,这样的输出值表达为“可能性”才能说服广大民众。当然了,把大值压缩到这个范围还有个很好的好处,就是可以消除特别冒尖的变量的影响(不知道理解的是否正确)。而实现这个伟大的功能其实就只需要平凡一举,也就是在输出加一个logistic函数。另外,对于二分类来说,可以简单的认为:如果样本x属于正类的概率大于0.5,那么就判定它是正类,否则就是负类。实际上,SVM的类概率就是样本到边界的距离,这个活实际上就让logistic regression给干了。

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第3张

所以说,LogisticRegression 就是一个被logistic方程归一化后的线性回归,仅此而已。

好了,关于LR的八卦就聊到这。归入到正统的机器学习框架下,模型选好了,只是模型的参数θ还是未知的,我们需要用我们收集到的数据来训练求解得到它。那我们下一步要做的事情就是建立代价函数了。

LogisticRegression最基本的学习算法是最大似然。啥叫最大似然,可以看看我的另一篇博文“从最大似然到EM算法浅解”。

假设我们有n个独立的训练样本{(x1, y1) ,(x2, y2),…, (xn, yn)},y={0, 1}。那每一个观察到的样本(xi, yi)出现的概率是:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第4张

上面为什么是这样呢?当y=1的时候,后面那一项是不是没有了,那就只剩下x属于1类的概率,当y=0的时候,第一项是不是没有了,那就只剩下后面那个x属于0的概率(1减去x属于1的概率)。所以不管y是0还是1,上面得到的数,都是(x, y)出现的概率。那我们的整个样本集,也就是n个独立的样本出现的似然函数为(因为每个样本都是独立的,所以n个样本出现的概率就是他们各自出现的概率相乘):

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第5张

那最大似然法就是求模型中使得似然函数最大的系数取值θ*。这个最大似然就是我们的代价函数(cost function)了。

OK,那代价函数有了,我们下一步要做的就是优化求解了。我们先尝试对上面的代价函数求导,看导数为0的时候可不可以解出来,也就是有没有解析解,有这个解的时候,就皆大欢喜了,一步到位。如果没有就需要通过迭代了,耗时耗力。

我们先变换下L(θ):取自然对数,然后化简(不要看到一堆公式就害怕哦,很简单的哦,只需要耐心一点点,自己动手推推就知道了。注:有xi的时候,表示它是第i个样本,下面没有做区分了,相信你的眼睛是雪亮的),得到:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第6张

这时候,用L(θ)对θ求导,得到:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第7张

然后我们令该导数为0,你会很失望的发现,它无法解析求解。不信你就去尝试一下。所以没办法了,只能借助高大上的迭代来搞定了。这里选用了经典的梯度下降算法。

二、优化求解

2.1、梯度下降(gradient descent)

Gradient descent 又叫 steepest descent,是利用一阶的梯度信息找到函数局部最优解的一种方法,也是机器学习里面最简单最常用的一种优化方法。它的思想很简单,和我开篇说的那样,要找最小值,我只需要每一步都往下走(也就是每一步都可以让代价函数小一点),然后不断的走,那肯定能走到最小值的地方,例如下图所示:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第8张

但,我同时也需要更快的到达最小值啊,怎么办呢?我们需要每一步都找下坡最快的地方,也就是每一步我走某个方向,都比走其他方法,要离最小值更近。而这个下坡最快的方向,就是梯度的负方向了。

对logistic Regression来说,梯度下降算法新鲜出炉,如下:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第9张

其中,参数α叫学习率,就是每一步走多远,这个参数蛮关键的。如果设置的太多,那么很容易就在最优值附加徘徊,因为你步伐太大了。例如要从广州到上海,但是你的一步的距离就是广州到北京那么远,没有半步的说法,自己能迈那么大步,是幸运呢?还是不幸呢?事物总有两面性嘛,它带来的好处是能很快的从远离最优值的地方回到最优值附近,只是在最优值附近的时候,它有心无力了。但如果设置的太小,那收敛速度就太慢了,向蜗牛一样,虽然会落在最优的点,但是这速度如果是猴年马月,我们也没这耐心啊。所以有的改进就是在这个学习率这个地方下刀子的。我开始迭代是,学习率大,慢慢的接近最优值的时候,我的学习率变小就可以了。所谓采两者之精华啊!这个优化具体见2.3 。

梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

计算整个数据集的梯度

使用alpha x gradient来更新回归系数

}

返回回归系数值

################################################

2.2、随机梯度下降SGD (stochastic gradient descent)

梯度下降算法在每次更新回归系数的时候都需要遍历整个数据集(计算整个数据集的回归误差),该方法对小数据集尚可。但当遇到有数十亿样本和成千上万的特征时,就有点力不从心了,它的计算复杂度太高。改进的方法是一次仅用一个样本点(的回归误差)来更新回归系数。这个方法叫随机梯度下降算法。由于可以在新的样本到来的时候对分类器进行增量的更新(假设我们已经在数据库A上训练好一个分类器h了,那新来一个样本x。对非增量学习算法来说,我们需要把x和数据库A混在一起,组成新的数据库B,再重新训练新的分类器。但对增量学习算法,我们只需要用新样本x来更新已有分类器h的参数即可),所以它属于在线学习算法。与在线学习相对应,一次处理整个数据集的叫“批处理”。

随机梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

对数据集中每个样本

计算该样本的梯度

使用alpha xgradient来更新回归系数

}

返回回归系数值

################################################

2.3、改进的随机梯度下降

评价一个优化算法的优劣主要是看它是否收敛,也就是说参数是否达到稳定值,是否还会不断的变化?收敛速度是否快?

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第10张

上图展示了随机梯度下降算法在200次迭代中(请先看第三和第四节再回来看这里。我们的数据库有100个二维样本,每个样本都对系数调整一次,所以共有200*100=20000次调整)三个回归系数的变化过程。其中系数X2经过50次迭代就达到了稳定值。但系数X1和X0到100次迭代后稳定。而且可恨的是系数X1和X2还在很调皮的周期波动,迭代次数很大了,心还停不下来。产生这个现象的原因是存在一些无法正确分类的样本点,也就是我们的数据集并非线性可分,但我们的logistic regression是线性分类模型,对非线性可分情况无能为力。然而我们的优化程序并没能意识到这些不正常的样本点,还一视同仁的对待,调整系数去减少对这些样本的分类误差,从而导致了在每次迭代时引发系数的剧烈改变。对我们来说,我们期待算法能避免来回波动,从而快速稳定和收敛到某个值。

对随机梯度下降算法,我们做两处改进来避免上述的波动问题:

1)在每次迭代时,调整更新步长alpha的值。随着迭代的进行,alpha越来越小,这会缓解系数的高频波动(也就是每次迭代系数改变得太大,跳的跨度太大)。当然了,为了避免alpha随着迭代不断减小到接近于0(这时候,系数几乎没有调整,那么迭代也没有意义了),我们约束alpha一定大于一个稍微大点的常数项,具体见代码。

2)每次迭代,改变样本的优化顺序。也就是随机选择样本来更新回归系数。这样做可以减少周期性的波动,因为样本顺序的改变,使得每次迭代不再形成周期性。

改进的随机梯度下降算法的伪代码如下:

################################################

初始化回归系数为1

重复下面步骤直到收敛{

对随机遍历的数据集中的每个样本

随着迭代的逐渐进行,减小alpha的值

计算该样本的梯度

使用alpha x gradient来更新回归系数

}

返回回归系数值

################################################

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第11张

比较原始的随机梯度下降和改进后的梯度下降,可以看到两点不同:

1)系数不再出现周期性波动。2)系数可以很快的稳定下来,也就是快速收敛。这里只迭代了20次就收敛了。而上面的随机梯度下降需要迭代200次才能稳定。

三、Python实现

我使用的Python是2.7.5版本的。附加的库有Numpy和Matplotlib。具体的安装和配置见前面的博文。在代码中已经有了比较详细的注释了。不知道有没有错误的地方,如果有,还望大家指正(每次的运行结果都有可能不同)。里面我写了个可视化结果的函数,但只能在二维的数据上面使用。直接贴代码:

logRegression.py

  1. #################################################
  2. #logRegression:LogisticRegression
  3. #Author:zouxy
  4. #Date:2014-03-02
  5. #HomePage:http://blog.csdn.net/zouxy09
  6. #Email:zouxy09@qq.com
  7. #################################################
  8. fromnumpyimport*
  9. importmatplotlib.pyplotasplt
  10. importtime
  11. #calculatethesigmoidfunction
  12. defsigmoid(inX):
  13. return1.0/(1+exp(-inX))
  14. #trainalogisticregressionmodelusingsomeoptionaloptimizealgorithm
  15. #input:train_xisamatdatatype,eachrowstandsforonesample
  16. #train_yismatdatatypetoo,eachrowisthecorrespondinglabel
  17. #optsisoptimizeoptionincludestepandmaximumnumberofiterations
  18. deftrainLogRegres(train_x,train_y,opts):
  19. #calculatetrainingtime
  20. startTime=time.time()
  21. numSamples,numFeatures=shape(train_x)
  22. alpha=opts['alpha'];maxIter=opts['maxIter']
  23. weights=ones((numFeatures,1))
  24. #optimizethroughgradientdescentalgorilthm
  25. forkinrange(maxIter):
  26. ifopts['optimizeType']=='gradDescent':#gradientdescentalgorilthm
  27. output=sigmoid(train_x*weights)
  28. error=train_y-output
  29. weights=weights+alpha*train_x.transpose()*error
  30. elifopts['optimizeType']=='stocGradDescent':#stochasticgradientdescent
  31. foriinrange(numSamples):
  32. output=sigmoid(train_x[i,:]*weights)
  33. error=train_y[i,0]-output
  34. weights=weights+alpha*train_x[i,:].transpose()*error
  35. elifopts['optimizeType']=='smoothStocGradDescent':#smoothstochasticgradientdescent
  36. #randomlyselectsamplestooptimizeforreducingcyclefluctuations
  37. dataIndex=range(numSamples)
  38. foriinrange(numSamples):
  39. alpha=4.0/(1.0+k+i)+0.01
  40. randIndex=int(random.uniform(0,len(dataIndex)))
  41. output=sigmoid(train_x[randIndex,:]*weights)
  42. error=train_y[randIndex,0]-output
  43. weights=weights+alpha*train_x[randIndex,:].transpose()*error
  44. del(dataIndex[randIndex])#duringoneinteration,deletetheoptimizedsample
  45. else:
  46. raiseNameError('Notsupportoptimizemethodtype!')
  47. print'Congratulations,trainingcomplete!Took%fs!'%(time.time()-startTime)
  48. returnweights
  49. #testyourtrainedLogisticRegressionmodelgiventestset
  50. deftestLogRegres(weights,test_x,test_y):
  51. numSamples,numFeatures=shape(test_x)
  52. matchCount=0
  53. foriinxrange(numSamples):
  54. predict=sigmoid(test_x[i,:]*weights)[0,0]>0.5
  55. ifpredict==bool(test_y[i,0]):
  56. matchCount+=1
  57. accuracy=float(matchCount)/numSamples
  58. returnaccuracy
  59. #showyourtrainedlogisticregressionmodelonlyavailablewith2-Ddata
  60. defshowLogRegres(weights,train_x,train_y):
  61. #notice:train_xandtrain_yismatdatatype
  62. numSamples,numFeatures=shape(train_x)
  63. ifnumFeatures!=3:
  64. print"Sorry!Icannotdrawbecausethedimensionofyourdataisnot2!"
  65. return1
  66. #drawallsamples
  67. foriinxrange(numSamples):
  68. ifint(train_y[i,0])==0:
  69. plt.plot(train_x[i,1],train_x[i,2],'or')
  70. elifint(train_y[i,0])==1:
  71. plt.plot(train_x[i,1],train_x[i,2],'ob')
  72. #drawtheclassifyline
  73. min_x=min(train_x[:,1])[0,0]
  74. max_x=max(train_x[:,1])[0,0]
  75. weights=weights.getA()#convertmattoarray
  76. y_min_x=float(-weights[0]-weights[1]*min_x)/weights[2]
  77. y_max_x=float(-weights[0]-weights[1]*max_x)/weights[2]
  78. plt.plot([min_x,max_x],[y_min_x,y_max_x],'-g')
  79. plt.xlabel('X1');plt.ylabel('X2')
  80. plt.show()

四、测试结果

测试代码:

test_logRegression.py

  1. #################################################
  2. #logRegression:LogisticRegression
  3. #Author:zouxy
  4. #Date:2014-03-02
  5. #HomePage:http://blog.csdn.net/zouxy09
  6. #Email:zouxy09@qq.com
  7. #################################################
  8. fromnumpyimport*
  9. importmatplotlib.pyplotasplt
  10. importtime
  11. defloadData():
  12. train_x=[]
  13. train_y=[]
  14. fileIn=open('E:/Python/MachineLearninginAction/testSet.txt')
  15. forlineinfileIn.readlines():
  16. lineArr=line.strip().split()
  17. train_x.append([1.0,float(lineArr[0]),float(lineArr[1])])
  18. train_y.append(float(lineArr[2]))
  19. returnmat(train_x),mat(train_y).transpose()
  20. ##step1:loaddata
  21. print"step1:loaddata..."
  22. train_x,train_y=loadData()
  23. test_x=train_x;test_y=train_y
  24. ##step2:training...
  25. print"step2:training..."
  26. opts={'alpha':0.01,'maxIter':20,'optimizeType':'smoothStocGradDescent'}
  27. optimalWeights=trainLogRegres(train_x,train_y,opts)
  28. ##step3:testing
  29. print"step3:testing..."
  30. accuracy=testLogRegres(optimalWeights,test_x,test_y)
  31. ##step4:showtheresult
  32. print"step4:showtheresult..."
  33. print'Theclassifyaccuracyis:%.3f%%'%(accuracy*100)
  34. showLogRegres(optimalWeights,train_x,train_y)

测试数据是二维的,共100个样本。有2个类。如下:

testSet.txt

  1. -0.01761214.0530640
  2. -1.3956344.6625411
  3. -0.7521576.5386200
  4. -1.3223717.1528530
  5. 0.42336311.0546770
  6. 0.4067047.0673351
  7. 0.66739412.7414520
  8. -2.4601506.8668051
  9. 0.5694119.5487550
  10. -0.02663210.4277430
  11. 0.8504336.9203341
  12. 1.34718313.1755000
  13. 1.1768133.1670201
  14. -1.7818719.0979530
  15. -0.5666065.7490031
  16. 0.9316351.5895051
  17. -0.0242056.1518231
  18. -0.0364532.6909881
  19. -0.1969490.4441651
  20. 1.0144595.7543991
  21. 1.9852983.2306191
  22. -1.693453-0.5575401
  23. -0.57652511.7789220
  24. -0.346811-1.6787301
  25. -2.1244842.6724711
  26. 1.2179169.5970150
  27. -0.7339289.0986870
  28. -3.642001-1.6180871
  29. 0.3159853.5239531
  30. 1.4166149.6192320
  31. -0.3863233.9892861
  32. 0.5569218.2949841
  33. 1.22486311.5873600
  34. -1.347803-2.4060511
  35. 1.1966044.9518511
  36. 0.2752219.5436470
  37. 0.4705759.3324880
  38. -1.8895679.5426620
  39. -1.52789312.1505790
  40. -1.18524711.3093180
  41. -0.4456783.2973031
  42. 1.0422226.1051551
  43. -0.61878710.3209860
  44. 1.1520830.5484671
  45. 0.8285342.6760451
  46. -1.23772810.5490330
  47. -0.683565-2.1661251
  48. 0.2294565.9219381
  49. -0.95988511.5553360
  50. 0.49291110.9933240
  51. 0.1849928.7214880
  52. -0.35571510.3259760
  53. -0.3978228.0583970
  54. 0.82483913.7303430
  55. 1.5072785.0278661
  56. 0.0996716.8358391
  57. -0.34400810.7174850
  58. 1.7859287.7186451
  59. -0.91880111.5602170
  60. -0.3640094.7473001
  61. -0.8417224.1190831
  62. 0.4904261.9605391
  63. -0.0071949.0757920
  64. 0.35610712.4478630
  65. 0.34257812.2811620
  66. -0.810823-1.4660181
  67. 2.5307776.4768011
  68. 1.29668311.6075590
  69. 0.47548712.0400350
  70. -0.78327711.0097250
  71. 0.07479811.0236500
  72. -1.3374720.4683391
  73. -0.10278113.7636510
  74. -0.1473242.8748461
  75. 0.5183899.8870350
  76. 1.0153997.5718820
  77. -1.658086-0.0272551
  78. 1.3199442.1712281
  79. 2.0562165.0199811
  80. -0.8516334.3756911
  81. -1.5100476.0619920
  82. -1.076637-3.1818881
  83. 1.82109610.2839900
  84. 3.0101508.4017661
  85. -1.0994581.6882741
  86. -0.834872-1.7338691
  87. -0.8466373.8490751
  88. 1.40010212.6287810
  89. 1.7528425.4681661
  90. 0.0785570.0597361
  91. 0.089392-0.7153001
  92. 1.82566212.6938080
  93. 0.1974459.7446380
  94. 0.1261170.9223111
  95. -0.6797971.2205301
  96. 0.6779832.5566661
  97. 0.76134910.6938620
  98. -2.1687910.1436321
  99. 1.3886109.3419970
  100. 0.31702914.7390250

训练结果:

机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)第18张

(a)梯度下降算法迭代500次。(b)随机梯度下降算法迭代200次。(c)改进的随机梯度下降算法迭代20次。(d)改进的随机梯度下降算法迭代200次。

五、参考文献

[1]Logisticregression (逻辑回归) 概述

[2]LogisticRegression 之基础知识准备

[3]LogisticRegression

免责声明:文章转载自《机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇【大数据】Hadoop单机安装配置一套完整自定义工作流的实现下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

最全C++11/14/17/20/23 的新特性代码案例

最全C++11/14/17/20/23 的新特性代码案例 来源https://zhuanlan.zhihu.com/p/389895793 C++11新特性 关键字 新增关键字 thread_local static_assert nullptr noexcept decltype constexpr char16_t char32_t alignof...

PythonWeb 服务部署文档及迁移到Linux相关

pythonWeb的部署(Django+Uwsgi): 1、 部署服务器上需要的Python3.6环境: 安装集成了python3.6 和pip ,virtualenv虚拟环境 的Anaconda(Anaconda3-5.0.1-Lin-x86_64.sh) 下载地址 :https://mirrors.tuna.tsinghua.edu.cn/anacon...

oracle之二物化视图

物化视图 18.1、物化视图作用 1) 物化视图起源于数据仓库,早期的考虑是用于预先计算并保存表连接或聚集等耗时较多的操作的结果,这样,在执行查询时,就可以避免在基表上进行这些耗时的操作,从而快速的得到结果。 2) 物化视图和表一样可以直接进行查询。物化视图还用于复制、移动计算等方面。 alter table t add primary key (empn...

7 天玩转 ASP.NET MVC — 第 1 天

0. 前言正如标题「7 天玩儿转 ASP.NET MVC」所言,这是个系列文章,所以将会向大家陆续推出 7 篇。设想一下,一天一篇,你将从一个愉快的周一开始阅读,然后在周末成为一个 ASP.NET MVC 开发者,这很酷吧! 7 天玩儿 转 ASP.NET MVC — 第 1 天 第一天是热身运动,这篇我们将围绕 Controller 和 Views 实践...

《中小学生Python编程入门指南》前言

只是在一次偶然的接触中了解到,其实有很多家长想让小孩学习编程,觉得是未来的一个方向。我不懂未来的方向是怎么分析出来的,但的确身边有很多的朋友都有让自己的小孩学习编程的想法。虽然自己才疏学浅,正好也是万千程序猿中的一个,趁着NCP疫情,在家没事做,就萌生了写本编程指南的想法,可以供大家参考,用作python语言的学习也好。也是我自己对python语言的再学习...

python字符串与字节序列

python字符串与字节 python3中字节与字符串 python3中只有一种数据类型可以保存文本信息,就是str(字符串),是不可变序列,保存的是unicode码位。在python3中,用bytes对象来处理字节字符串。 bytes和可变的bytearray与str不同,只能用字节作为序列值,即0~256之间的整数表示。 print(bytes([...