损失函数,损失在预测和实际的不同。比如在【ML01】线性回归 中的回归函数,我们根据训练集训练出回归函数模型后,我们把测试集带入其中进行测试。只要测试,就分结果,或好或差。而好或者差的标准,就需要通过 损失函数cost function 进行判断。
根据你的直观感觉,损失函数,损失的值是大好还是小好?
我觉得不必多说,小好。0最好。
@@@----------------@@@
其一,回忆线性回归函数
@@@----------------@@@
拿线性回归函数举例,首先回忆一下线性回归函数:
f
w
,
b
(
x
)
=
w
x
+
b
f_{\mathbf{w,b}}(\mathbf{x}) = wx + b
fw,b(x)=wx+b
其中:
| 符号 | 意义 |
|---|---|
| x | 自变量 |
| f(x) | 因变量/预测值 |
| m | 训练集中训练数据的数量 |
| (x, y) | (自变量,Label) |
| (x(i), y(i)) | 训练集中第i个训练数据 |
现在再多加两个概念:w(coefficients) 以及 b(weights)
| 符号 | 意义 |
|---|---|
| w | coefficients / parameters |
| b | weights / parameters |
@@@------------@@@
其二,见一下损失函数
@@@------------@@@
J
(
w
,
b
)
=
1
2
m
∑
i
=
0
m
−
1
(
f
w
,
b
(
x
(
i
)
)
−
y
(
i
)
)
2
J(w,b) = \frac{1}{2m} \sum\limits_{i = 0}^{m-1} (f_{w,b}(x^{(i)}) - y^{(i)})^2
J(w,b)=2m1i=0∑m−1(fw,b(x(i))−y(i))2
@@------------@@
损失函数部分代码
@@------------@@
# 损失函数部分代码 def compute_cost(x, y, w, b): m = x.shape[0] cost_sum = 0 for i in range(m): f_wb = w * x[i] + b cost = (f_wb - y[i]) ** 2 cost_sum = cost_sum + cost total_cost = (1 / (2 * m)) * cost_sum return total_cost'运行
@@–@@
完整代码
@@–@@
import numpy as np import matplotlib.pyplot as plt # 数据集 x_train = np.array([1.0, 1.7, 2.0, 2.5, 3.0, 3.2]) y_train = np.array([250, 300, 480, 430, 630, 730,]) m = x_train.shape[0] # 计算cost y_predict = [] w = [] b = 100 for j in range(80,270,1): w.append(j) cost_sum = 0 f_wb = np.zeros(m) # 创建全为0的零向量m for i in range(m): f_wb[i] = j * x_train[i] + b cost = (f_wb[i] - y_train[i]) ** 2 cost_sum = cost_sum + cost res = (1 / (2 * m)) * cost_sum y_predict.append(res) # 绘图 plt.plot(w, y_predict, c='r', label='cost function') plt.title("Cost Function") plt.ylabel('Cost Value c') plt.xlabel('Coeifficient w') plt.legend() plt.show()'运行
@@—@@
损失函数图
@@—@@

@@-------@@
损失函数小结
@@------@@
在上述代码中,只对w值改变而没有改变b的值,因为没有进行后续实验所以不确定更改b的值是否真的可以再继续降低损失。但是通过上述代码,希望能对损失函数表达式以及损失函数的意义有大概的理解和了解。
what is the cost function doing?
本文开张时说过希望损失函数越小越好,事实上也是如此。拿上述示例来说,损失函数越大意味着预测的房价越不准确,所以我们要通过损失函数曲线找到其中损失最小的时候w的值,从而使得预测尽最大可能的准确。
要知道,在越复杂的现实环境中,就越小可能拿到损失为0的情况。综合考虑多方面因素,即不仅仅为一个自变量,而是采取多个自变量的方式,可以有效的增大预测的准确率。
过少的自变量,会导致欠拟合,其意思就是很多应该考虑的但是没有考虑到;
过多的自变量,会导致过拟合,其意思就是有些不应该考虑的却考虑其中了。
举个例子,判断是否为树叶,如果只考虑颜色,而不考虑其他,会把同样颜色的物体也当成叶子,则是过拟合;而如果考虑颜色,形状,…叶子上的毛,把这种其实是个例的情况却算成了所有树叶的属性,则属于过拟合。
过犹不及,竟然在机器学习中也有的体现,真的是大智慧。
2022.9.23于 香港海韵轩