方差代价函数
引入
如何处理误差?
如果是单纯的相减,算总体误差时有可能出现正负相消的情况
- 绝对差:误差的绝对值。不方便
- 平方误差:差值取平方即可
当x=a时
e=(y(a)-wa)^2,ae是关于w的一元二次函数
全局误差就是将每点的误差求平均,所以全局误差e也是w的一元二次函数。它描述了当w取不同值时误差的大小。
对于一组数据xi,yi:
称e为均方误差
所以我们要让机器自己寻找抛物线的最低点
正规方程
直接求最低点w=b/2a,带入公式化简得:
但如果数据量庞大,这种方式显然不合适
编程实现
获取数据、绘制散点图
x, y = dataset.get_beans(100)
plt.scatter(x, y)
均方误差:算出每个误差的平方,求平均
# 均方误差
w = 0.2
pre_y = x * w
es = np.sum((y-pre_y) ** 2) / 100
print(es)
输出了当w为0.2时的均方误差es的值
绘制w与e的图像
-
定义ws和es数组,放很多很多的w、e的值
ws = np.arange(0, 3, 0.1) es = []
-
计算每个对应的e,放到es数组中
for w in ws: e = np.sum((y - x * w) ** 2) / 100 es.append(e)
-
绘制
# 绘制 plt.title("w-e") plt.xlabel("w") plt.ylabel("e") plt.plot(ws, es) plt.show()
得到了w和e的函数
根据函数计算最小的误差对应的w
w_min = np.sum(x * y) / np.sum(x * x)
y_pre = w_min * x
plt.plot(x, y_pre)
plt.show()
直接利用公式计算出误差最小时的w_min,并绘制出预测函数
拟合情况非常的好
总结
- 代价函数的计算
- 正规方程求解最低点