注释:Ng的视频有完整的推到步骤,不过理论和实践还是有很大差别的,代码实现还得完成

1.Logistic回归理论

  http://www.cnblogs.com/wjy-lulu/p/7759515.html,Ng的推导很完美,看懂就可以了,没必要自己推导一遍,因为几天不用就忘记 了。

2.代码实现

  2.1全局梯度上升

    每次训练针对整体,依据整体去找最值。

    好处:容易过滤局部极值,找到真正的全局极值。

    坏处:整体数据太多,花费时间太久,而且新来的样本必须重新训练。

    推倒公式:见博文刚开始的链接,Ng大神的全部推导及证明!

 def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()#分割空格
#改变存储data:[[a,b],[c,d]]/
# labels:[1,0,0,1...]
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append([int(lineArr[2])])
return dataMat, labelMat
def sigmoid(intX):
return 1.0/(1.0+np.exp(-intX))
#全局梯度上升法
def gradAscent(dataMatIn,classLabels):
dataMatrix = np.mat(dataMatIn)
labelsMat = np.mat(classLabels)
m, n = dataMatrix.shape
alpha = 0.001
maxCycle = 200
weight = np.ones((n,1))#这里为了简单写,把b也当作一个w了
for k in range(maxCycle):
h = sigmoid(dataMatrix*weight)
error = labelsMat - np.mat(h)
weight = weight + alpha*dataMatrix.transpose()*error
return weight

  2.1简单分类可视化

    利用matplotlib画出简单分类的决策边界

    注意:这里plot转化为list之后绘制的,看网上说可以直接用matrix,但是我运行出错。

 def plotBestFit(weight):
dataMat, labelMat = loadDataSet()
dataArr = np.array(dataMat)#转化为数组
n = dataArr.shape[0]
xcode1=[];ycode1=[]
xcode2=[];ycode2=[]
for i in range(n):
if int(labelMat[i][0])==1:
xcode1.append(dataArr[i,1])
ycode1.append(dataArr[i,2])
else:
xcode2.append(dataArr[i,1])
ycode2.append(dataArr[i,2])
fig = plt.figure("data_x_y")
ax = fig.add_subplot(111)
ax.scatter(xcode1,ycode1,s=30,c='r',marker='s')
ax.scatter(xcode2,ycode2,s=30,c='g')
x = np.mat(np.arange(-3.0,3.0,0.1))
y = (-weight[0]-weight[1]*x)/weight[2]
ax.plot(x.tolist()[0],y.tolist()[0])
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()

  2.3局部随机梯度上升法及改进

    局部随机梯度:和全局相对,利用单个样本更新W,同时又是利用正太分布的规律去随机选择样本的次序。

    好处:‘局部’训练效率高,而且新的样本可以直接添加不用重新训练,‘随机’解决了样本规律性的波动,树上有图解。

    坏处:可能得到局部极值。

 #局部梯度上升法-老版本
def stoGradAscent0(dataMatrix,classLabels):
m,n = dataMatrix.shape
alpha = 0.01
weights = np.ones(n)#最好别写0,因为0的拟合速度很慢
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights))
error = classLabels - h
weights = weights +alpha* error* dataMatrix[i]
return weights
#随机梯度上升法-新版本
def stoGradAscent1(dataMatraix,classLabels,numIter=150):
#alpha不断改变
#选取的样本随机改变
m,n = dataMatraix.shape
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#随着迭代次数和样本的训练次数的增加而减小
randIndex = int(np.random.uniform(0,len(dataIndex)))#随机样本下标
h = sigmoid(sum(dataMatraix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights +alpha*error*dataMatraix[randIndex]
del(dataIndex[randIndex])#执行之后删除,避免重复执行
return weights

  2.4实际应用

    和前面朴素贝叶斯都差不多,预处理数据-->>训练-->>测试

 分类函数
def classifyVector(inX,weight):
prob = sigmoid(sum(inX*weight))
if prob>0.5: return 1.0
return 0.0
def colicTest():
frTrain = open('horseColicTraining.txt')
frtest = open('horseColicTest.txt')
trainingSet = []
trainingLabel = []
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)
trainingLabel.append(float(currLine[-1]))
#改进之后的随机梯度下降法--->>>局部算法=在线学习
trainWeight = stoGradAscent1(np.array(trainingSet),trainingLabel,500)
errorCount = 0.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(np.array(lineArr),trainWeight)) != int(currLine[21]):
errorCount+=1
errorRate = (1.0*errorCount)/(1.0*numTestVec)
print('the error Rate is : ',errorRate,'\n')
return errorRate
def multiTest():
numTest = 10;errorSum = 0.0
for k in range(numTest):
errorSum += colicTest()
print('error Rate Average is : ',(errorSum/numTest))

  2.5总程序

 import numpy as np
