Python机器学习logistic回归代码解析


Posted in Python onJanuary 17, 2018

本文主要研究的是Python机器学习logistic回归的相关内容,同时介绍了一些机器学习中的概念,具体如下。

Logistic回归的主要目的:寻找一个非线性函数sigmod最佳的拟合参数

拟合、插值和逼近是数值分析的三大工具

回归:对一直公式的位置参数进行估计

拟合:把平面上的一些系列点,用一条光滑曲线连接起来

logistic主要思想:根据现有数据对分类边界线建立回归公式、以此进行分类

sigmoid函数:在神经网络中它是所谓的激励函数。当输入大于0时,输出趋向于1,输入小于0时,输出趋向0,输入为0时,输出为0.5

Python机器学习logistic回归代码解析

梯度上升:要找到某个函数的最大值,最好的方法是沿着该函数的梯度方向探寻

收敛:随着迭代的运行算法的结果和真实结果的误差越来越小,且趋向于一个固定值。

爬山算法:是完完全全的贪心算法,每次鼠目寸光的选择一个当前最优解,英雌只能搜寻到局部最优值

模拟退火算法:也是一种贪心算法但它的sou索过程引入了随机因素,模拟退火算法以一定的概念来接受一个比当前解要差的解,因此有可能会跳出这个局部最优解,达到全局最优解。

处理数据中的缺失值:

使用可用特征的均值来填补缺失值

使用特殊值来填补缺失值,如-1

忽略有缺失值的样本

使用相似样本的均值添补缺失值

使用其它机器学习算法预测缺失值

标签与特征不同,很难确定采用某个合适的值来替换。

#coding:utf-8
 
from numpy import *
import math
 
def loadDataSet():
  dataMat = []; labelMat = []
  fr = open('testSet.txt')
  for line in fr.readlines():
    lineArr = line.strip().split()
    dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
    labelMat.append(int(lineArr[2]))
  return dataMat,labelMat
 
def sigmoid(inX):
  return longfloat(1.0/(1+exp(-inX))) #sigmoid函数公式
 
def gradAscent(dataMatIn, classLabels):
  #dataMatIn 一个2维的数组;classLabels 类别标签
  dataMatrix = mat(dataMatIn)       #转换为矩阵
  labelMat = mat(classLabels).transpose() #得到矩阵的转置矩阵
  m,n = shape(dataMatrix)  #读取矩阵的长度,二维矩阵,返回两个值
  alpha = 0.001     #向目标移动的步长
  maxCycles = 500    #迭代次数 
  weights = ones((n,1))  #ones()函数用以创建指定形状和类型的数组,默认情况下返回的类型是float64。但是,如果使用ones()函数时指定了数据类型,那么返回的就是该类型
  for k in range(maxCycles):       
    h = sigmoid(dataMatrix*weights)   #matrix mult
    error = (labelMat - h)       #vector subtraction
    weights = weights + alpha * dataMatrix.transpose()* error #matrix mult
  return weights
 
def plotBestFit(weights):
  import matplotlib as mpl
  mpl.use('Agg')         #为了防止出现:RuntimeError: could not open display报错
  import matplotlib.pyplot as plt
  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() #figure: 控制dpi、边界颜色、图形大小、和子区( subplot)设置
  ax = fig.add_subplot(111) # 参数111的意思是:将画布分割成1行1列,图像画在从左到右从上到下的第1块,
  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.savefig('plotBestFit.png')  #因为我是腾讯云服务器,没有图形界面,所以我保存为图片。
 
#随机梯度上升算法
def stocGradAscent0(dataMatrix, classLabels):
  m,n = shape(dataMatrix)
  alpha = 0.01
  weights = ones(n)  #initialize to all ones
  for i in range(m):
    h = sigmoid(sum(dataMatrix[i]*weights))
    error = classLabels[i] - h
    weights = weights + alpha * error * dataMatrix[i] #回归系数的更新操作
  return weights
 
#改进的随机梯度上升算法
def stocGradAscent1(dataMatrix, classLabels, numIter=150):  #较之前的增加了一个迭代次数作为第三个参数,默认值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.0001  
      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
 
#以回归系数和特征向量作为输入计算对应的sigmoid值
def classifyVector(inX, weights):
  prob = sigmoid(sum(inX*weights))
  if prob > 0.5: return 1.0        #如果sigmoid值大于0.5函数返回1,否则返回0
  else: return 0.0
 
#打开测试集和训练集,并对数据进行格式化处理的函数
def colicTest():
  frTrain = open('horseColicTraining.txt'); frTest = open('horseColicTest.txt')
  trainingSet = []; trainingLabels = []
  for line in frTrain.readlines():
    currLine = line.strip().split('\t')
    lineArr =[]
    for i in range(21):
      lineArr.append(float(currLine[i]))
    trainingSet.append(lineArr)
    trainingLabels.append(float(currLine[21]))
  trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000) #计算回归系数向量
  errorCount = 0; numTestVec = 0.0
  for line in frTest.readlines():
    numTestVec += 1.0
    currLine = line.strip().split('\t')
    lineArr =[]
    for i in range(21):
      lineArr.append(float(currLine[i]))
    if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]):
      errorCount += 1
  errorRate = (float(errorCount)/numTestVec)
  print "the error rate of this test is: %f" % errorRate
  return errorRate
