您的位置:首页 > 编程语言 > Python开发

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()
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息