Logistic回归的python代码
2017-12-27 19:51
253 查看
from numpy import * ''' 逻辑回归用于分类和预测,是先采用线性回归作为基础,然后采用sigmoid函数 对所有特征(X0~Xn)做线性回归:z = W0X0 + W1X1 + ...+ WnXn + S(s为一个不依赖于特征的数值) 为了判断分类,以z作为输入,采用sigmoind函数:f(z)=1/(1+exp(-z)) 梯度算法,不断迭代寻求最优参数(W0,W1,W2...Wn): W:=W+a*梯度,a为步长 W:=W+a*(X的转置矩阵)*error向量 其中,X是所有样本的集合,error是所有样本标签的差异向量,这种方法由于取用样本全集,计算代价高。 随机梯度算法,一次仅用一个样本点来更新回归系数: 所有回归系数置为1 对数据集中每个样本: 计算该样本梯度 系数=系数_old + 步长*梯度 返回回归系数 改进的随机梯度算法,相比于随机梯度算法,给定一个迭代次数,步长alpha逐步减少,样本上采取随机选择方式: 所有回归系数置mei为1 给定迭代次数R,重复R次: 对数据集中每个样本: 计算步长:4/(1+i+j)+原始步长 随机选择一个样本,计算该样本梯度 系数=系数_old + 步长*梯度 从数据集中删除已选择的样本 返回回归系数 ''' def loadDataSet(): dataSet=[] lableSet=[] file=open("testSet.txt") for line in file.readlines(): lineArr=line.strip().split('\t') dataSet.append([float(1.0),float(lineArr[0]),float(lineArr[1])]) #float(1.0)作为S lableSet.append(int(lineArr[-1])) dataMat=mat(dataSet) lableMat=mat(lableSet) return dataMat,lableMat def sigmoid(inX): h=1.0/(1+exp(-inX)) return h ##梯度回归 def gradAscent(matX,classlable): lableY=classlable.transpose() i,j=shape(matX) weight=ones((j,1)) alpha=0.001 for k in range(500): error=lableY-sigmoid(matX*weight) weight=weight+alpha*matX.transpose()*error return weight ##随机梯度回归 def stocGradAscent(matX,classLable): i,j=shape(matX) alpha=0.001 weights=ones((j,1)) for k in range(i): error=classLable[0,k]-sigmoid(matX[k]*weights) weights=weights+alpha*error[0,0]*matX[k].transpose() return weights ##改进版随机梯度回归 def stocGradAscent1(matX,classLable,numIter=1000): i,j=shape(matX) weights=ones((j,1)) for r in range(numIter): dataId=list(range(i)) for k in range(i): randomId=int(random.uniform(0,len(dataId))) alpha=4/(i+j+1.0)+0.01 error=classLable[0,dataId[randomId]]-sigmoid(matX[dataId[randomId]]*weights) weights=weights+alpha*error[0,0]*matX[dataId[randomId]].transpose() del(dataId[randomId]) return weights def plotBestFit(wei1,wei2):#wei是一个矩阵 import matplotlib.pyplot as plt weights1=wei1.getA() weights2=wei2.getA() ##矩阵通过这个getA()这个方法可以将自身返回成一个n维数组对象, ## 因为plotBestFit()函数中有计算散点x,y坐标的部分,其中计算y的时候用到了weights,( y = (-weights[0]-weights[1]*x)/weights[2] )如果weights是矩阵的话,weights[1]就是[[0.48007329]](注意这里有两个中括号!),就不是一个数了,最终你会发现y的计算结果的len()只有1,而x的len()则是60 dataMat,labelMat=loadDataSet() dataArr=array(dataMat.getA()) labelArr=labelMat.getA()[0] n=shape(dataArr)[0] xcord1=[];ycord1=[] xcord2=[];ycord2=[] for i in range(n): if int(labelArr[i])==1: xcord1.append(dataArr[i,1]);ycord1.append(dataArr[i,2]) else: xcord2.append(dataArr[i,1]);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=(-weights1[0]-weights1[1]*x)/weights1[2] z=(-weights2[0]-weights2[1]*x)/weights2[2] plt.plot(x,y,'orange') plt.plot(x,z,'blue') plt.xlabel('X1') plt.ylabel('X2') plt.show()
相关文章推荐
- logistic回归算法详细分析与Python代码实现注释
- Logistic回归python代码
- 天池盐城上牌数之基于logistic的回归预测python代码
- 吴恩达 深度学习第三周 浅层神经网络 logistic_regression python代码实现
- Logistic回归 Python实现
- 机器学习三人行(系列六)----Logistic和Softmax回归实战剖析(附代码)
- 线性回归与岭回归python代码实现
- Logistic回归----Matlab/Python(1)
- 机器学习之Logistic回归与Python实现
- SoftMax回归简介及python代码实现
- 逻辑回归Python代码
- CART之回归树python代码实现
- 如何用Python处理分类和回归问题?附方法和代码
- Python语言描述机器学习之Logistic回归算法
- 通俗易懂地介绍梯度下降法(以线性回归为例,配以Python示例代码)
- Logistic Regression 逻辑回归算法例子,python代码实现
- Logistic回归分类算法原理分析与代码实现
- Logistic Regression 逻辑回归算法例子,python代码实现
- 【Python学习系列十六】基于scikit-learn库逻辑回归训练模型(delta比赛代码)
- [深度学习]Python/Theano实现逻辑回归网络的代码分析