#调用函数colicTest()10次,并求结果的平均值
def multiTest():
  numTests = 10; errorSum=0.0
  for k in range(numTests):
    errorSum += colicTest()
  print "after %d iterations the average error rate is: %f" % (numTests, errorSum/float(numTests))

Python机器学习logistic回归代码解析

Python机器学习logistic回归代码解析

总结

以上就是本文关于Python机器学习logistic回归代码解析的全部内容,希望对大家有所帮助。感兴趣的朋友可以继续参阅本站其他相关专题,如有不足之处,欢迎留言指出。感谢朋友们对本站的支持!

Python 相关文章推荐
实例讲解Python中SocketServer模块处理网络请求的用法
Jun 28 Python
pyqt5自定义信号实例解析
Jan 31 Python
Python 数值区间处理_对interval 库的快速入门详解
Nov 16 Python
用xpath获取指定标签下的所有text的实例
Jan 02 Python
django框架CSRF防护原理与用法分析
Jul 22 Python
python 中Arduino串口传输数据到电脑并保存至excel表格
Oct 14 Python
python3 Scrapy爬虫框架ip代理配置的方法
Jan 17 Python
Django 404、500页面全局配置知识点详解
Mar 10 Python
python实现五子棋程序
Apr 24 Python
Python中有几个关键字
Jun 04 Python
Python识别验证码的实现示例
Sep 30 Python
python+opencv3.4.0 实现HOG+SVM行人检测的示例代码
Jan 28 Python
酷! 程序员用Python带你玩转冲顶大会
Jan 17 #Python
Python建立Map写Excel表实例解析
Jan 17 #Python
Python冲顶大会 快来答题!
Jan 17 #Python
urllib和BeautifulSoup爬取维基百科的词条简单实例
Jan 17 #Python
python thrift搭建服务端和客户端测试程序
Jan 17 #Python
Python元字符的用法实例解析
Jan 17 #Python
Python工程师面试必备25条知识点
Jan 17 #Python
You might like
十大催泪虐心动漫,你能坚持看到第几部?
2020/03/04 日漫
使用php判断浏览器的类型和语言的函数代码
2013/02/28 PHP
使用swoole 定时器变更超时未支付订单状态的解决方案
2019/07/24 PHP
javascript编程起步(第二课)
2007/01/10 Javascript
JavaScript 操作键盘的Enter事件(键盘任何事件),兼容多浏览器
2010/10/11 Javascript
Javascript遍历Html Table示例(包括内容和属性值)
2014/07/08 Javascript
js如何判断访问是来自搜索引擎(蜘蛛人)还是直接访问
2015/09/14 Javascript
jQuery使用cookie与json简单实现购物车功能
2016/04/15 Javascript
jquery实现跳到底部,回到顶部效果的简单实例(类似锚)
2016/07/10 Javascript
JS简单随机数生成方法
2016/09/05 Javascript
微信小程序上传图片到服务器实例代码
2017/11/07 Javascript
JavaScript实现重力下落与弹性效果的方法分析
2017/12/20 Javascript
JavaScript学习笔记之数组基本操作示例
2019/01/09 Javascript
jQuery实现模拟搜索引擎的智能提示功能简单示例
2019/01/27 jQuery
js使用cookie实现记住用户名功能示例
2019/06/13 Javascript
javascript解析json格式的数据方法详解
2020/08/07 Javascript
React Ant Design树形表格的复杂增删改操作
2020/11/02 Javascript
Python抓取电影天堂电影信息的代码
2016/04/07 Python
centos6.8安装python3.7无法import _ssl的解决方法
2018/09/17 Python
python使用matplotlib画柱状图、散点图
2019/03/18 Python
详解python中TCP协议中的粘包问题
2019/03/22 Python
Python Django给admin添加Action的方法实例详解
2019/04/29 Python
Python实现FM算法解析
2019/06/18 Python
Python绘图Matplotlib之坐标轴及刻度总结
2019/06/28 Python
python按行读取文件并找出其中指定字符串
2019/08/08 Python
python中的TCP(传输控制协议)用法实例分析
2019/11/15 Python
HTML5 Canvas自定义圆角矩形与虚线示例代码
2013/08/02 HTML / CSS
世界上最全面的汽车零部件和配件集合:JC Whitney
2016/09/04 全球购物
美国山地自行车、露营、户外装备和服装购物网站:Aventuron
2018/05/05 全球购物
在校学生职业规划范文
2014/01/08 职场文书
《唯一的听众》教学反思
2014/02/20 职场文书
烹饪大赛策划方案
2014/05/26 职场文书
装饰工程师岗位职责
2014/06/08 职场文书
被告答辩状范文
2015/05/22 职场文书
nginx基于域名,端口,不同IP的虚拟主机设置的实现
2021/03/31 Servers
MySQL 自动填充 create_time 和 update_time
2022/05/20 MySQL