【学习笔记】逻辑回归

许多问题需要概率作为输出,逻辑回归是一种效率很高的概率计算机制。

虽然我在这里没有提及,但是各位对机器学习感兴趣的基本都会用到过mnist数据集。 在我们读取数据集的一般是这么写的

mnist = input_data.read_data_sets('MNIST_data/', one_hot=True)

这里labels不再是一个值,而是独热码。

>>>print(mnist.train.labels)
array([[0., 0., 0., ..., 1., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       ...,
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 0., 0.],
       [0., 0., 0., ..., 0., 1., 0.]])

这时候我们就需要进行逻辑回归。

mnist = input_data.read_data_sets('MNIST_data/', one_hot=False)

则会返回固定值:

array([7, 3, 4, ..., 5, 6, 8], dtype=uint8)

大家可能发现了,逻辑回归与我们之前对经度和纬度进行的分箱有点类似,只不过这回变成判断数据落在哪个“箱”内而已。

文中给了我们一个例子,我们现在要创建一个逻辑回归模型来预测半夜狗叫的概率:

p(bark|night) 

假设p(bark|night)为0.05,那么一年内就应该大概会叫 0.05*365次。

很多时候我们会将逻辑回归映射到二元分类问题的解决答案(例如垃圾邮件和非垃圾邮件)。

既然这个输出结果是概率,那么我们就要保证输出的值在0~1之间。这里我们需要一个激活函数,这个函数可以把 输入值映射到0~1区间。

activation_function = 1/(1+ e^(-z))

这个就是著名的sigmoid函数。在tf中可以使用

tf.nn.sigmoid()调用。

我们这里画一下图。

import numpy as np
import matplotlib.pyplot as plt
import tensorflow as tf

x = np.linspace(-10, 10, 1000)
y = tf.nn.sigmoid(x)
sess = tf.Session()

plt.figure(1)

plt.plot(x, sess.run(y))

plt.show()

文中最后强调,这里的z叫做 对数几率,这个叫法是因为sigmoid的反函数,z=log(y/(1-y))。

知道用什么激活函数了,同样我们也需要重新设计loss算法。

在这之前我们一直使用RMSE(其实MSE使用的更多,但是原文为了loss便于我们观看,所以使用了RMSE,因此我们也一直沿用的RMSE)。

当我们的预测值越接近真实值的时候损失越小, 如果两者相等的话,那月 预测值-真实值 =0, loss也为0。我们为什么不直接使用MSE来预测呢?

我们这里假设 预测值为  prediction = [ 0.1, 0.3, 0.3, 0.7, 0.3]

真实值为  ys = [0, 0, 0, 1, 0]

我们这里用MSE来设计    loss = tf.reduce_mean(tf.square(prediction - ys))

这里的loss =  (0.1^2 + 0.3^2 + 0.3^2 + 0.3^2 +0.3^2) /5 = 0.074

我们这里设计的loss,的确也反映了 预测值和真实值的变化,且预测值越接近真实值 loss越小。

但是这里有一个问题,不知道大家有没有发现呢?

猜你喜欢

转载自blog.csdn.net/Canon__/article/details/82828675