资讯动态

【python】python机器学习实战4:Logistic回归

发布时间:2026/10/23 1:01:10 来源:尧图企业网站定制
1.Logistic回归简介先给出本次实战的代码和数据集链接: https://pan.baidu.com/s/1dEE1QJR 密码: 6nnh我们拿到一些数据点用一条直线对这些点进行拟合该线称为最佳拟合直线这个拟合过程就叫做回归。利用Logistic回归进行分类的主要思想是根据现有数据对分类边界线建立回归公式以此进行分类。“回归”一词源于最佳拟合表示要找到最佳拟合参数集。其实回归也就是个名字不用太纠结。代码中还会用到Sigmoid函数和梯度上升这个在CS231n系列课程里激活函数那部分已经详细讲解过这里就不在赘述。2.Logistic回归分类的代码实现#coding:utf-8#Logistic回归梯度上升优化算法#导入numpyfromnumpyimport*#打开测试文件进行逐行读取defloadDataSet():dataMat[];labelMat[]fropen(testSet.txt)forlineinfr.readlines():lineArrline.strip().split()dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])labelMat.append(int(lineArr[2]))returndataMat,labelMat#sigmoid函数定义defsigmoid(inX):return1.0/(1exp(-inX))#梯度上升算法defgradAscent(dataMatIn,classLabels):dataMatrixmat(dataMatIn)#convert to NumPy matrixlabelMatmat(classLabels).transpose()#convert to NumPy matrixm,nshape(dataMatrix)alpha0.001maxCycles500weightsones((n,1))forkinrange(maxCycles):#heavy on matrix operationshsigmoid(dataMatrix*weights)#matrix multerror(labelMat-h)#vector subtractionweightsweightsalpha*dataMatrix.transpose()*error#matrix multreturnweights#画出数据集和Logistic回归最佳拟合直线的函数defplotBestFit(weights):importmatplotlib.pyplotasplt dataMat,labelMatloadDataSet()dataArrarray(dataMat)nshape(dataArr)[0]xcord1[];ycord1[]xcord2[];ycord2[]foriinrange(n):ifint(labelMat[i])1:xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2])else:xcord2.append(dataArr[i,1]);ycord2.append(dataArr[i,2])figplt.figure()axfig.add_subplot(111)ax.scatter(xcord1,ycord1,s30,cred,markers)ax.scatter(xcord2,ycord2,s30,cgreen)xarange(-3.0,3.0,0.1)y(-weights[0]-weights[1]*x)/weights[2]ax.plot(x,y)plt.xlabel(X1);plt.ylabel(X2);plt.show()#随机梯度上升算法defstocGradAscent0(dataMatrix,classLabels):m,nshape(dataMatrix)alpha0.01weightsones(n)#initialize to all onesforiinrange(m):hsigmoid(sum(dataMatrix[i]*weights))errorclassLabels[i]-h weightsweightsalpha*error*dataMatrix[i]returnweights#改进的随机梯度下降defstocGradAscent1(dataMatrix,classLabels,numIter150):m,nshape(dataMatrix)weightsones(n)#initialize to all onesforjinrange(numIter):dataIndexrange(m)foriinrange(m):alpha4/(1.0ji)0.0001#apha decreases with iteration, does notrandIndexint(random.uniform(0,len(dataIndex)))#go to 0 because of the constanthsigmoid(sum(dataMatrix[randIndex]*weights))errorclassLabels[randIndex]-h weightsweightsalpha*error*dataMatrix[randIndex]del(dataIndex[randIndex])returnweights#Logistic回归分类函数defclassifyVector(inX,weights):probsigmoid(sum(inX*weights))ifprob0.5:return1.0else:return0.0#便利函数整理好训练集和测试集数据defcolicTest():frTrainopen(horseColicTraining.txt);frTestopen(horseColicTest.txt)trainingSet[];trainingLabels[]forlineinfrTrain.readlines():currLineline.strip().split(\t)lineArr[]foriinrange(21):lineArr.append(float(currLine[i]))trainingSet.append(lineArr)trainingLabels.append(float(currLine[21]))trainWeightsstocGradAscent1(array(trainingSet),trainingLabels,1000)errorCount0;numTestVec0.0forlineinfrTest.readlines():numTestVec1.0currLineline.strip().split(\t)lineArr[]foriinrange(21):lineArr.append(float(currLine[i]))ifint(classifyVector(array(lineArr),trainWeights))!int(currLine[21]):errorCount1errorRate(float(errorCount)/numTestVec)printthe error rate of this test is: %f%errorRatereturnerrorRate#多次测试求平均值这个测试结果不太稳定在35%左右defmultiTest():numTests10;errorSum0.0forkinrange(numTests):errorSumcolicTest()printafter %d iterations the average error rate is: %f%(numTests,errorSum/float(numTests))又完成一个实战咯O(∩_∩)O

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