一、函数的选择

基于Logistics回归的目的,我们可以知道,通过该类分类器的输入,进而来判断出类别来,本次学习主要考虑两类,也就是0和1,通过分类器的返回的值,大于0.5分为1,小于0.5分为0

要明确分类0或者是1,那么Sigmoid函数,即  f(x) = 1/(e^x+1)  就是一个不错的函数,因为Sigmoid函数在x输入时,f(x)的值可以在x变化很小时实现从0到1的跃迁,如下图所示

二、基于最优化方法的最佳回归系数

     假设Sigmoid函数的输入是z,如果考虑向量的方法 z=vx ,其中向量x是我们需要输入进去的数据,v的转置向量w就是我们需要求的最佳系数,求出w的一个办法就是梯度上升法。

   2.1梯度上升法

如果梯度记为∇,则函数f(x,y)的梯度由 下式表示:

展示梯度上升的具体一个数学图像:

可以看到,梯度算子总是指向函数值增长 最快的方向。这里只是提到了方向,而没有提及移动量的大小,所以将移动量的大小假设为步长记作α(步长:步长决定了在梯度下降迭代过程中每一步沿梯度负方向前进的长度),用向量来表示的话就是,梯度上升算法的迭代公式如下:

w = w + ∇f(x)

       2.2 训练算法:使用梯度上升找到最佳参数

设置一批数据集,这一批数据集假设有100个数据样本,每个样本有两个数值型特征:X1和X2,所以我们在输入的数据里的前两列就是X1和X2,第三个数据对应的数据类别标签。即我们输入的数据是一个100X3的矩阵。

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]))  # 添加标签fr.close()  # 关闭文件return dataMat, labelMat  # 返回

用loadDataSet函数将数据集的X1和X2读入到dataMat,将数据类别标签读入到labelMat

def sigmoid(inX):  #梯度上升矢量化return 1.0 / (1 + np.exp(-inX))

Sigmoid函数将梯度上升向量化

def gradAscent(dataMatIn, classLabels):  #前面是数据,后面是标签dataMatrix = np.mat(dataMatIn)  # 转换成numpy的matlabelMat = np.mat(classLabels).transpose()  # 转换成numpy的mat,并进行转置m, n = np.shape(dataMatrix)  # 返回dataMatrix的大小。m为行数,n为列数。alpha = 0.001  # 移动步长,也就是学习速率,控制更新的幅度。maxCycles = 500  # 最大迭代次数weights = np.ones((n, 1)) # 生产一个长为n,且全是1的矩阵for k in range(maxCycles):h = sigmoid(dataMatrix * weights)  # 梯度上升矢量化公式 返回了一个列向量error = labelMat - h  #同为矩阵的计算weights = weights + alpha * dataMatrix.transpose() * errorreturn weights.getA()  # 将矩阵转换为数组,返回权重数组 即解出回归系数

主要的回归系数的计算在gradAscent函数中,alpha为向目标移动的步长,maxCycles是最大迭代次数,error是计算差值,用来调整回归系数的方向,在经历for循环的500次循环之后,最后得出一组回归系数。

通过上面的gradAscent函数可以解出一组回归系数,它确定了不同类别数据之间的分隔线,所以需要绘制一条分隔线来帮助我们更加好的去理解,代码如下:

def plotDataSet():dataMat, labelMat = loadDataSet()  # 加载数据集dataArr = np.array(dataMat)  # 转换成numpy的array数组n = np.shape(dataMat)[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])  # 1为正样本else:xcord2.append(dataArr[i, 1])ycord2.append(dataArr[i, 2])  # 0为负样本fig = plt.figure()ax = fig.add_subplot(111)  # 添加subplotax.scatter(xcord1, ycord1, s=20, c='red', marker='s', alpha=.5)  # 绘制正样本ax.scatter(xcord2, ycord2, s=20, c='green', alpha=.5)  # 绘制负样本plt.title('DataSet')  # 绘制titleplt.xlabel('X1')plt.ylabel('X2')  # 绘制labelplt.show()  # 显示
def plotBestFit(weights):dataMat, labelMat = loadDataSet()  # 加载数据集dataArr = np.array(dataMat)  # 转换成numpy的array数组n = np.shape(dataMat)[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])  # 1为正样本else:xcord2.append(dataArr[i, 1])ycord2.append(dataArr[i, 2])  # 0为负样本fig = plt.figure()ax = fig.add_subplot(111)  # 添加subplotax.scatter(xcord1, ycord1, s=20, c='red', marker='s', alpha=.5)  # 绘制正样本ax.scatter(xcord2, ycord2, s=20, c='green', alpha=.5)  # 绘制负样本x = np.arange(-3.0, 3.0, 0.1)y = (-weights[0] - weights[1] * x) / weights[2]   #即X2,因为有公式 0 = w0 + w1x1 + w2x2ax.plot(x, y)plt.title('BestFit')  # 绘制titleplt.xlabel('X1')plt.ylabel('X2')  # 绘制labelplt.show()