import matplotlib.pyplot as plt def loadDataSet():
dataMat = []
labelMat = []
fr = open('testSet.txt')
for line in fr.readlines():
lineArr = line.strip().split()#分割空格
#改变存储data:[[a,b],[c,d]]/
# labels:[1,0,0,1...]
dataMat.append([1.0,float(lineArr[0]),float(lineArr[1])])
labelMat.append([int(lineArr[2])])
return dataMat, labelMat
def sigmoid(intX):
return 1.0/(1.0+np.exp(-intX))
#全局梯度上升法
def gradAscent(dataMatIn,classLabels):
dataMatrix = np.mat(dataMatIn)
labelsMat = np.mat(classLabels)
m, n = dataMatrix.shape
alpha = 0.001
maxCycle = 200
weight = np.ones((n,1))#这里为了简单写,把b也当作一个w了
for k in range(maxCycle):
h = sigmoid(dataMatrix*weight)
error = labelsMat - np.mat(h)
weight = weight + alpha*dataMatrix.transpose()*error
return weight def plotBestFit(weight):
dataMat, labelMat = loadDataSet()
dataArr = np.array(dataMat)#转化为数组
n = dataArr.shape[0]
xcode1=[];ycode1=[]
xcode2=[];ycode2=[]
for i in range(n):
if int(labelMat[i][0])==1:
xcode1.append(dataArr[i,1])
ycode1.append(dataArr[i,2])
else:
xcode2.append(dataArr[i,1])
ycode2.append(dataArr[i,2])
fig = plt.figure("data_x_y")
ax = fig.add_subplot(111)
ax.scatter(xcode1,ycode1,s=30,c='r',marker='s')
ax.scatter(xcode2,ycode2,s=30,c='g')
x = np.mat(np.arange(-3.0,3.0,0.1))
y = (-weight[0]-weight[1]*x)/weight[2]
ax.plot(x.tolist()[0],y.tolist()[0])
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
#局部梯度上升法-老版本
def stoGradAscent0(dataMatrix,classLabels):
m,n = dataMatrix.shape
alpha = 0.01
weights = np.ones(n)#最好别写0,因为0的拟合速度很慢
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights))
error = classLabels - h
weights = weights +alpha* error* dataMatrix[i]
return weights
#随机梯度上升法-新版本
def stoGradAscent1(dataMatraix,classLabels,numIter=150):
#alpha不断改变
#选取的样本随机改变
m,n = dataMatraix.shape
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#随着迭代次数和样本的训练次数的增加而减小
randIndex = int(np.random.uniform(0,len(dataIndex)))#随机样本下标
h = sigmoid(sum(dataMatraix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights +alpha*error*dataMatraix[randIndex]
del(dataIndex[randIndex])#执行之后删除,避免重复执行
return weights
#分类函数
def classifyVector(inX,weight):
prob = sigmoid(sum(inX*weight))
if prob>0.5: return 1.0
return 0.0
def colicTest():
frTrain = open('horseColicTraining.txt')
frtest = open('horseColicTest.txt')
trainingSet = []
trainingLabel = []
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)
trainingLabel.append(float(currLine[-1]))
#改进之后的随机梯度下降法--->>>局部算法=在线学习
trainWeight = stoGradAscent1(np.array(trainingSet),trainingLabel,500)
errorCount = 0.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(np.array(lineArr),trainWeight)) != int(currLine[21]):
errorCount+=1
errorRate = (1.0*errorCount)/(1.0*numTestVec)
print('the error Rate is : ',errorRate,'\n')
return errorRate
def multiTest():
numTest = 10;errorSum = 0.0
for k in range(numTest):
errorSum += colicTest()
print('error Rate Average is : ',(errorSum/numTest))

