机器学习的逻辑回归

菜鸟的逻辑回归的初步学习笔记(PS:该博客中的图基本都是网上找的,而见解大部分是个人写的,后面有一部分代码是copy加改动的作了备注)
一、总述
逻辑回归是应用非常广泛的一个分类机器学习算法,它将数据拟合到一个logit函数(或者叫做logistic函数)中,从而能够完成对事件发生的概率进行预测。
二、逻辑回归发展
要说逻辑回归,我们得追溯到线性回归,大家对线性回归都有一定的了解,之前也写过关于线性回归的学习博客,即对于多维空间中存在的样本点,我们用特征的线性组合去拟合空间中点的分布和轨迹。如下图所示(网图):
在这里插入图片描述
线性回归能对连续值结果进行预测,而现实生活中常见的另外一类问题是,分类问题。何为分类问题,顾名思义,就是通过分类来判断结果。For example:通过判断人体内的白细胞数量自动来判断人是否患有白血病,手机的骚扰电话和骚扰信息判断拦截。该类问题都是只需要给出判断结果是与否,我们需要给定一个中间值来作为判断条件,如白细胞数量正常范围内的最大值,以及该电话及信息被拉黑或被屏蔽过的次数,当大于这个值的时候,即判断为是,小于时则为否。
例如:下图中X为数据点肿瘤的大小,Y为观测结果是否是恶性肿瘤。通过构建线性回归模型,如hθ(x)所示,构建线性回归模型后,我们设定一个阈值0.5,预测hθ(x)≥0.5的这些点为恶性肿瘤,而hθ(x)<0.5为良性肿瘤。
在这里插入图片描述
但很多实际的情况下,我们需要学习的分类数据并没有这么精准,比如说上述例子中突然有一个不按套路出牌的数据点出现,如下图所示:
在这里插入图片描述
这个时候,你再设定0.5,这个判定阈值就失效了,而现实生活的分类问题的数据,会比例子中这个更为复杂,而这个时候我们借助于线性回归+阈值的方式,已经很难完成了。 在这样的场景下,逻辑回归就诞生了。它的核心思想是,如果线性回归的结果输出是一个连续值,而值的范围是无法限定的,那我们有没有办法把这个结果值映射为可以帮助我们判断的结果呢。而如果输出结果是 (0,1) 的一个概率值,这个问题就很清楚了。有这样一个简单的函数了,就是很神奇的sigmoid函数(如下):
在这里插入图片描述
如果把sigmoid函数图像画出来,是如下的样子:
在这里插入图片描述
Sigmoid Logistic Function
从函数图上可以看出,函数y=g(z)在z=0的时候取值为1/2,而随着z逐渐变小,函数值趋于0,z逐渐变大的同时函数值逐渐趋于1,而这正是一个概率的范围。 所以我们定义线性回归的预测函数为Y=WTX,那么逻辑回归的输出Y= g(WTX),其中y=g(z)函数正是上述sigmoid函数(或者简单叫做S形函数)。
三、实例
在这里插入图片描述
当遇到这种非线性、不规则边界时,而线性回归就变得无能为力了
在这里插入图片描述
在这里插入图片描述
而这些不规则的边界又可以被称为决策边界。

代码及实现

from numpy import loadtxt, where

from pylab import scatter, show, legend, xlabel, ylabel

 

#load the dataset

data = loadtxt('/home/阳旭/data/data1.txt', delimiter=',')

 

X = data[:, 0:2]

y = data[:, 2]

 

pos = where(y == 1)

neg = where(y == 0)

scatter(X[pos, 0], X[pos, 1], marker='o', c='b')

scatter(X[neg, 0], X[neg, 1], marker='x', c='r')

xlabel('Feature1/Exam 1 score')

ylabel('Feature2/Exam 2 score')

legend(['Fail', 'Pass'])

show()

得出下图:
在这里插入图片描述
由于本人不会写含有梯度下降的sigmoid函数、代价函数、便从网上借鉴(copy)加改动了
的能实现该作用的代码


def sigmoid(X):

    '''Compute sigmoid function '''

    den =1.0+ e **(-1.0* X)

    gz =1.0/ den

    return gz

def compute_cost(theta,X,y):

    '''computes cost given predicted and actual values'''

    m = X.shape[0]#number of training examples

    theta = reshape(theta,(len(theta),1))

    

    J =(1./m)*(-transpose(y).dot(log(sigmoid(X.dot(theta))))- transpose(1-y).dot(log(1-sigmoid(X.dot(theta)))))

    

    grad = transpose((1./m)*transpose(sigmoid(X.dot(theta))- y).dot(X))

    #optimize.fmin expects a single value, so cannot return grad

    return J[0][0]#,grad

def compute_grad(theta, X, y):

    '''compute gradient'''

    theta.shape =(1,3)

    grad = zeros(3)

    h = sigmoid(X.dot(theta.T))

    delta = h - y

    l = grad.size

    for i in range(l):

        sumdelta = delta.T.dot(X[:, i])

        grad[i]=(1.0/ m)* sumdelta *-1

    theta.shape =(3,)

    return  grad

便能得出下图:
在这里插入图片描述
、总的来说,逻辑回归是建立在线性回归之上的,它始于输出结果为有实际意义的连续值的线性回归,但是线性回归对于分类的问题没有办法准确而又具备鲁棒性(Robust)地分割,因此我们设计出了逻辑回归这样一个算法,它的输出结果表征了某个样本属于某类别的概率。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值