先了解大致模型建立的流程,接下来我会弄一些算法的原理及梯度上升的对比:

数据有三部分:

梯度算法公式:

附完整版代码:

from numpy import *
import numpy as np

def loadDataSet():
    dataMat = [];
    labelMat = []
    fr = open('D:\\machinelearn_data\\testSet.txt')
    for line in fr.readlines():
        lineArr = line.strip().split()
        print(int(lineArr[2]))
        # strip() 方法用于移除字符串头尾指定的字符(默认为空格)
        dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])])
        # 第一列是1,另外加的,即形如[1,x1,x2]
        labelMat.append(int(lineArr[2]))
        #print(labelMat)
    return dataMat, labelMat  # 此时是数组

def sigmoid(inX):
    return 1.0 / (1 + exp(-inX))  # 返回一个0-1的100*1的数组

# 梯度上升
def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)  # convert to NumPy matrix  # 转换成numpy矩阵(matrix),dataMatrix:100*3
    labelMat = mat(classLabels).transpose()  # convert to NumPy matrix # transpose转置为100*1
    m, n = shape(dataMatrix)  # 得到行和列数,0代表行数,1代表列数
    alpha = 0.001  # 步长
    maxCycles = 500  # 最大迭代次数
    weights = ones((n, 1))  # 3*1的矩阵,其权系数个数由给定训练集的维度值和类别值决定
    for k in range(maxCycles):  # heavy on matrix operations
        h = sigmoid(dataMatrix * weights)  # matrix mult # 利用对数几率回归,z = w0 +w1*X1+w2*X2,w0相当于b
        error = (labelMat - h)  # vector subtraction
        weights = weights + alpha * dataMatrix.transpose() * error  # matrix mult  # 一种极大似然估计的推到过程,但每次的权系数更新都要遍历整个数据集
    return weights

# 画出数据集和Logistic分类直线的函数
def plotBestFit(weights):
    import matplotlib.pyplot as plt
    dataMat, labelMat = loadDataSet()  # 加载数据集,训练数据和标签
    dataArr = array(dataMat)  # 进行数据处理,必须转换为numpy中的array
    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)
    # print(type(x))
    y = (-weights[0] - weights[1] * x) / weights[2]  # 换算后的简化形式
    y1 = y.T  # 转置换类型 或者其他api都可以试试

# print(type(y))
    # m,b = np.polyfit(x,y)
    ax.plot(x, y1)
    plt.xlabel('X1')
    plt.ylabel('X2')
    plt.show()

# 梯度上升算法
"""
设定循环迭代次数,权重系数的每次更新是荣国计算所有样本得出来的,当训练集过于庞大不利于计算
"""

def stocGradAscent0(dataMatrix, classLabels):
    m, n = shape(dataMatrix)
    alpha = 0.01  # x学习率
    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

# 随机梯度上升
"""
对梯度上升算法进行改进,权重系数的每次更新通过训练集的每个记录计算得到
可以在新样本到来时分类器进行增量式更新,因为随机梯度算法是个更新权重的算法
但是算法容易受到噪声点的影响。在大的波动停止后,还有小周期的波动
"""

"""
前者的h,error 都是数值,前者没有矩阵转换过程,后者都是向量,数据类型则变为numpy
"""
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
    m, n = shape(dataMatrix)
    weights = ones(n)  # initialize to all ones
    for j in range(numIter):
        dataIndex = range(m)
        for i in range(m):
            alpha = 4 / (1.0 + j + i) + 0.0001  # apha decreases with iteration, does not
            randIndex = int(random.uniform(0, len(dataIndex)))  # go to 0 because of the constant
            h = sigmoid(sum(dataMatrix[randIndex] * weights))
            error = classLabels[randIndex] - h
            # 学习率:变化。随着迭代次数的增多,逐渐变下。
            # 权重系数更新:设定迭代次数,每次更新选择的样例是随机的(不是依次选的)。
            weights = weights + alpha * error * dataMatrix[randIndex]  # 分类函数
            # 为什么删除变量?
            #print(list(dataIndex)[randIndex])
            del (list(dataIndex)[randIndex])
    return weights

# 分类算法
def classifyVector(inX, weights):
    prob = sigmoid(sum(inX * weights))
    if prob > 0.5:
        return 1.0
    else:
        return 0.0

# 测试算法
"""
为了量化回归效果,使用错误率作为观察指标。根据错误率决定是否回退到训练阶段,通过改变迭代次数和步骤等参数来得到更好的回归系数。
"""

def colicTest():
    frTrain = open('D:\\machinelearn_data\\horseColicTraining.txt', encoding='utf8');
    frTest = open('D:\\machinelearn_data\\horseColicTest.txt', encoding='utf8')
    trainingSet = []
    trainingLabels = []
    # print(frTest)
    # print(frTrain)
    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

# 通过多次测试,取平均,作为该分类器错误率

"""
优点:计算代价不高,易于理解和实现;

缺点:容易欠拟合,分类进度可能不高;

使用数据类型:数值型和标称型数据。

"""

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)))

if __name__ == '__main__':
    # 入口函数:模型参数y=wx
    dataArr, labelMat = loadDataSet()
    #weights = gradAscent(dataArr, labelMat)  # dataArr:100*3,labelMat是一个列表
    weights = stocGradAscent1(array(dataArr),labelMat ,150)
    plotBestFit(weights)
    multiTest()

梯度优化示意图:

主要是对sigmoid函数的理解,如图,知道变量的变化范围,最优解,及跳跃函数的理解,就基本了解逻辑函数分类的原理了

