机器学习实验一_第1页
机器学习实验一_第2页
机器学习实验一_第3页
机器学习实验一_第4页
机器学习实验一_第5页
已阅读5页,还剩3页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

专业 班级学号 姓名实验项目名称:基于logistics回归和Sigmund分类,最优化方法进行系数确定及确定西瓜的好坏实g验内容:1、 以书89页西瓜数据集创建2、 运用Logistic回归梯度算V3、 运用随机梯度上升法,计4、 运用改进的随机梯度上升5、 从西瓜的特征,来预测西train.txr-记事本文件[F)编辑(E)格式(口)查耳言集(全部数据作为回归方程训练集)。去,计算回归系数,得出图像。算回归系数,得出图像。法,计算回归系数,得出图像。瓜的好坏。(集的划分以下给出)画texttxt-记事本文件旧狷箱(E)搭式壹看(U)0.697 0.460 10.774 0.376 10.634 0.264 10.437 0.211 10.666 0.091 00.243 0.267 00.245 0.057 00.343 0.099 00.719 0.103 00.608 0318 10.556 0.215 10.405 0.237 10.481 0.149 10.639 0.161 00.65了 0.198 00.360 0370 00.593 0.042 0实验过程:算法分析:Logistic回归Logistic回归为概率型非线性回归模型,是研究二值型输出分类的一种多变量分析方法。通过logistic回归我们可以将二分类的观察结果y与一些影响因素[x1,x2,x3,…]建立起关系从而对某些因素条件下某个结果发生的概率进行估计并分类。Sigmoid函数对于二分类问题,我们想要一个函数能够接受所有输入然后预测出两种类别,可以通过输出0或者1。这个函数就是sigmoid函数,它是一种阶跃函数具体的计算公式如下:源程序代码:fromnumpyimport*importmatplotlib.pyplotaspltplt.rcParams['font.sans-serif]=['Simhei'] #解决中文显示问题,指定为黑体plt.rcParams['axes.unicode_minus']=False #解决负数坐标显示问题#数据处理函数,读取文件testSet.txt的内容#前两列J分别为x1和x2值,第3列为数据的类别defloadDataSet():#存放训练数据dataMat=[]#每条数据的类别labelMat=[]#打开文件读取训练样本fr=open('4.5.txt')#按行读取文件内容forlineinfr.readlines():lineArr=line.strip().split()#为计算方便,将x0设置为1#线性回归为h(x)=W0*1+W1*X1+W2*X2#(W0,W1,W2)*(1,X1,X2),(W0,W1,W2)为所求回归系数 机器学习实训实验报告(

机器学习实训实验报告(心_1+LSigmoid函数的性质:当x为0时,Sigmoid函数值为0.5,随着x的增大对应的Sigmoid值将逼近于1;而随着x的减小,Sigmoid函数会趋近于0。随机梯度下降主要用来求解类似于如下求和形式的优化问题:/(w)= 叫叫,基)i=i梯度下降法:飒=Wt~功=叫一m+iEva(山1前3诉)i=l当n很大时,每次迭代计算所有的▽九会非常耗时。随机梯度下降的想法就是每次在中random选取一个计算代替如上的",以这个随机选取的方向作为下降的方向。眄_1一叫—处十扁(珀】晦,欧)1{1,273,,..7n}由 于现V。(缄,风,眦)]=W(皿),当选取stepsize堆°M)时,算法在期望的意义下收敛。注意到在靠近极小值点此*时,可(叫)砰0这导致随机梯度下降法精度低。由于方差的存在,要使得算法收敛,就需要随逐渐减小。因此导致函数即使在强凸且光滑的条件下,收敛速度也只有WE后来提出的变种SAG,SVRG,SDCA都是在降方差,为了保证耻r①*时,方差趋于0。以上提到的几种变种都能达到线性收敛速度。#以下为(1,X1,X2)的值dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])#每条数据类别存入列别向量labelMat中labelMat.append(int(lineArr[2]))#返回训练数据与类别标签returndataMat,labelMat#sigmoid函数优化,输入值为inXdefsigmoid(inX):return1.0/(1+exp(-inX))#输入为训练数据,类别标签defgradAscent(dataMatIn,classLabels):#转为NumPy可识别的矩阵dataMatrix=mat(dataMatIn)#为了便于计算,classLabels为行向量转为列向量labelMat=mat(classLabels).transpose()#获取输入数据的条数m,特征数nm,n=shape(dataMatrix)#设定迭代的步长alphaalpha=0.001#设置循环次数500次,即训练次数,人为给定maxCycles=500#权值初始化为1,后面根据样本数据调整#训练结束得到最优权值#weights为n行,1维。为列向量。weights=ones((n,1))#循环maxCycles次,#每次根据模型输出结果与真实值的误差,调整权值.forkinrange(maxCycles):#dataMatrix*weights矩阵的乘法。#事实上包含300次的乘积#h为模型给出的一个预测值h=sigmoid(dataMatrix*weights)#计算误差,每条记录真实值与预测值之差error=(labelMat-h)#权值调整(未知参数调整)weights=weights+alpha*dataMatrix.transpose()*error#循环次数结束,返回回归系数returnweightsdefplotBestFit(weights):importmatplotlib.pyplotaspltdataMat,labelMat=loadDataSet()dataArr=array(dataMat)n=shape(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]);else:ycord2.append(dataArr[i,2])fig=plt.figure()ax=fig.add_subplot(111)ax.scatter(xcord1,ycord1,s=30,c='red',marker='s')ax.scatter(xcord2,ycord2,s=30,c='green')x=arange(-3.0,3.0,0.1)y=(-weights[0]-weights[1]*x)/weights[2]ax.plot(x,y)plt.xlabel(密度');plt.ylabel(含糖率')plt.show()#随机梯度上升法#输入:训练数据矩阵,类别标签#输出:权值wdefstocGradAscent0(dataMatrix,classLabels):#获取训练数据条数m,维度nm,n=shape(dataMatrix)#步长alpha=0.01#权值初始化为1,后面根据样本数据调整weights=ones(n)#遍历每一条数据foriinrange(m):#h为当前样本的预测值,批处理梯度上升算法的h为所有样本的模型输出#此处h为一个值,即一次只有一个样本更新#dataMatrix[i]*weights也为当前样本行乘以权值weightsh=sigmoid(sum(dataMatrix[i]*weights))#误差,此处error为一个值error=classLabels[i]-h#只选择当前样本进行权值更新weights=weights+alpha*error*dataMatrix[i]#返回权值returnweights#输入:训练数据、类别标签、默认迭代次数#输出:权值defstocGradAscent1(dataMatrix,classLabels,numIter=150):#获取训练数据条数m,列数nm,n=shape(dataMatrix)#权值初始化为1,后面根据样本数据调整weights=ones(n)#循环numIter次forjinrange(numlter):#dataIndex用于随机选择样本来更新系数datalndex=list(range(m))#遍历每一条数据foriinrange(m):#步长不在为定值alpha=#步长不在为定值alpha=4/(1.0+j+i)+0.0001#随机选取样本对系数(权值)进行更新#每次迭代时都调整alpha值,使其减小alpha=4/(1.0+j+i)+0.0001#随机选取样本对系数(权值)进行更新randIndex=int(random.uniform(0,len(datalndex)))

#计算得到该样本的预测值h=sigmoid(sum(dataMatrix[randIndex]*weights))#真实值与预测值之差error=classLabels[randIndex]-h#调整权值weights=weights+alpha*error*dataMatrix[randIndex]#删除已经使用过的样本del(dataIndex[randIndex])#返回回归系数returnweights#定义分类函数#输入:需要进行类别判断的数据inX,训练好的权值weights#输出类别0和1defclassifyVector(inX,weights):#使用sigmoid函数计算prob=sigmoid(sum(inX*weights))#计算结果大于0.5为第1类,小于0.5为第0类ifprob>0.5:return1.0else:return0.0#根据马的一些特征的值,预测是否存活defcolicTest():#导入训练数据frTrain=open('train.txt')#导入测试数据frTest=open('text.txt')#保存训练数据trainingSet=[]#保存数据的类别trainingLabels=[]#遍历每一条训练数据forlineinfrTrain.readlines():#原始数据按tab键分开,读取数据currLine=line.strip().split('\t')lineArr=[]#样本数据共2个属性特征#遍历每列数据,将改行数据转换为行向量,便于整体操作foriinrange(2):lineArr.append(float(currLine[i]))#每条数据处理完后加入训练数据集中trainingSet.append(lineArr)#最后一列为每条数据类别,加入类别标签矩阵trainingLabels.append(float(currLine[2]))#使用改进随机梯度上升(下降)法训练1000次trainWeights = stocGradAscent1(array(trainingSet),trainingLabels,1000)#记录错误次数errorCount=0#记录测试次数numTestVec=0.0

#按行读取测试集数据forlineinfrTest.readlines():#每读一行测试次数加1numTestVec+=1.0#制表符分割出每行数据currLine=line.strip().split('\t')lineArr=[]#遍历每条数据的每列的值foriinrange(2):#转为行向量便于操作lineArr.append(float(currLine[i]))#预测的类别与真实类别不一致,则错误次数加1ifint(classifyVector(array(lineArr),trainWeights))!=int(currLine[2]):errorCount+=1#计算最终错误率,即预测错误次数/总测试次数errorRate=(float(errorCount)/numTestVec)#输出错误率print("theerrorrateofthistestis:%f"%errorRate)#返回错误率returnerrorRate#一次性测试结果错误率并不准确,#可以进行多次测试求平均错误率。#multiTest()函数用于调用colicTest()函数#即调用10次,每次得到一个错误率,求10次的平均错误率defmultiTest():numTests=10;errorSum=0.0forkinrange(numTests):errorSum+=colicTest()print("after%diterationstheaverageerrorrateis:%f"%(numTests,errorSum/float(numTests)))#主函数中每部分去除注释,即可得到对应的结果。if__name__=="__main__":dataMatIn,classLabels=loadDataSet()"""Logistic回归梯度算法""”#weights=gradAscent(dataMatIn,classLabels)#print(weights)#plotBestFit(weights.getA())""”随机梯度上升法”"”#weights=stocGradAscent0(array(dataMatIn),classLabels)#print(weights)#plotBestFit(weights)""”改进的随机梯度上升法”"”#weights=stocGradAscent1(array(dataMatIn),classLabels)#print(weights)#plotBestFit(weights)#multiTest()

运行结果:1、Logistic回归梯度,拟合出的最佳系数:EE-D.36928933][D.40165^04

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论