logistic regression model

LR
softmax
classification
Fly

logistic regression model


逻辑回归模型一般指的是二项分类的逻辑回归模型,也是非常经典的模型,它主要的决策函数是,给定数据的情况下,来求取Y属于1或者0的概率。具体的,我们可以做如下表示:

这里, 是输入, 是输出,是模型参数,是内积。

当然这里的决策函数化简后就是众所周知的sigmoid函数。这里我们使用更为通用的hypothesis来表示函数,具体如下:

loss fuction


当我们的假设函数确定后,我们就需要来确定真实值与假设函数值之间能量损失。通俗的讲,我们的目标就是要求假设函数的值无限逼近真实值,是的二者的差值达到最小。从而得到最有的参数

我们可以使用极大似然函数来求解我们的模型参数。0, 1综合起来得到:

求最大似然估计:

求取对数:

得到之后,我们就可以通过梯度下降法或者牛顿法来求得参数,也就是

这里我们假设loss function 为可得到:

使用梯度下降法来求取模型参数:

梯度公式更新参数求解:

这样子就可以求解的模型参数了。当模型参数确定后就可以用来对数据进行分类了。

softmax


多元逻辑回归,顾名思义就是考虑多分类问题的逻辑回归方法。

它的假设函数为:

不过这个看着貌似有点繁琐,在Andrew Ng的文章中给出了一个更直观的表现形式:

对于给定的测试输入,我们想用假设函数针对每一个类别j估算出概率值。也就是说,我们想估计的每一种分类结果出现的概率。因此,我们的假设函数将要输出一个维的向量(向量元素的和为1)来表示这个估计的概率值。 具体地说,我们的假设函数形式如下:

这里需要注意的是这一项对概率分布进行归一化,是的概率之和为1.

具体的代价函数如下:

softmax

以看到,Softmax代价函数与logistic 代价函数在形式上非常类似,只是在Softmax损失函数中对类标记的个可能值进行了累加。注意在Softmax回归中将分类为类别的概率为:

softmax2

基于python的logistic regression代码


代码来自《机器学习实战》这本书

