声明
本文章基于哔哩哔哩付费课程《小白也能听懂的人工智能原理》。仅供学习记录、分享,严禁他用!!如有侵权,请联系删除
目录
一、内容讲解
1、绝对差:用绝对值处理误差。面对误差,比标准大a or 小a都算是与标准相差了a,并不关心正负。
2、平方误差:将差值取平方,消除负号的影响。
3、均方误差
(1)权值参数w决定了预测函数(预测直线)的样子,每次权值w取不同的值,产生的误差也会不同。权值与误差的曲线恰是一个抛物线,即开口向上的一元二次函数 。
(2)证明:
- 探讨一个豆豆时的情况:
- 探讨一组豆豆时的情况:
- 将豆豆与毒性一般化:x0表示豆豆大小,y0表示对应的实际毒性。
- 对于任意一个豆豆来说,它的预测误差和参数w的关系都是一个开口向上的抛物线:
- 一组豆豆的情况:整体误差 = 把单个豆豆的预测误差加起来再求平均
- xn表示豆豆大小,yn表示豆豆的实际毒性
(2)将上述公式变得简洁:面对许多个数据,我们只需报单个的误差求出来,再全部加在一起平均一下,这就是预测函数在整体样本上的误差。依旧是一个开口向上的抛物线。
4、让机器自己去寻找抛物线的最低点,此处恰是误差最小的点。
5、统计方法得到概率
(1)事物出现的频率,收敛于它的概率 。
(2)设计小蓝的大脑时,其实也是在干抛掷一枚不确定的硬币这件事,一开始猜想出一个w,然后统计出来的大量数据(大小和毒性)去评估w到底合不合适,这就是数理统计学中的--回归分析。而我们评估的标准是均方误差,并试图让他最小,也就是回归分析中的最小二乘法。
6、代价函数
-
权值w作为自变量,误差e作为因变量,展现出当参数w取不同的值时,对环境中问题数据预测时产生不同的误差e。
-
参数x和y都是通过观测统计而来的已知数,成为代价函数中的已知参数部分。
-
是用来分析并改进预测函数的辅助函数。
-
用样本的均方误差得到的代价函数,习惯称之为“方差代价函数”。(注意,此处的方差 ≠ 数学意义上的方差)
-
而利用代价函数的最低点的w值放回预测函数中,这时预测函数也就很好地完成了对数据的拟合。
7、实际计算
(1)根据中学数学知识,抛物线的最低点为:
(2)一个豆豆的简单情况
(3)多个豆豆的一般情况
8、正规方程
二、编程实验
- 一次性求解出让误差最小的w取值的方法。
-
当样本数量较少时,其实很合适。但机器学习往往需要处理海量的数据,这种一步到位的方式就意味着巨大的计算量和存储量。这时,就发生了变化。
(一)编写并绘制代价函数图像
1、编写代价函数
import dataset
import numpy as np
import matplotlib
from matplotlib import pyplot as plt
# 首先要知道 matplotlib 的 backend 使用的是默认配置 agg (agg不能显示绘制的图),要想显示绘制的图需要更改 agg 为 TkAgg
matplotlib.use('TkAgg')
# 获取100个豆豆的数据
xs, ys = dataset.get_beans(100)
# 编写预测函数
# 给定一个权值
w = 0.1
# xs是一个numpy库中的array数组,具有广播特性,会把xs数组中的每个值都和w相乘,最后形成一个新的数组
y_pre = w * xs
# 编写代价函数
es = (ys - y_pre) ** 2 # a ** b:表示a的b次方
# ys和ys_pre 都是numpy库中的array类型的数组(np.array),是将数组对应位置上的元素直接数据运算
# python中的普通数组:直接做数组的相加运算实际上实现的是将两个数组拼接为1个数组,a+b是将b拼接在a的后面
# numpy中的sum函数可以直接对数组中的每个元素求和
sum_e = np.sum(es)
# 求和结果取平均,整体样本上的平均误差
sum_e = (1 / 100) * sum_e
2、不同的w取值下预测函数的误差是多少
# np.arange()函数用来生成数组,用来取得不同的w值
# 第一个参数表示起始值 ; 第二参数表示结束值 ; 第三个参数表示递进大小
ws = np.arange(0, 3, 0.1)
# 绘制w和方差e的图像(即代价函数图像)
es = [] # 创建空列表用来接收不同w对应的误差值
for w in ws:
y_pre = w * xs
e = (1 / 100) * np.sum((ys - y_pre) ** 2)
es.append(e) # 将每一个w对应的豆豆的误差大小传入列表
3、绘制图像
# 绘图
plt.title("cost function", fontsize = 12)
plt.xlabel("Weight-W")
plt.ylabel("Error-E")
plt.plot(ws, es)
plt.show()
(二)利用代价函数调整预测函数
# 用抛物线的顶点坐标公式求解最低点的w
w_min = np.sum(xs * ys) / np.sum(xs * xs)
# 将最低点带入预测函数中,即为误差最小值,预测最准确的情况
y_pre = w_min * xs
# 绘图
plt.title("Size-Toxicity Function", fontsize = 12)
plt.xlabel("Bean Size")
plt.ylabel("Bean Toxicity")
# 豆豆是一个一个离散的数据,所以要利用绘制散点图,传入自变量和因变量
plt.scatter(xs, ys)
plt.plot(xs, y_pre)
plt.show()