《机器学习实战》Logistic回归的更多相关文章

  1. 神经网络、logistic回归等分类算法简单实现

    最近在github上看到一个很有趣的项目,通过文本训练可以让计算机写出特定风格的文章,有人就专门写了一个小项目生成汪峰风格的歌词.看完后有一些自己的小想法,也想做一个玩儿一玩儿.用到的原理是深度学习里 ...

  2. 机器学习——Logistic回归

    1.基于Logistic回归和Sigmoid函数的分类 2.基于最优化方法的最佳回归系数确定 2.1 梯度上升法 参考:机器学习--梯度下降算法 2.2 训练算法:使用梯度上升找到最佳参数 Logis ...

  3. logistic回归

    logistic回归 回归就是对已知公式的未知参数进行估计.比如已知公式是$y = a*x + b$,未知参数是a和b,利用多真实的(x,y)训练数据对a和b的取值去自动估计.估计的方法是在给定训练样 ...

  4. Logistic回归 python实现

    Logistic回归 算法优缺点: 1.计算代价不高,易于理解和实现2.容易欠拟合,分类精度可能不高3.适用数据类型:数值型和标称型 算法思想: 其实就我的理解来说,logistic回归实际上就是加了 ...

  5. Logistic回归的使用

    Logistic回归的使用和缺失值的处理 从疝气病预测病马的死亡率 数据集: UCI上的数据,368个样本,28个特征 测试方法: 交叉测试 实现细节: 1.数据中因为存在缺失值所以要进行预处理,这点 ...

  6. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  7. SPSS数据分析—配对Logistic回归模型

    Lofistic回归模型也可以用于配对资料,但是其分析方法和操作方法均与之前介绍的不同,具体表现 在以下几个方面1.每个配对组共有同一个回归参数,也就是说协变量在不同配对组中的作用相同2.常数项随着配 ...

  8. SPSS数据分析—多分类Logistic回归模型

    前面我们说过二分类Logistic回归模型,但分类变量并不只是二分类一种,还有多分类,本次我们介绍当因变量为多分类时的Logistic回归模型. 多分类Logistic回归模型又分为有序多分类Logi ...

  9. SPSS数据分析—二分类Logistic回归模型

    对于分类变量,我们知道通常使用卡方检验,但卡方检验仅能分析因素的作用,无法继续分析其作用大小和方向,并且当因素水平过多时,单元格被划分的越来越细,频数有可能为0,导致结果不准确,最重要的是卡方检验不能 ...

  10. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

随机推荐

  1. Zookeeper watcher机制

    一.watcher机制 1.针对每个节点的操作,都会有一个监督者-> watcher 2.当监控的某个对象(znode)发生了变化,则触发watcher事件 3.zk中的watcher是一次性的 ...

  2. 基于MVC4+EasyUI的Web开发框架形成之旅(4)--附件上传组件uploadify的使用

    大概一年前,我还在用Asp.NET开发一些行业管理系统的时候,就曾经使用这个组件作为文件的上传操作,在随笔<Web开发中的文件上传组件uploadify的使用>中可以看到,Asp.NET中 ...

  3. [转]Aroon Indicator

    Aroon Indicator Trend Oscillator Description The Aroon indicator, developed by Tushar Chande, indica ...

  4. 阅读<<HDMI 1.4/2.0 Transmitter Subsystem V2.0>>笔记

    阅读<<HDMI 1.4/2.0 Transmitter Subsystem V2.0>>笔记 1.Subsystem Block Diagram 2.HDMI TX Subs ...

  5. 基于binlog来分析mysql的行记录修改情况

    https://www.cnblogs.com/xinysu/archive/2017/05/26/6908722.html import pymysqlfrom pymysql.cursors im ...

  6. django 初始化 介绍 生命周期

    安装好django,配置模板,静态文件 # 创建Django工程 django-admin startproject [工程名称] mysite - mysite # 对整个程序进行配置 - init ...

  7. 如何写出健壮的Java代码

    近来在公司写代码,写出的代码发现BUG很多,为了实现一个功能,代码改了又改,影响了工单的效率,也影响个人绩效,因此从网上找了些关于写健壮代码的文章看了看,再加上自己的一些经验总结. 所谓健壮的代码是指 ...

  8. Hiero中的Events机制

    The hiero.core.events module allows you to register method callbacks to respond to events sent by Hi ...

  9. 配置 influxDB 鉴权及 HTTP API 写数据的方法

    本文简要描述如何为 InfluxDB 开启鉴权和配置用户管理权限(安装后默认不需要登录),以及开启鉴权后如何使用 HTTP API 写数据. 创建 InfluxDB 管理员账号创建 admin 帐号密 ...

  10. Java事件监听器的四种实现方式

    自身类作为事件监听器 外部类作为事件监听器 匿名内部类作为事件监听器 内部类作为事件监听器 自身类作为事件监听器: import javax.swing.*; import java.awt.*; i ...