#!/usr/bin/python
# encoding: utf-8 """
@version: 1.0
@author: Fly
@license: Apache Licence
@contact: luyfuyu@gmail.com
@site: https://www.flyuuu.cn
@software: PyCharm
@file: logistic_regression.py """
import numpy as np
import math def load_dataset(filename="./data/lr_testSet.txt"):
data_matrix = []
label_matrix = []
with open(filename, 'r') as f:
for line in f.readlines():
line_list = line.strip().split()
data_matrix.append([1.0, float(line_list[0]), float(line_list[1])])
label_matrix.append(int(line_list[2])) return data_matrix, label_matrix def sigmoid(x):
return 1/(1 + np.exp(-x)) def grandient_ascent(intput_data, class_labels, maxiter=500):
data_matrix = np.mat(intput_data)
label_matrix = np.mat(class_labels).transpose()
m,n = data_matrix.shape
alpha = 0.001
weights = np.ones((n,1))
for k in range(maxiter):
h = sigmoid(data_matrix * weights)
error = label_matrix - h
weights = weights + alpha * data_matrix.transpose() * error return weights def stoc_ascent(intput_data, class_lables):
data_matrix = np.mat(intput_data)
label_matrix = class_lables
m, n = data_matrix.shape
alpha = 0.001
weights = np.ones(n)
for i in range(m):
h = sigmoid(data_matrix[i] * weights)
error = label_matrix[i] - h
weights = weights + alpha * data_matrix[i] * error return weights def plotBestFit(weights):
import matplotlib.pyplot as plt
dataMat, labelMat=load_dataset()
dataArr = np.array(dataMat)
n = np.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 = np.arange(-3.0, 3.0, 0.1)
y = ((- weights[0] - weights[1] * x) / weights[2]).tolist()[0] ax.plot(x, y)
plt.xlabel('X1')
plt.ylabel('X2')
plt.show() def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = np.shape(dataMatrix)
weights = np.ones(n) #initialize to all ones
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.0001 #apha decreases with iteration, does not
randIndex = int(np.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]
del(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('./data/horseColicTraining.txt'); frTest = open('./data/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(np.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(np.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__": filename = "./data/lr_testSet.txt"
x, y = load_dataset(filename)
weights = grandient_ascent(x, y) plotBestFit(weights) multiTest()

logistic regression model的更多相关文章

  1. Stanford机器学习---第三讲. 逻辑回归和过拟合问题的解决 logistic Regression & Regularization

    原文:http://blog.csdn.net/abcjennifer/article/details/7716281 本栏目(Machine learning)包括单参数的线性回归.多参数的线性回归 ...

  2. logistic regression的一些问题,不平衡数据,时间序列,求解惑

    Logistic Regression 1.在有时间序列的特征数据中,怎么运用LR? 不光是LR,其他的模型也是. 有很多基本的模型变形之后,变成带时序的模型.但,个人觉得,这类模型大多不靠谱. 我觉 ...

  3. Machine Learning - 第3周(Logistic Regression、Regularization)

    Logistic regression is a method for classifying data into discrete outcomes. For example, we might u ...

  4. Python实践之(七)逻辑回归(Logistic Regression)

    机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) zouxy09@qq.com http://blog.csdn.net/zouxy09 机器学习算法与Pyth ...

  5. Logistic Regression:银行贷款申请审批实例

    问题定义 这是一个贷款的审批问题,假设你是一个银行的贷款审批员,现在有客户需要一定额度的贷款,他们填写了个人的信息(信息在datas.txt中给出),你需要根据他们的信息,建立一个分类模型,判断是否可 ...

  6. 【机器学习】Octave 实现逻辑回归 Logistic Regression

    ex2data1.txt ex2data2.txt 本次算法的背景是,假如你是一个大学的管理者,你需要根据学生之前的成绩(两门科目)来预测该学生是否能进入该大学. 根据题意,我们不难分辨出这是一种二分 ...

  7. Neural Networks and Deep Learning(week2)Logistic Regression with a Neural Network mindset(实现一个图像识别算法)

    Logistic Regression with a Neural Network mindset You will learn to: Build the general architecture ...

  8. 课程一(Neural Networks and Deep Learning),第二周(Basics of Neural Network programming)—— 4、Logistic Regression with a Neural Network mindset

    Logistic Regression with a Neural Network mindset Welcome to the first (required) programming exerci ...

  9. 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression)

    http://blog.csdn.net/zouxy09/article/details/20319673 机器学习算法与Python实践之(七)逻辑回归(Logistic Regression) z ...

随机推荐

  1. java-com-util-common-service:BaseService.java

    ylbtech-java-com-util-common-service:BaseService.java 1.返回顶部 1. package com.shineyoo.manager.util.co ...

  2. 84. ExtJS下页面显示中文乱码问题

    转自:https://blog.csdn.net/wenminhao/article/details/51198981 最近在学校extjs是,使用js脚本显示中文在html页面中时,中午出现了乱码的 ...

  3. Chrome 最小化恢复之后部分黑屏

    解决办法:设置->显示高级设置->关闭硬件加速

  4. gitlab克隆报错:remote: HTTP Basic: Access denied;remote: You must use a personal access token with ‘api’ scope for Git over HTTP.

    错误: remote: HTTP Basic: Access denied remote: You must use a personal access token with ‘api’ scope ...

  5. 3Ddungeon-------三维搜索-----偷个懒 把 亡命逃窜 的代码修改了一下 拿来用了

    题 很简单  就是给一个   三维的迷宫然后 开你起始地点 S 问你能不能到达 出口 E 能的话 需要多长时间 ? #include<stdio.h> #include<string ...

  6. golang struct里面的字段,或者slice排序

    accounts := []users.Account{}Admin.DB.Preload("CurrencyObj").Where("member_id = ?&quo ...

  7. SPOJ GSS1 & GSS3&挂了的GSS5

    线段树然后yy一下,搞一搞. GSS1: 题意:求最大区间和. #include <cstdio> #include <algorithm> using namespace s ...

  8. mybatis parameterType报错:There is no getter for property named 'xxx' in 'class java.lang.String'

    方法1: 当parameterType = "java.lang.String" 的时候,参数读取的时候必须为 _parameter 方法2: 在dao层的时候,设置一下参数,此方 ...

  9. Laravel5.1学习笔记4 控制器

    HTTP 控制器 简介 基础控制器 控制器中间件 RESTful 资源控制器 隐式控制器 依赖注入和控制器 路由缓存 简介 除了在单一的 routes.php 文件中定义所有的请求处理逻辑之外,你可能 ...

  10. nodejs 中使用 mysql 实现 crud

    首先要使用 mysql 就必须要安装 npm install mysql 然后封装 sql 函数 const mySql = require('mysql'); let connection ; le ...