机器学习经典算法-logistic回归代码详解
作者:moodytong 发布时间:2021-05-06 23:56:12
标签:logistic回归,python,机器学习
一、算法简要
我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的sigmoid函数,sigmoid函数的具体表达式和函数图象如下:
可以较为清楚的看到,当输入的x小于0时,函数值<0.5,将分类预测为0;当输入的x大于0时,函数值>0.5,将分类预测为1。
1.1 预测函数的表示
1.2参数的求解
二、代码实现
函数sigmoid计算相应的函数值;gradAscent实现的batch-梯度上升,意思就是在每次迭代中所有数据集都考虑到了;而stoGradAscent0中,则是将数据集中的示例都比那里了一遍,复杂度大大降低;stoGradAscent1则是对随机梯度上升的改进,具体变化是alpha每次变化的频率是变化的,而且每次更新参数用到的示例都是随机选取的。
from numpy import *
import matplotlib.pyplot as plt
def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip('\n').split('\t')
dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
labelMat.append(int(lineArr[2]))
fr.close()
return dataMat, labelMat
def sigmoid(inX):
return 1.0/(1+exp(-inX))
def gradAscent(dataMatIn, classLabels):
dataMatrix = mat(dataMatIn)
labelMat = mat(classLabels).transpose()
m,n=shape(dataMatrix)
alpha = 0.001
maxCycles = 500
weights = ones((n,1))
errors=[]
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights)
error = labelMat - h
errors.append(sum(error))
weights = weights + alpha*dataMatrix.transpose()*error
return weights, errors
def stoGradAscent0(dataMatIn, classLabels):
m,n=shape(dataMatIn)
alpha = 0.01
weights = ones(n)
for i in range(m):
h = sigmoid(sum(dataMatIn[i]*weights))
error = classLabels[i] - h
weights = weights + alpha*error*dataMatIn[i]
return weights
def stoGradAscent1(dataMatrix, classLabels, numIter = 150):
m,n=shape(dataMatrix)
weights = ones(n)
for j in range(numIter):
dataIndex=range(m)
for i in range(m):
alpha= 4/(1.0+j+i)+0.01
randIndex = int(random.uniform(0,len(dataIndex)))
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex]-h
weights=weights+alpha*error*dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights
def plotError(errs):
k = len(errs)
x = range(1,k+1)
plt.plot(x,errs,'g--')
plt.show()
def plotBestFit(wei):
weights = wei.getA()
dataMat, labelMat = loadDataSet()
dataArr = array(dataMat)
n = shape(dataArr)[0]
xcord1=[]
ycord1=[]
xcord2=[]
ycord2=[]
for i in range(n):
if int(labelMat[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=(-weights[0]-weights[1]*x)/weights[2]
ax.plot(x,y)
plt.xlabel('x1')
plt.ylabel('x2')
plt.show()
def classifyVector(inX, weights):
prob = sigmoid(sum(inX*weights))
if prob>0.5:
return 1.0
else:
return 0
def colicTest(ftr, fte, numIter):
frTrain = open(ftr)
frTest = open(fte)
trainingSet=[]
trainingLabels=[]
for line in frTrain.readlines():
currLine = line.strip('\n').split('\t')
lineArr=[]
for i in range(21):
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr)
trainingLabels.append(float(currLine[21]))
frTrain.close()
trainWeights = stoGradAscent1(array(trainingSet),trainingLabels, numIter)
errorCount = 0
numTestVec = 0.0
for line in frTest.readlines():
numTestVec += 1.0
currLine = line.strip('\n').split('\t')
lineArr=[]
for i in range(21):
lineArr.append(float(currLine[i]))
if int(classifyVector(array(lineArr), trainWeights))!=int(currLine[21]):
errorCount += 1
frTest.close()
errorRate = (float(errorCount))/numTestVec
return errorRate
def multiTest(ftr, fte, numT, numIter):
errors=[]
for k in range(numT):
error = colicTest(ftr, fte, numIter)
errors.append(error)
print "There "+str(len(errors))+" test with "+str(numIter)+" interations in all!"
for i in range(numT):
print "The "+str(i+1)+"th"+" testError is:"+str(errors[i])
print "Average testError: ", float(sum(errors))/len(errors)
'''''
data, labels = loadDataSet()
weights0 = stoGradAscent0(array(data), labels)
weights,errors = gradAscent(data, labels)
weights1= stoGradAscent1(array(data), labels, 500)
print weights
plotBestFit(weights)
print weights0
weights00 = []
for w in weights0:
weights00.append([w])
plotBestFit(mat(weights00))
print weights1
weights11=[]
for w in weights1:
weights11.append([w])
plotBestFit(mat(weights11))
'''
multiTest(r"horseColicTraining.txt",r"horseColicTest.txt",10,500)
总结
python中实现k-means聚类算法详解
Python编程实现粒子群算法(PSO)详解
Python编程实现蚁群算法详解
如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!
来源:http://blog.csdn.net/moodytong/article/details/9731283


猜你喜欢
- 目录楔子paramikoSSHClient 的使用connect:实现远程服务器的连接与认证set_missing_host_key_pol
- 问题描述在电脑中重新安装Anaconda3&PyCharm后,运行原来的程序画图时出现了下图界面。不能弹出如下图所示的“figure”窗口。
- 具体内容如下所示:参考案例:import turtled=0for i in range(4): turtle.fd(200)
- Metro风格设计主要特点 1.Windows 8 Metro风格设计,实现网站或系统功能的导航 2.纯Javascript实现 3.支持所
- 本文主要介绍了python opencv 找出图像中的最大轮廓并填充,分享给大家,具体如下:import cv2import numpy a
- 从MySQL 5.0 开始,支持了一个全新的SQL句法:PREPARE stmt_name FROM preparable_stmt;EXE
- 创建SQL存储过程需要使用到的语法- 创建存储过程CREATE 存储过程的名称(参数)BEGIN...需要执行的SQL语句END- 调用CA
- 【需求背景】有时候我们要对比两份配置文件是不是一样,或者比较两个文本是否异样,可以使用linux命令行工具diff a_file b_fil
- 网站搬家的时候碰到的这个问题,因为数据一直是使用PhpMyAdmin工具来进行备份和恢复的,但是随着网站的数据越来越多,所以数据库也是越来越
- 在数据库操作中,有些时候我们遇到需要实现“行转列”的需求,例如一下的表为某店铺的一周收入情况表:WEEK_INCOME(WEEK VARCH
- 时间库—arrow使用背景日期时间处理在实际应用场景中无处不在,所以这也成了编程语言中必不可少的模块,Python 也不例外。但是,你知道在
- 如下所示:coupon = models.ForeignKey("Coupon", on_delete=models.C
- 大家在使用python的过程中,应该在敲代码的时候经常遇到str内置函数,为了防止大家搞混,本文整理归纳了str内置函数。1字符串查找类:f
- 目录01 all or any02 dir03 列表(list)推导式04 pprint05 repr06 sh07 Type hints0
- 首先 跳过权限表模式启动MySQL:mysqld --skip-grant-tables &从现在开始,你将踏入第一个坑
- uwsgi介绍uWSGI是一个Web服务器,它实现了WSGI协议、uwsgi、http等协议。Nginx中HttpUwsgiModule的作
- 目录连接池是什么?为什么需要连接池?连接池的原理是什么?使用python语言自制简易mysql连接池开始使用自定义配置文件名 & 配
- 1、合并列表(extend)跟元组一样,用加号(+)将两个列表加起来即可实现合并:In [1]: x=list(range(1, 13, 2
- 在Server和Client通讯中,由于网络等原因很可能会发生数据丢包的现象。如果数据缺失,服务端接收的信息不完整,就会造成混乱。我们需要在
- 偶然发现linux系统附带的一个数独游戏,打开玩了几把。无奈是个数独菜鸟,以前没玩过,根本就走不出几步就一团浆糊了。于是就打算借助计算机的强