一、算法简要

我们希望有这么一种函数:接受输入然后预测出类别,这样用于分类。这里,用到了数学中的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)

总结

以上就是本文关于机器学习经典算法-logistic回归代码详解的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站:

python中实现k-means聚类算法详解

Python编程实现粒子群算法(PSO)详解

Python编程实现蚁群算法详解

如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

kmeans python interation flag_机器学习经典算法-logistic回归代码详解相关推荐

  1. 天津理工大学《操作系统》实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解

    天津理工大学<操作系统>实验二,存储器的分配与回收算法实现,代码详解,保姆式注释讲解 实验内容 1. 本实验是模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不 ...

  2. python实验原理_Python实现蒙特卡洛算法小实验过程详解

    蒙特卡洛算法思想 蒙特卡洛(Monte Carlo)法是一类随机算法的统称,提出者是大名鼎鼎的数学家冯·诺伊曼,他在20世纪40年代中期用驰名世界的赌城-摩纳哥的蒙特卡洛来命名这种方法. 通俗的解释一 ...

  3. python语法错误概述_Python 错误和异常代码详解

    程序中的错误一般被称为 Bug,无可否认,这几乎总是程序员的错... 程序员的一生,始终伴随着一件事 - 调试(错误检测.异常处理).反反复复,最可怕的是:不仅自己的要改,别人的也要改...一万头草泥 ...

  4. python split函数 空格_最易懂的Python新手教程:从基础语法到代码详解

    导读:本文立足基础,讲解Python和PyCharm的安装,及Python最简单的语法基础和爬虫技术中所需的Python语法. 作者:罗攀 蒋仟 如需转载请联系华章科技 本文涉及的主要知识点如下: P ...

  5. MeanTeacher文章解读+算法流程+核心代码详解

    MeanTeacher 本博客仅做算法流程疏导,具体细节请参见原文 原文 原文链接点这里 Github 代码 Github代码点这里 解读 论文解读点这里 算法流程 代码详解 train_transf ...

  6. 如何在python制作计算器_Python简易计算器制作方法代码详解

    主要用到的工具是Python中的Tkinter库 比较简单 直接上图形界面和代码 引用Tkinter库 from tkinter import * 建立主窗口对象 window=Tk() #设置窗口对 ...

  7. 机器学习分类算法(附图文详解)

    说起分类算法,相信学过机器学习的同学都能侃上一二. 可是,你能够如数家珍地说出所有常用的分类算法,以及他们的特征.优缺点吗?比如说,你可以快速地回答下面的问题么: KNN算法的优缺点是什么? Naiv ...

  8. python自然语言处理实战核心技术与算法——HMM模型代码详解

    本人初学NLP,当我看着<python自然语言处理实战核心技术与算法>书上这接近200行的代码看着有点头皮发麻,于是我读了接近一天基本把每行代码的含义给读的个七七八八,考虑到可能会有人和我 ...

  9. K均值(K-means)聚类算法原理与代码详解

    0. 算法原理: 上述过程简单描述: a: 初始数据 b: 选择质点 c: 根据质点划分 d: 求均值,更新质心点 e: 划分 f: 更新质心点 1. 代码实现: # K means 教程# 0. 引 ...

最新文章

  1. 教你用ERD轻松修改系统登录密码
  2. 从对比学习(Contrastive Learning)到对比聚类(Contrastive Clustering)
  3. 如果我是博客园的产品经理【下】
  4. DIP第二章习题解答
  5. dmp标签_京东dmp人群标签的使用,直接决定了你快车的盈利
  6. android 自定义频谱,android – 如何从实时音频开发频谱分析仪?
  7. Spring web.xml详解
  8. CentOS安装KVM步骤虚拟机,绝对实用!
  9. LeetCode算法入门- Longest Palindromic Substring-day5
  10. linux下mysql-5.5.15安装详细步骤
  11. 爬虫爬评书吧_200行代码实现一个有声听书网爬虫下载器
  12. 《Spring微服务实战》读书笔记——构建微服务
  13. Go Web开发之Revel - 返回值
  14. 软工第一次个人作业博客(一)
  15. java jsessionid_关于JSESSIONID
  16. android微信版本怎么升级,微信版本怎么看 微信版本升级更新至最新版本方法介绍...
  17. Mysql如何存取Emoji表情包
  18. 三星java游戏打雪仗下载_三星拱照之驸马镇邪
  19. ESP通过乐为物联控制灯,微信发送数值,ESP上传传感器数据
  20. Yocto系列讲解[理论篇]25 - BitBake全过程(3)

热门文章

  1. Grafana 6.7的sqlite3数据库报错“database is locked”的修复方法
  2. 微信服务号如何创建一个带参数的微信二维码?
  3. 旅行商问题与蚁群算法
  4. Java对象内存大小计算
  5. Pd虚拟机安装系统提示 “网络初始化失败 操作失败 ”的解决方案
  6. The projects in the reactor contain a cyclic reference
  7. HTML做一个圣诞页面(纯html代码)
  8. 大中型企业九种资金管理模式
  9. Moment Generating Function
  10. CYUSB3014 USB3.0与FPGA设计