这里y其实就是X2,通过公式 0 = w0 + w1x1 + w2x2 来计算的

首先将传输进来的数据集进行分类,分为正样本和负样本,将两个样本的点绘制出来,绘制图如下:

     2.3随机梯度上升算法

上面讲到的梯度上升算法,如果maxCycle非常大,那么计算的h和weights就会很多次,要进行100*3次乘法运算和100*2次加法运算,所以这样的计算量非常大,于是我们想通过一个样本点来更新回归系数,而不是通过全部的数据集,这样就可以有效减少计算量了,这种方法就叫做随机梯度上升算法。        

        代码如下:

def stocGradAscent1(dataMatrix, classLabels, numIter=150):m, n = np.shape(dataMatrix)  # 返回dataMatrix的大小。m为行数,n为列数。weights = np.ones(n)  # 参数初始化                                      #存储每次更新的回归系数for j in range(numIter):dataIndex = list(range(m))for i in range(m):alpha = 4 / (1.0 + j + i) + 0.01  # 降低alpha的大小,每次减小1/(j+i)。randIndex = int(random.uniform(0, len(dataIndex)))  # 随机选取样本h = sigmoid(sum(dataMatrix[randIndex] * weights))  # 选择随机选取的一个样本,计算herror = classLabels[randIndex] - h  # 计算误差weights = weights + alpha * error * dataMatrix[randIndex]  # 更新回归系数del (dataIndex[randIndex])  # 删除已经使用的样本return weights  # 返回

对比之前的算法,改进之后的算法将步长alpha不断更新,但alpha永远不会到0,必须这样做的原因是为了保证在多次迭代之后新数据仍然具有一定的影响

在随机梯度上升算法中,随机取150个数,用这150个数来更新回归系数,起到一个代表作用,再一次运行全代码,可以得到下面所示图像:

 三、 从疝气病症状预测病马的死亡率

    1、数据准备:数据中的缺失值

数据中的缺失值是个非常棘手的问题,有很多文献都致力于解决这个问题。那么,数据缺失 究竟带来了什么问题?假设有100个样本和20个特征,这些数据都是机器收集回来的。若机器上 的某个传感器损坏导致一个特征无效时该怎么办?此时是否要扔掉整个数据?这种情况下,另外 19个特征怎么办?它们是否还可用?答案是肯定的。因为有时候数据相当昂贵,扔掉和重新获取 都是不可取的,所以必须采用一些方法来解决这个问题。

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

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

3、忽略有缺失值的样本;

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

5、使用另外的机器学习算法预测缺失值。

预处理数据做两件事:

1、如果测试集中一条数据的特征值已经确实,那么我们选择实数0来替换所有缺失值,因为本文使用Logistic回归。因此这样做不会影响回归系数的值。sigmoid(0)=0.5,即它对结果的预测不具有任何倾向性。这里的缺失值用0来代替,这样不仅适合Logistics回归,而且在更新回归系数的时候不会对回归系数参数影响,即如果dataMatix的某个特征值为0的话,那么weights = weights

求回归系数公式为:

weights = weights + alpha * error * dataMatix[randIndex]

2、如果测试集中一条数据的类别标签已经缺失,那么我们将该类别数据丢弃,因为类别标签与特征不同,很难确定采用某个合适的值来替换

 2、利用python构建分类器

代码如下:

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(len(currLine) - 1):lineArr.append(float(currLine[i]))trainingSet.append(lineArr)trainingLabels.append(float(currLine[-1]))trainWeights = stocGradAscent1(np.array(trainingSet), trainingLabels, 500)  # 使用改进的随即上升梯度训练''' 以上的代码部分目的是得出trainWeghts'''errorCount = 0numTestVec = 0.0for line in frTest.readlines():numTestVec += 1.0currLine = line.strip().split('\t') # 删除首尾的空白,并且以\t分隔开来lineArr = []for i in range(len(currLine) - 1):lineArr.append(float(currLine[i])) # 记录一组数据的X1和X2if int(classifyVector(np.array(lineArr), trainWeights)) != int(currLine[-1]): # 判断!分类结果是否与数据集的标签类别相等errorCount += 1errorRate = (float(errorCount) / numTestVec) * 100  # 错误率计算print("测试集错误率为: %.2f%%" % errorRate)

此代码用来判断一个

