当前位置:   article > 正文

Logistic Regression(基本原理分析+python代码实现)_python logisticregression() 源码详解

python logisticregression() 源码详解

Logistic Regression(基本原理分析+python代码实现)



一、基本理论分析

我们假定我们预测的值为h(hypotheses),真实值为y。
1.1
theta是参数也叫作权重。从公式(1.1)中可以看到求解h的重点是求解出theta,因为x是给定的已知量。而单个theta的更新公式为:
(1.2)
其中,j表示第j个theta,i表示向量第i个。
这个更新规则叫作LMS(least mean squares)。就是大家熟悉的Widrow-Hoff学习规则。从(1.2)中我们得到了theta的值,而现在我们又引入了新的未知量alpha。所以,求解的Logistic的重点过程就是围绕给出的(xi,yi)求解alpha值。求解alpha的过程有一个有名的算法叫作梯度上升算法。(更加流行的叫梯度下降算法)下面先给出批量梯度上升算法(batch gradient descent algorithm)
Repeat until convergence{
(for every j)       (1.3)
}
给出该算法对实际数据的分类效果图:

对于批量梯度上升算法的缺陷就是处理小数据还行,可是当处理大数据就有点力不从心了。因为,算法每次都要遍历一遍整个数据。对于该算法的优化算法为随机梯度算法(stochastic gradient descent)。
Loop{
for i =1 to m{
(1.4)
}
}
该算法的实际效果图:

对于优化后的算法是可以在新样本到来时对分类器进行增量式更新,因而是一个在线学习算法。所以,当数据很大的时候就会比上一个算法节省大量的时间。
现在的基本参数都已经解决了。那么问题来了,h是如何得到的呢?其实他是我们选择的一个生成函数,根据我们的选择函数不同其就会有不同的形式。本文所采用的h函数时sigmoid的函数。如下所示:
(1.5)

二、代码实现部分

(1)、sigmoid函数,公式(1.5)
  1. def sigmoid(inX):
  2. return 1.0 / (1 + exp(-inX))
(2)、batch gradient descent algorithm,公式(1.3)
  1. #@param dataMatrix type: array
  2. #@param classLabels type: list
  3. #@param weights:alpha's
  4. def gradAscent(dataMatIn, classLabels):
  5. dataMatrix = mat(dataMatIn)
  6. labelMat = mat(classLabels).transpose()
  7. m, n = shape(dataMatrix)
  8. alpha = 0.001
  9. maxCycles = 500
  10. weights = ones((n, 1))
  11. for k in range(maxCycles): #最大循环次数
  12. h = sigmoid(dataMatrix * weights) #矢量
  13. error = (labelMat - h) #矢量
  14. weights = weights + alpha * dataMatrix.transpose() * error
  15. return weights

(3)、stachastic gradient descent algorithm, 公式(1.4)
  1. #@param dataMatrix type: array
  2. #@param classLabels type: list
  3. #@param weights:alpha's
  4. def stocGradAscent(dataMatrix, classLabels, numIter = 150):
  5. m, n = shape(dataMatrix)
  6. weights = ones(n)
  7. for j in range(numIter): #最大循环次数
  8. dataIndex = range(m)
  9. for i in range(m): #更新每个alphas,m为数据组数
  10. alpha = 4 / (1.0 + j + i) + 0.01
  11. randIndex = int(random.uniform(0, len(dataIndex))) #选取随机更新alphas
  12. h = sigmoid(sum(dataMatrix[randIndex] * weights)) #标量
  13. error = classLabels[randIndex] - h #标量
  14. weights = weights + alpha * error * dataMatrix[randIndex]
  15. del(dataIndex[randIndex])
  16. return weights

(4)、分类器
  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)、测试算法
  1. def colicTest():
  2. frTrain = open('horseColicTraining.txt')
  3. frTest = open('horseColicTest.txt')
  4. trainingSet = []; trainingLabels = []
  5. for line in frTrain.readlines():
  6. currLine = line.strip().split('\t')
  7. lineArr = []
  8. for i in range(21):
  9. lineArr.append(float(currLine[i]))
  10. trainingSet.append(lineArr)
  11. trainingLabels.append(float(currLine[21]))
  12. trainWeights = stocGradAscent1(array(trainingSet), array(trainingLabels), 500)#通过训练数据得到的alpha's
  13. # return trainWeights, trainingSet, trainingLabels
  14. errorCount = 0; numTestVec = 0.0
  15. for line in frTest.readlines():
  16. numTestVec += 1.0
  17. currLine = line.strip().split('\t')
  18. lineArr = []
  19. for i in range(21):
  20. lineArr.append(float(currLine[i]))
  21. if int(classifyVector(array(lineArr), trainWeights)) != int(currLine[21]):
  22. errorCount += 1
  23. errorRate = (float(errorCount) / numTestVec)
  24. print "the error of this test is: %f" % errorRate
  25. return errorRate
  26. def multiTest():
  27. numTests = 10; errorSum = 0.0
  28. for k in range(numTests):
  29. errorSum += colicTest()
  30. print "after %d iterations the average error rate is: %f" % (numTests, errorSum / float(numTests))







声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/337708
推荐阅读
相关标签
  

闽ICP备14008679号