逻辑回归(Logistic Regression)

  • 分类问题

在分类问题中,要预测的变量 y 是离散的值,分类问题分为两分类问题和多分类问题分类问题中,我们尝试预测的是结果是否属于某一个类(例如正确或错误)。分类问题的例子有:判断一封电子邮件是否是垃圾邮件;判断一次金融交易是否是欺诈;之前我们也谈到了肿瘤分类问题的例子,区别一个肿瘤是恶性的还是良性的.

使用的算法叫做逻辑回归算法

首先讨论二元分类问题

我们将因变量(dependent variable)可能属于的两个类分别称为负向类(negative class)和正向类(positive class)其中 0 表示负向类,1 表示正向类。

如果我们要用线性回归算法来解决一个分类问题,对于分类, y

 取值为 0 或者1,但如果你使用的是线性回归,那么假设函数的输出值可能远大于 1,或者远小于0,即使所有训练样本的标签  都等于 0 或 1。尽管我们知道标签应该取值0 或者1,但是如果算法得到的值远大于1或者远小于0的话,就会感觉很奇怪。所以我们在接下来的要研究的算法就叫做逻辑回归算法,这个算法的性质是:它的输出值永远在0到 1 之间 

希望我们的分类器的输出值在0和1之间,因此,我们希望想出一个满足某个性质的假设函数,这个性质是它的预测值要在0和1之间。

根据线性回归模型我们只能预测连续的值,然而对于分类问题,我们需要输出0或1,我们可以预测:

         我们引入一个新的模型,逻辑回归,该模型的输出变量范围始终在0和1之间。 逻辑回归模型的假设是

 

 

  • 判定边界

 

 现在假设有这样一个模型

我们需要画出这样的决策边界

 

加入是这样的假设模型,那么需要画出圆形的决策边界

 

 

  • 代价函数

如何拟合逻辑回归模型的参数θ,需要定义代价函数

对于线性回归模型,我们定义的代价函数是所有模型误差的平方和。理论上来说,我们也可以对逻辑回归模型沿用这个定义,但是问题在于

带入到这样定义了的代价函数中时,我们得到的代价函数将是一个非凸函数(non-convexfunction)。,如下图

 

 

这意味着我们的代价函数有许多局部最小值,这将影响梯度下降算法寻找全局最小值。

线性回归的代价函数为

为了解决上面提到的J(θ)是非凸函数的问题,我们寻找其它的数学等价代换,来使得逻辑回归的代价函数为凸函数,
首先,对于代价函数做如下代换:

我们观察如下y = -ln(x)和y = -ln(1-x)两个函数的图像

 

 

该图像最明显的特性是当x=1时,则y=0;当x=0时,则y趋向于无穷。

该图像最明显的特性是当x=0时,则y=0;当x=1时,y趋向于无穷

对于cost函数,
令y=1,则cost(hθ(x(i)),y(i)) = -ln(hθ(x(i)))
令y=0,则cost(hθ(x(i)),y(i)) = -ln(1-hθ(x(i)))
可以整合为一个公式即
cost(hθ(x(i)),y(i)) = -yln(hθ(x(i))) - (1-y) ln(1-hθ(x(i)))

 

 

 

  • 梯度下降算法

 在得到这样一个代价函数以后,我们便可以用梯度下降算法来求得能使代价函数最小的参数了。算法为:

求导过程如下

 

  • 简化的成本函数和梯度下降

     逻辑回归的代价函数:

最小化代价函数的方法,是使用梯度下降法(gradient descent)。

如果我们要最小化这个关于θ的函数值,这就是我们通常用的梯度下降法的模板。

 

我们要反复更新每个参数

 

吴恩达作业分类问题

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import scipy.optimize as opt

path="E:\machine studdy\Coursera-ML-AndrewNg-Notes-master\code\ex2-logistic regression\ex2data1.txt"
data=pd.read_csv(path,header=None,names=['Exam1','Exam2','Admitted'])

positive=data[data['Admitted'].isin([1])]  #录取
negative=data[data['Admitted'].isin([0])]  #未录取


def logistic(z):
    return 1/(1+np.exp(-z)) #np. exp(x)   e的x幂次方


def costfunction(theta,X,y):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    first=np.multiply(-y,np.log(logistic(X*theta.T)))
    second=np.multiply((1-y),np.log(1-logistic(X*theta.T)))
    return np.sum(first-second)/(len(X))

def gradient(theta, X, y):
    theta = np.matrix(theta)
    X = np.matrix(X)
    y = np.matrix(y)
    parameters=int(theta.ravel().shape[1])
    cost=np.zeros(parameters)

    error=logistic(X*theta.T)-y
    for i in range(parameters):
        term=np.multiply(error,X[:,i])
        #cost中存放的应该是每个导数的偏导
        cost[i]=np.sum(term) / len(X)
    return cost


data.insert(0,'Ones',1)

'''初始化X, y,theta 三个参数'''
cols=data.shape[1]
X=data.iloc[:,:-1]
print(X.shape)
y=data.iloc[:,cols-1:cols]
print(y.shape)
theta=np.zeros(3)
print(theta.shape)

#自动选择学习率与迭代次数
result = opt.fmin_tnc(func=costfunction, x0=theta, fprime=gradient, args=(X,y))

print(result)
#绘制决策曲线
plotting_x1 = np.linspace(30, 100, 100)
plotting_h1 = ( - result[0][0] - result[0][1] * plotting_x1) / result[0][2]
fig,ax=plt.subplots(figsize=(12,8))

ax.plot(plotting_x1, plotting_h1, 'y', label='Prediction')
ax.scatter(positive['Exam1'],positive['Exam2'],s=50,c='b',marker='o',label='Admitted')
ax.scatter(negative['Exam1'],negative['Exam2'],s=50,c='r',marker='x',label='Not Admitted')

ax.legend()

ax.set_xlabel('Exam 1 Score')
ax.set_ylabel('Exam 2 Score')

plt.show()

#评价逻辑回归模型







 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值