Loading... ## 前言 换汤不换药。 逻辑回归是一种分类算法。也就是说,数据给定了一组参数,它们对应一个结果是或否。现在要求对他们分类,进行预测。 关键步骤是引入一个 sigmoid 函数,使得 0/1 的变化变得平滑。这样一来,当我们用梯度下降得到的函数值 $< 0.5$ 时就认为是 $0$ , 大于 $0.5$ 的时候就认为是 $1$ 中间引入正则化方法,来防止拟合的函数过拟合或者欠拟合。思想也是非常巧妙的。 ## 过程 最重要的是理解 sigmoid 函数。该函数提供了一个方法,保证一个函数值经过改函数映射后值域是 $(0,1)$ 。 具体地,我们记 $z = f_{w,b}(x^{(i)})$ 使我们预测的原函数值,$g(z)$ 是一个 sigmoid 函数。其中: $$ g(z) = \frac{1}{1 + e^{-z}} $$ 这个函数在 $0$ 附近变化,往正方向无限趋近于 $1$,负方向无线趋近于 $0$,这正是我们想要的结果。 所以逻辑回归的过程其实相当简单。 之后会出现的一个问题是当我们拟合的多项书函数次数 (order) 比较高,或者是一些项前面的系数过小或者是过大了,导致过拟合或者欠拟合。这个时候我们就要使用正则化方法来解决这个问题。 以过拟合为例,这个时候说明有一个项前面的系数过大了。一个项前面的系数我们也可以理解为权重。这个时候我们只要降低这个项的权重,就能减轻过拟合。 也就是说,我们希望我们 $J(w,b)$ 尽可能小的时候,每一个项前面的权重 $w_i$ 也尽可能地小。 那么我们只要把 $\sum w_i$ 加到 $J(w,b)$ 里面是不是就可以完事了呢? 显然不是,因为 $w_i$ 有正有负。 这个时候就引出了 L1/2 两种正则化方法。L1 是让 $J(w,b)$ 加上 $\sum |w_i|$ 。而 L2 正则化方法是 $+\sum w_i^2$ 两种方法具体的区别是啥,好像是跟某种网络的稀疏程度相关的。目前我还不太懂,搞懂了再更新吧。 这个地方 2022 级的牛睿宁学姐提供了无私的帮助,向她表示由衷的感谢! ## 代码 ```python import copy import numpy as np def sigmoid(z): z = np.clip(z, -500, 500) g = 1.00 / (1.00 + np.exp(-z)) return g def calcCost(x, y, w, b, lambda_ = 1.00): m, n = x.shape; cost = 0.00 for i in range(m): z_i = np.dot(x[i], w) + b; f_i = sigmoid(z_i) cost += -y[i] * np.log(f_i) + (1 - y[i]) * np.log(1 - f_i) cost /= m reg_cost = 0.00 for j in range(n): reg_cost += (w[j] ** 2) reg_cost = (lambda_ / (2.00 * m)) * reg_cost return cost + reg_cost def regression(x, y, w, b, dep = int(5e3), alpha = 5e-5, lambda_ = 1.00): m, n = x.shape dw = np.arange(n); db = 0.00 for i in range(m): err = (np.dot(x[i], w) + b) - y[i] for j in range(n): dw[j] = dw[j] + err * x[i, j] db = db + err dw = dw / m; db = db / m for j in range(n): dw[j] = dw[j] + (lambda_ / m) * w[j] return dw, db def getData(): data_x = np.loadtxt("my_data_x.txt", delimiter = ' ', skiprows = 1) x_in = data_x[:] data_y = np.loadtxt("my_data_y.txt", delimiter = ' ') y_in = data_y[:] return x_in, y_in def main(): x_train, y_train = getData() w = np.arange(3) b = 0 w_res, b_res = regression(x_train, y_train, w, b, int(2e5)) print(w_res); print(b_res) main() ``` ## 吐槽 现在代码实现最大的问题是读入。 最后修改:2023 年 08 月 17 日 © 允许规范转载 打赏 赞赏作者 支付宝微信 赞 如果觉得我的文章对你有用,请随意赞赏