1.基于Logistic回归和Sigmoid函数的分类

2.基于最优化方法的最佳回归系数确定

2.1 梯度上升法

参考:机器学习——梯度下降算法

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

Logistic回归梯度上升优化算法

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])]) #加上第0维特征值
labelMat.append(int(lineArr[2]))
return dataMat,labelMat #返回数据矩阵和标签向量 def sigmoid(inX):
return 1.0/(1+exp(-inX)) def gradAscent(dataMatIn, classLabels): #Logistic回归梯度上升优化算法
dataMatrix = mat(dataMatIn) #由列表转换成NumPy矩阵数据类型,dataMatrix是一个100×3的矩阵
labelMat = mat(classLabels).transpose() #由列表转换成NumPy矩阵数据类型,labelMat是一个100×1的矩阵
m,n = shape(dataMatrix) #shape函数取得矩阵的行数和列数,m=100,n=3
alpha = 0.001 #向目标移动的步长
maxCycles = 500 #迭代次数
weights = ones((n,1)) #3行1列的矩阵,这个矩阵为最佳的回归系数,和原来的100×3相乘,可以得到100×1的结果
for k in range(maxCycles):
h = sigmoid(dataMatrix*weights) #矩阵相乘,得到100×1的矩阵,即把dataMat的每一行的所有元素相加
error = (labelMat - h) #求出和目标向量之间的误差
#梯度下降算法
weights = weights + alpha * dataMatrix.transpose()* error #3×100的矩阵乘以100×1的矩阵,weights是梯度算子,总是指向函数值增长最快的方向
return weights #返回一组回归系数,确定了不同类别数据之间的分割线
    dataMat,labelMat = loadDataSet()
print gradAscent(dataMat,labelMat) #输出回归系数
[[ 4.12414349]
[ 0.48007329]
[-0.6168482 ]]

2.3 分析数据:画出决策边界

 画出数据集和Logistic回归最佳拟合直线的函数

def plotBestFit(wei):			#画出数据集和Logistic回归最佳拟合直线的函数
import matplotlib.pyplot as plt
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)
#最佳拟合曲线,这里设w0x0+w1x1+w2x2=0,因为0是两个分类(0和1)的分界处(Sigmoid函数),且此时x0=1
#图中y表示x2,x表示x1
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1'); plt.ylabel('X2');
plt.show()

    dataMat,labelMat = loadDataSet()
#print dataMat
#print labelMat
#print gradAscent(dataMat,labelMat) #输出回归系数
plotBestFit(gradAscent(dataMat,labelMat))

2.4 训练算法:随梯度上升

def stocGradAscent0(dataMatrix, classLabels):	#随机梯度上升算法
m,n = shape(dataMatrix)
alpha = 0.01
weights = ones(n) #3行1列的矩阵,初始最佳回归系数都为1,
for i in range(m):
h = sigmoid(sum(dataMatrix[i]*weights)) #计算出是数值,而不是向量,dataMatrix[100×3]中取得[1×3],乘以[3×1],得到数值
error = classLabels[i] - h
weights = weights + alpha * error * dataMatrix[i]
return weights def plotBestFit(weights): #画出数据集和Logistic回归最佳拟合直线的函数
import matplotlib.pyplot as plt
#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)
#最佳拟合曲线,这里设w0x0+w1x1+w2x2=0,因为0是两个分类(0和1)的分界处(Sigmoid函数),且此时x0=1
#图中y表示x2,x表示x1
y = (-weights[0]-weights[1]*x)/weights[2]
ax.plot(x, y)
plt.xlabel('X1'); plt.ylabel('X2');
plt.show()
    dataMat,labelMat = loadDataSet()
#print dataMat
#print labelMat
#print gradAscent(dataMat,labelMat) #输出回归系数
#plotBestFit(gradAscent(dataMat,labelMat))
plotBestFit(stocGradAscent0(array(dataMat),labelMat))

改进的随机梯度上升算法

def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = shape(dataMatrix)
weights = ones(n) #初始化回归系数
for j in range(numIter): #从0到149开始循环
dataIndex = range(m)
for i in range(m): #从0到99开始循环
alpha = 4/(1.0+j+i)+0.0001 #步进alpha的值逐渐减小,j=0-150,i=1-100,使得收敛的速度加快
randIndex = int(random.uniform(0,len(dataIndex))) #样本随机选择0-99中的一个数计算回归系数,减小周期性波动的现象
h = sigmoid(sum(dataMatrix[randIndex]*weights))
error = classLabels[randIndex] - h
weights = weights + alpha * error * dataMatrix[randIndex]
del(dataIndex[randIndex])
return weights

示例:从疝气病症预测病马的死亡率

 1.准备数据:处理数据中的缺失值

2.测试算法:使用Logistic回归进行分类

