简单逻辑回归

一.分类和回归任务的区别
我们可以按照任务的种类,将任务分为回归任务和分类任务.按照较官方些的说法,输入变量与输出变量均为连续变量的预测问题是回归问题,输出变量为有限个离散变量的预测问题成为分类问题.
通俗一点讲,我们要预测的结果是一个数,比如要通过一个人的饮食预测一个人的体重,体重的值可以有无限多个,有的人50kg,有的人51kg,在50和51之间也有无限多个数.这种预测结果是某一个确定数,而具体是哪个数有无限多种可能的问题,我们会训练出一个模型,传入参数后得到这个确定的数,这类问题我们称为回归问题.预测的这个变量(体重)因为有无限多种可能,在数轴上是连续的,所以我们称这种变量为连续变量.
我们要预测一个人身体健康或者不健康,预测会得癌症或者不会得癌症,预测他是水瓶座,天蝎座还是射手座,这种结果只有几个值或者多个值的问题,我们可以把每个值都当做一类,预测对象到底属于哪一类.这样的问题称为分类问题.如果一个分类问题的结果只有两个,比如"是"和"不是"两个结果,我们把结果为"是"的样例数据称为"正例",讲结果为"不是"的样例数据称为"负例",对应的,这种结果的变量称为离散型变量.

二.逻辑回归
从名字来理解逻辑回归.在逻辑回归中,逻辑一词是logistics [lə’dʒɪstɪks]的音译字,并不是因为这个算法是突出逻辑的特性.
至于回归,我们前一段讲到回归任务是结果为连续型变量的任务,logistics regression是用来做分类任务的,逻辑回归就是用回归的办法来做分类的呢。
三.
我们目前就用sigmod函数,函数如下:
在这里插入图片描述
该函数具有很强的鲁棒性(鲁棒是Robust的音译,也就是健壮和强壮的意思),并且将函数的输入范围(∞,-∞)映射到了输出的(0,1)之间且具有概率意义.具有概率意义是怎么理解呢:将一个样本输入到我们学习到的函数中,输出0.7,意思就是这个样本有70%的概率是正例,1-70%就是30%的概率为负例.
z=WTX,就是说g(z) = 1/(1 + ew[T]x). 同时,因为g(z)函数的特性,它输出的结果也不再是预测结果,而是一个值预测为正例的概率,预测为负例的概率就是1-g(z).

五:选定阈值
选定阈值的意思就是,当我选阈值为0.5,那么小于0.5的一定是负例,哪怕他是0.49.此时我们判断一个样本为负例一定是准确的吗?其实不一定,因为它还是有49%的概率为正利的.但是即便他是正例的概率为0.1,我们随机选择1w个样本来做预测,还是会有接近100个预测它是负例结果它实际是正例的误差.无论怎么选,误差都是存在的.所以我们选定阈值的时候就是在选择可以接受误差的程度.

六.最大似然估计
在这里插入图片描述
这个函数就是我们逻辑回归(logistics regression)的损失函数,我们叫它交叉熵损失函数.

七.求解交叉熵损失函数
求解损失函数的办法我们还是使用梯度下降。
在这里插入图片描述

实例:

import numpy as np
import matplotlib.pyplot as plt
import os
os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

np.random.seed(0)
num = 100
#y = 1
x_1 = np.random.normal(6, 1, size=(num))
x_2 = np.random.normal(3, 1, size=(num))
y = np.ones(num)
c_1 = np.array([x_1, x_2, y])

#y = 0
x_1 = np.random.normal(3, 1, size=(num))
x_2 = np.random.normal(6, 1, size=(num))
y = np.zeros(num)
c_0 = np.array([x_1, x_2, y])

c_1 = c_1.T
c_0 = c_0.T
all_data = np.concatenate((c_1, c_0))
np.random.shuffle(all_data)

train_data_x = all_data[:150, :2]
train_data_y = all_data[:150, -1]
test_datda_x = all_data[150:, :2]
test_datda_y = all_data[150:, -1]

# y = w1 * x1 + w2 * x2
w = np.random.rand(2, 1)
x = np.arange(10)
plt.scatter(c_1[:, 0], c_1[:, 1])
plt.scatter(c_0[:, 0], c_0[:, 1], marker='+')
y = -(w[0]*x)/w[1]
plt.plot(x, y)
plt.show()

#定义交叉熵
def cross_entropy(y, y_hat):
    return -np.mean(y * np.log(y_hat) + (1-y) * np.log(1-y_hat))

# y_hat = sigmoid(w * x)
def sigmoid(z):
    return 1./(1.+np.exp(-z))

print(w.shape, train_data_x.shape)
lr = 0.001
loss_list = []
for i in range(500):
    #计算loss
    y_hat = sigmoid(np.dot(w.T, train_data_x.T))
    loss = cross_entropy(train_data_y, y_hat)
    grad = -np.mean((train_data_x * (train_data_y - y_hat).T), axis=0)
    w = w - (lr*grad).reshape(2, 1)
    loss_list.append(loss)
    if i % 10 == 0:
        print("i: %d, loss: %f" % (i, loss))
    if loss < 0.1:
        break

plt.scatter(c_1[:, 0], c_1[:, 1])
plt.scatter(c_0[:, 0], c_0[:, 1], marker='+')
y = -(w[0]*x)/w[1]
plt.plot(x, y)
plt.show()

初始化结果:
在这里插入图片描述
训练后结果:
在这里插入图片描述
loss值:

i: 0, loss: 1.557506
i: 10, loss: 1.486986
i: 20, loss: 1.420063
i: 30, loss: 1.356865
i: 40, loss: 1.297477
i: 50, loss: 1.241932
i: 60, loss: 1.190211
i: 70, loss: 1.142248
i: 80, loss: 1.097926
i: 90, loss: 1.057088
i: 100, loss: 1.019542
i: 110, loss: 0.985073
i: 120, loss: 0.953447
i: 130, loss: 0.924423
i: 140, loss: 0.897759
i: 150, loss: 0.873222
i: 160, loss: 0.850587
i: 170, loss: 0.829646
i: 180, loss: 0.810207
i: 190, loss: 0.792097
i: 200, loss: 0.775161
i: 210, loss: 0.759262
i: 220, loss: 0.744280
i: 230, loss: 0.730111
i: 240, loss: 0.716663
i: 250, loss: 0.703860
i: 260, loss: 0.691635
i: 270, loss: 0.679929
i: 280, loss: 0.668693
i: 290, loss: 0.657886
i: 300, loss: 0.647472
i: 310, loss: 0.637420
i: 320, loss: 0.627702
i: 330, loss: 0.618296
i: 340, loss: 0.609181
i: 350, loss: 0.600340
i: 360, loss: 0.591758
i: 370, loss: 0.583421
i: 380, loss: 0.575317
i: 390, loss: 0.567434
i: 400, loss: 0.559763
i: 410, loss: 0.552295
i: 420, loss: 0.545021
i: 430, loss: 0.537935
i: 440, loss: 0.531028
i: 450, loss: 0.524295
i: 460, loss: 0.517729
i: 470, loss: 0.511324
i: 480, loss: 0.505075
i: 490, loss: 0.498977
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值