不当之处,多多理解

逻辑回归实例:从疝气病预测病马的死亡率相关推荐

  1. 机器学习算法(四)逻辑回归理论与python实现+经典示例(从疝气病预测病马的死亡率)

    学习笔记更新 什么是逻辑回归? 简要介绍     逻辑回归是用来解决线性回归问题的,它将线性回归得到的结果通过逻辑函数映射到[0,1]之间,因此称逻辑回归.逻辑回归模型主要用于解决二分类问题,是一个分 ...

  2. Logistic回归实战---疝气病症预测病马的死亡率

    Logistic回归实现预测HorseColic 使用Logistic回归来预测患疝气病的马的存活问题(从疝气病症预测病马的死亡率) 一.环境准备 原始数据集下载及说明:http://archive. ...

  3. 逻辑回归实例--乳腺癌肿瘤预测

    文章目录 0.前言 1.导入数据 2.数据预处理 3.准备训练测试数据 4. 标准化数据 5.逻辑回归模型 6.性能分析 7.十折交叉验证 0.前言 环境:Python3.6.5 编译器:jupyte ...

  4. python预测疾病_吴裕雄--天生自然python机器学习:使用Logistic回归从疝气病症预测病马的死亡率...

    ,除了部分指标主观和难以测量外,该数据还存在一个问题,数据集中有 30%的值是缺失的.下面将首先介绍如何处理数据集中的数据缺失问题,然 后 再 利 用 Logistic回 归 和随机梯度上升算法来预测 ...

  5. Logistic回归示例:从疝气病预测病马的死亡率

    目录 准备数据:处理数据中的缺失值 测试算法:用Logistic回归进行分类 疝气病是描述马胃肠痛的术语.然而这种病并不一定源自马的肠胃问题,其他问题也可能引发马疝病. 此外,除了部分指标主观和难以测 ...

  6. 机器学习实战--Logistic回归与实例:从疝病症预测病马的死亡率

    声明 本文参考了<机器学习实战>书中代码,结合该书讲解,并加之自己的理解和阐述 机器学习实战系列博文 机器学习实战--k近邻算法改进约会网站的配对效果 机器学习实战--决策树的构建.画图与 ...

  7. 机器学习实战之Logistic回归(四)从疝气病症状预测病马的死亡率(含数据集)

    Logistic回归(三)从疝气病症状预测病马的死亡率(含数据集) 准备 准备数据:处理数据中的缺失值 训练算法:使用优化算法,找到最佳系数 测试算法:用Logistic回归进行分类 转载请注明作者和 ...

  8. Python3《机器学习实战》学习笔记(七):Logistic回归实战篇之预测病马死亡率

    转载请注明作者和出处: http://blog.csdn.net/c406495762 机器学习知乎专栏:https://zhuanlan.zhihu.com/ml-jack CSDN博客专栏:htt ...

  9. 基于逻辑回归的鸢尾花分类预测

    基于逻辑回归的分类预测 1 逻辑回归的介绍和应用 1.1 逻辑回归的介绍 1.2 逻辑回归的应用 2 学习目标 3 代码流程 4 算法实战 4.1 Demo实践 Step1:库函数导入 Step2:模 ...

最新文章

  1. Python中 sys.argv[]的用法简明解释
  2. SVN 问题解决之 The XML response contains invalid XML
  3. EOJ Monthly 2019.2 E 中位数 (二分+中位数+dag上dp)
  4. android zip压缩
  5. C++基础教程之数据结构
  6. 如何去学习linux
  7. DG - 物理Standby角色转换
  8. 学写网站(二)前端配置之glup
  9. if else终结者——策略模式
  10. 微信H5开发缓存问题解决
  11. JavaScript之显示和隐藏图片
  12. golang 数学函数
  13. 初中计算机实践研究计划,项目式教学法在初中信息技术课堂教学中的研究与实践...
  14. 各大日语学习网站整理
  15. kpi权重设置原则_HR之家,_绩效考核指标设定的十大原则
  16. excel打开提示不适合这台计算机,《win10提示excle安装》 win10 :Excel文件打不开、显示“此应用无法在你的电脑上运行”怎么办?...
  17. 信息加密与消息摘要——古典密码
  18. LeetCode 0592. 分数加减运算:手把手分步のC++讲解
  19. 开发数字时钟桌面小控件
  20. 大数据在物流行业的应用

热门文章

  1. 计算机视觉实战之歪头变正脸
  2. 初一下册地理学霸笔记_黄冈学霸笔记:数学八年级上quot;三角形quot;
  3. 地球引擎初级教程——Google Earth Engine计算最简单的多边形面积和周长计算
  4. 华为的操作系统鸿蒙多久出来,华为OS操作系统“鸿蒙”什么时候上市?华为OS操作系统有什么用处?...
  5. 共筑鲲鹏计算产业生态!麒麟信安亮相第三届国际先进技术展
  6. harmonyos开发者纪念版,喜马拉雅基于Harmony OS开发者平至今已交付3个软件版本
  7. android 调用数字键盘,微信调用支付数字键盘功能实现方法(Android)
  8. 利用FFmpeg在macOS中批量转换视频格式
  9. Camera HAL 参数传递流程 ---- 以ANDROID_CONTROL_AE_EXPOSURE_COMPENSATION为例追踪
  10. C语言:输入某年某月某日,判断这一天是这一年的第几天? 以3月5日为例,应该先把前两个月的加起来,然后再加上5天即本年的第几天,特殊情况,闰年且输入月份大于3时需考虑多加一天。