def classifyVector(inX, weights):	#输入回归系数和特征向量,计算出Sigmoid值,如果大于0.5则返回1,否则返回0
prob = sigmoid(sum(inX*weights))
if prob > 0.5: return 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): #把0-20个病症加到列表中
lineArr.append(float(currLine[i]))
trainingSet.append(lineArr) #把得到的每个列表加到训练集合中
trainingLabels.append(float(currLine[21])) #把标签加到训练标签中
trainWeights = stocGradAscent1(array(trainingSet), trainingLabels, 1000) #使用改进的随机梯度上升算法,递归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): #把0-20个病症加到列表中,作为分类器的输入
lineArr.append(float(currLine[i]))
if int(classifyVector(array(lineArr), trainWeights))!= int(currLine[21]): #计算分类错误的次数,currLine[21]表示真正死亡与否
errorCount += 1
errorRate = (float(errorCount)/numTestVec) #计算错误率
print "the error rate of this test is: %f" % errorRate
return errorRate def multiTest(): #调用colicTest()十次并求结果的平均值
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))

机器学习——Logistic回归的更多相关文章

  1. 机器学习——Logistic回归

    参考<机器学习实战> 利用Logistic回归进行分类的主要思想: 根据现有数据对分类边界线建立回归公式,以此进行分类. 分类借助的Sigmoid函数: Sigmoid函数图: Sigmo ...

  2. 机器学习——logistic回归,鸢尾花数据集预测,数据可视化

    0.鸢尾花数据集 鸢尾花数据集作为入门经典数据集.Iris数据集是常用的分类实验数据集,由Fisher, 1936收集整理.Iris也称鸢尾花卉数据集,是一类多重变量分析的数据集.数据集包含150个数 ...

  3. 机器学习--Logistic回归

    logistic回归 很多时候我们需要基于一些样本数据去预测某个事件是否发生,如预测某事件成功与失败,某人当选总统是否成功等. 这个时候我们希望得到的结果是 bool型的,即 true or fals ...

  4. coursera机器学习-logistic回归,正则化

    #对coursera上Andrew Ng老师开的机器学习课程的笔记和心得: #注:此笔记是我自己认为本节课里比较重要.难理解或容易忘记的内容并做了些补充,并非是课堂详细笔记和要点: #标记为<补 ...

  5. 机器学习 Logistic 回归

    Logistic regression 适用于二分分类的算法,用于估计某事物的可能性. logistic分布表达式 $ F(x) = P(X<=x)=\frac{1}{1+e^{\frac{-( ...

  6. 机器学习-- Logistic回归 Logistic Regression

    转载自:http://blog.csdn.net/linuxcumt/article/details/8572746 1.假设随Tumor Size变化,预测病人的肿瘤是恶性(malignant)还是 ...

  7. 吴恩达-机器学习+Logistic回归分类方案

  8. 机器学习简易入门(四)- logistic回归

    摘要:使用logistic回归来预测某个人的入学申请是否会被接受 声明:(本文的内容非原创,但经过本人翻译和总结而来,转载请注明出处) 本文内容来源:https://www.dataquest.io/ ...

  9. 机器学习(4)之Logistic回归

    机器学习(4)之Logistic回归 1. 算法推导 与之前学过的梯度下降等不同,Logistic回归是一类分类问题,而前者是回归问题.回归问题中,尝试预测的变量y是连续的变量,而在分类问题中,y是一 ...

随机推荐

  1. 从Sql Server表中随机获取一些记录最简单的方法

    * FROM test ORDER BY NewID() 注意,使用时,请将‘test’改为真实的表名.

  2. MySQL:procedure, function, cursor,handler

    Procedure & Function Procedure 语法: CREATE [DEFINER = { user | CURRENT_USER }] PROCEDURE sp_name ...

  3. 【推荐】CentOS安装Subversion-1.8.11+HTTP协议支持配置

    注:以下所有操作均在CentOS 6.5 x86_64位系统下完成. 我们需要搭建一个自己的SVN服务器. 此外,搭建好的SVN服务器除了需要支持svn协议外,最好还需要支持HTTP协议和HTTPS协 ...

  4. mysql 基础 增删改查语句

    MySQL:众多关系型数据库中的一种仓库 --数据库箱子 --表数据库:进入mysql 命令行: mysql -uroot -p查看所有数据库: show databases;创建数据库: creat ...

  5. 从BSP模型到Apache Hama

    一.什么是BSP模型 概述 BSP(Bulk Synchronous Parallel,整体同步并行计算模型)是一种并行计算模型,由英国计算机科学家Viliant在上世纪80年代提出.Google发布 ...

  6. c# float显示时保存一位小数

    UI显示时候,需求保留一位小数 //保留一位小数 参考: http://blog.sina.com.cn/s/blog_620531730100kfz6.html float ff = 1.01f; ...

  7. react自学笔记总结不间断更新

    React React 是由Facfbook维护的一套框架,并且引用到instagram React只是我们熟悉MVC框中的V层,只是视图层面的一个框架,只有俩个半api(createClass,cr ...

  8. PAT 1044. 火星数字(20)

    火星人是以13进制计数的: 地球人的0被火星人称为tret. 地球人数字1到12的火星文分别为:jan, feb, mar, apr, may, jun, jly, aug, sep, oct, no ...

  9. CPU中断和轮询

    轮询顾名思义,CPU不停的询问,CPU很忙. 中断和轮询不同,是硬件上的,就像一个开关被按下了,没有什么东西在不停的询问开关有没有被按下,开关只是被按下了,就通电了,通电了就会发声一些事情. 可以看看 ...

  10. [LeetCode] Serialize and Deserialize Binary Tree 二叉树的序列化和去序列化

    Serialization is the process of converting a data structure or object into a sequence of bits so tha ...