Zzz机器学习实战第五章:Logistics回归相关推荐

  1. 机器学习实战(五)——Logistic 回归

    文章目录 Logistic 回归 5.2 基于最优化方法的最佳回归系数确定 5.2.1 梯度上升法 5.3 python实战 5.3.1 查看数据集分布情况 5.3.2 训练 5.3.3 绘制决策边界 ...

  2. 吴恩达机器学习(第五章)——Logistic回归

    第五章-Logistic回归 文章目录 第五章-Logistic回归 分类 假设陈述 决策边界 代价函数 代价函数的定义 简化代价函数与梯度下降 公式的推导 高级优化 多元分类:一对多 分类 在分类问 ...

  3. 机器学习实战笔记(Python实现)-04-Logistic回归

    转自:机器学习实战笔记(Python实现)-04-Logistic回归 转自:简单多元线性回归(梯度下降算法与矩阵法) 转自:人工神经网络(从原理到代码) Step 01 感知器 梯度下降

  4. 学习笔记----周志华《机器学习》第五章(神经网络)(二)

    周志华<机器学习>第五章(神经网络)的学习笔记上篇连接在这里:<上篇>.上篇讲到了神经网络.常用的激活函数.感知机和多层前馈神经网络.局部极小和全局最小,今天继续补上昨天落下得 ...

  5. 机器学习实战第15章pegasos算法原理剖析以及伪代码和算法的对应关系

    Pegasos原文是: http://ttic.uchicago.edu/~nati/Publications/PegasosMPB.pdf 还是挺长的,论文结构是: 第1~6页:主要原理 第7~15 ...

  6. 机器学习实战(四)逻辑回归LR(Logistic Regression)

    目录 0. 前言 1. Sigmoid 函数 2. 梯度上升与梯度下降 3. 梯度下降法(Gradient descent) 4. 梯度上升法(Gradient ascent) 5. 梯度下降/上升法 ...

  7. 机器学习实战:第一章

    根据方教授的建议和要求,在暑假里简单自学<机器学习实战>,记录学习过程和代码. 记 第一章是对机器学习的一些概念介绍,定义了若干专业术语.列举了很多机器学习的各类实例.给出了一个" ...

  8. 【技术君啃书之旅】web安全之机器学习入门 第五章笔记

    这章零零散散花费了好久(吐槽毕业典礼真的是忙到吐血啊!!!!),感觉兜哥跳跃的有点厉害,直接进入了算法与场景结合,没有什么关于K近邻算法的数学介绍,而我作为一个机器学习的小萌新,只能先去搜索一些关于K ...

  9. 学习笔记----周志华《机器学习》第五章(神经网络)(一)

    周志华的<机器学习>算作一本入门的宝书.本文是对周志华的机器学习第五章神经网络的学习笔记.在第五章主要涉及的内容:神经网络.常见激活函数.感知机.多层前馈神经网络 .反向传播算法(BP算法 ...

最新文章

  1. NLP深度学习:近期趋势概述
  2. python流程控制语句-python学习 流程控制语句详解
  3. Py之minepy:minepy的简介、安装、使用方法之详细攻略
  4. 如何用行为树开发游戏AI以及任务系统?
  5. 【JQuery】JQuery学习笔记
  6. vue2.0 watch的注意事项
  7. python机制_python 加载模块机制
  8. 大数据技术之kafka (第 3 章 Kafka 架构深入) Zookeeper 在 Kafka 中的作用
  9. C#操作类----XmlHelper
  10. php找不到库,64位系统下编译PHP找不到库文件问题 | 学步园
  11. 物联网卡在建筑行业的应用结果
  12. Ubuntu1404+Django1.9+Apache2.4部署配置1安装
  13. php 有request,php实现httpRequest的方法
  14. topjui/easyui 表格分页简单实例
  15. 供应链运作参考模型(SCOR):一种用于改善供应链管理的模型
  16. 电脑前面耳机插孔没声音,后面有声音
  17. mdx词典包_不会用医学词典?停姐手把手教你啊(内附海量医学词典词库资源下载)...
  18. 水逆期自我救赎:MacBook pro进水
  19. Facebook新研究:根据照片自动生成卡通头像
  20. 洛谷 P1919 【模板】A*B Problem升级版(FFT快速傅里叶)

热门文章

  1. Java集合中元素删除
  2. 在ubuntu中使用命令行工具sqlcmd连接sql server数据库
  3. 胡哥最新超级强片《鸟笼山剿匪记》完整版
  4. 【CSS】相邻兄弟选择器
  5. ps122260玉兔福满中秋中秋节ps海报
  6. 想归隐啦——与自然生活为伴
  7. 大数据未来七大发展趋势
  8. Linux自学笔记------Day02 文件I/O
  9. power BI学习笔记-DAX函数
  10. 【电商AI工具一期】AI引领电商新风潮:20款AI电子商务工具盘点,让你实现财富增长!