机器学习经典算法logistic回归

来源:互联网 发布:论坛网站排名数据库 编辑:程序博客网 时间:2024/06/08 15:47

一、算法简要

       我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下:
 
    可以较为清楚的看到,当输入的x小于0时,函数值<0.5,将分类预测为0;当输入的x大于0时,函数值>0.5,将分类预测为1。

1.1 预测函数的表示

     

1.2参数的求解


二、代码实现

          函数sigmoid计算相应的函数值;gradAscent实现的batch-梯度上升,意思就是在每次迭代中所有数据集都考虑到了;而stoGradAscent0中,则是将数据集中的示例都比那里了一遍,复杂度大大降低;stoGradAscent1则是对随机梯度上升的改进,具体变化是alpha每次变化的频率是变化的,而且每次更新参数用到的示例都是随机选取的。相关数据集testSet、horseColicTraining和horseColicTest点击下面下载。
(链接:http://pan.baidu.com/share/link?shareid=4186664847&uk=973467359 密码:2ycp)
[python] view plain?
  1. from numpy import *  
  2. import matplotlib.pyplot as plt  
  3. def loadDataSet():  
  4.     dataMat = []  
  5.     labelMat = []  
  6.     fr = open('testSet.txt')  
  7.     for line in fr.readlines():  
  8.         lineArr = line.strip('\n').split('\t')  
  9.         dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])  
  10.         labelMat.append(int(lineArr[2]))  
  11.     fr.close()  
  12.     return dataMat, labelMat  
  13. def sigmoid(inX):  
  14.     return 1.0/(1+exp(-inX))  
  15. def gradAscent(dataMatIn, classLabels):  
  16.     dataMatrix = mat(dataMatIn)  
  17.     labelMat = mat(classLabels).transpose()  
  18.     m,n=shape(dataMatrix)  
  19.     alpha = 0.001  
  20.     maxCycles = 500  
  21.     weights = ones((n,1))  
  22.     errors=[]  
  23.     for k in range(maxCycles):  
  24.         h = sigmoid(dataMatrix*weights)  
  25.         error = labelMat - h  
  26.         errors.append(sum(error))  
  27.         weights = weights + alpha*dataMatrix.transpose()*error  
  28.     return weights, errors  
  29. def stoGradAscent0(dataMatIn, classLabels):  
  30.     m,n=shape(dataMatIn)  
  31.     alpha = 0.01  
  32.     weights = ones(n)  
  33.     for i in range(m):  
  34.         h = sigmoid(sum(dataMatIn[i]*weights))  
  35.         error = classLabels[i] - h   
  36.         weights = weights + alpha*error*dataMatIn[i]  
  37.     return weights  
  38. def stoGradAscent1(dataMatrix, classLabels, numIter = 150):  
  39.     m,n=shape(dataMatrix)  
  40.     weights = ones(n)  
  41.     for j in range(numIter):  
  42.         dataIndex=range(m)  
  43.         for i in range(m):  
  44.             alpha= 4/(1.0+j+i)+0.01  
  45.             randIndex = int(random.uniform(0,len(dataIndex)))  
  46.             h = sigmoid(sum(dataMatrix[randIndex]*weights))  
  47.             error = classLabels[randIndex]-h  
  48.             weights=weights+alpha*error*dataMatrix[randIndex]  
  49.             del(dataIndex[randIndex])  
  50.         return weights  
  51. def plotError(errs):  
  52.     k = len(errs)  
  53.     x = range(1,k+1)  
  54.     plt.plot(x,errs,'g--')  
  55.     plt.show()  
  56. def plotBestFit(wei):  
  57.     weights = wei.getA()  
  58.     dataMat, labelMat = loadDataSet()  
  59.     dataArr = array(dataMat)  
  60.     n = shape(dataArr)[0]  
  61.     xcord1=[]  
  62.     ycord1=[]  
  63.     xcord2=[]  
  64.     ycord2=[]  
  65.     for i in range(n):    
  66.         if int(labelMat[i])==1:  
  67.             xcord1.append(dataArr[i,1])  
  68.             ycord1.append(dataArr[i,2])  
  69.         else:  
  70.             xcord2.append(dataArr[i,1])  
  71.             ycord2.append(dataArr[i,2])  
  72.     fig = plt.figure()  
  73.     ax = fig.add_subplot(111)  
  74.     ax.scatter(xcord1, ycord1, s=30, c='red', marker='s')  
  75.     ax.scatter(xcord2, ycord2, s=30, c='green')  
  76.     x = arange(-3.0,3.0,0.1)  
  77.     y=(-weights[0]-weights[1]*x)/weights[2]  
  78.     ax.plot(x,y)  
  79.     plt.xlabel('x1')  
  80.     plt.ylabel('x2')  
  81.     plt.show()  
  82. def classifyVector(inX, weights):  
  83.     prob = sigmoid(sum(inX*weights))  
  84.     if prob>0.5:  
  85.         return 1.0  
  86.     else:  
  87.         return 0  
  88. def colicTest(ftr, fte, numIter):  
  89.     frTrain = open(ftr)  
  90.     frTest = open(fte)  
  91.     trainingSet=[]  
  92.     trainingLabels=[]  
  93.     for line in frTrain.readlines():  
  94.         currLine = line.strip('\n').split('\t')  
  95.         lineArr=[]  
  96.         for i in range(21):  
  97.             lineArr.append(float(currLine[i]))  
  98.         trainingSet.append(lineArr)  
  99.         trainingLabels.append(float(currLine[21]))  
  100.     frTrain.close()  
  101.     trainWeights = stoGradAscent1(array(trainingSet),trainingLabels, numIter)  
  102.     errorCount = 0  
  103.     numTestVec = 0.0  
  104.     for line in frTest.readlines():  
  105.         numTestVec += 1.0  
  106.         currLine = line.strip('\n').split('\t')  
  107.         lineArr=[]  
  108.         for i in range(21):  
  109.             lineArr.append(float(currLine[i]))  
  110.         if int(classifyVector(array(lineArr), trainWeights))!=int(currLine[21]):  
  111.             errorCount += 1  
  112.     frTest.close()  
  113.     errorRate = (float(errorCount))/numTestVec  
  114.     return errorRate  
  115. def multiTest(ftr, fte, numT, numIter):  
  116.     errors=[]  
  117.     for k in range(numT):  
  118.         error = colicTest(ftr, fte, numIter)  
  119.         errors.append(error)  
  120.     print "There "+str(len(errors))+" test with "+str(numIter)+" interations in all!"  
  121.     for i in range(numT):  
  122.         print "The "+str(i+1)+"th"+" testError is:"+str(errors[i])  
  123.     print "Average testError: ", float(sum(errors))/len(errors)  
  124. ''''' 
  125. data, labels = loadDataSet() 
  126. weights0 = stoGradAscent0(array(data), labels) 
  127. weights,errors = gradAscent(data, labels) 
  128. weights1= stoGradAscent1(array(data), labels, 500) 
  129. print weights 
  130. plotBestFit(weights) 
  131. print weights0 
  132. weights00 = [] 
  133. for w in weights0: 
  134.     weights00.append([w]) 
  135. plotBestFit(mat(weights00)) 
  136. print weights1 
  137. weights11=[] 
  138. for w in weights1: 
  139.     weights11.append([w]) 
  140. plotBestFit(mat(weights11)) 
  141. '''  
  142. multiTest(r"horseColicTraining.txt",r"horseColicTest.txt",10,500)  
原文地址:http://blog.csdn.net/moodytong/article/details/9731283
0 0
原创粉丝点击