2021年7月11日
机器学习的概念
一个程序被认为能从经验E中学习, 解决任务T,达到性能度量值P,当且仅当,有了经验E后,经过P评判,程序在处理T时的性能有所提升。我认为经验E就是程序上万次的自我练习的经验而任务
就T是下棋。性能度量值P呢,就是它在与一些新的对手比赛时,赢得比赛的概率。
利用训练值特征,设定假设(h),通过h计算出结果,经过P进行评判。
监督学习和无监督学习
监督学习: 我们将教计算机如何去完成任务
无监督学习中:我们打算让它自己进行学习
此外你将听到诸如,强化学习和推荐系统等各种术语。这些都是机器学习算法的一员
监督学习
可以看出,监督学习指的就是我们给学习算法一个数据集。这个数据集由“正确答案"组成。在房价的例子中,我们给了一系列房子的数据,我们给定数据集中每个样本的正确价格,
给予数据集,设置假设,计算预测
回归这个词的意思是,我们在试着推测出这一系列连续值属性。
分类指的是,我们试着推测出离散的输出值:0或 1良性或恶性,而事实上在分类问题中,输出可能不止两个值。比如说可能有三种乳腺癌,所以你希望预测离散输出
我们以后会讲 一个算法,叫支持向量机,里面有一个巧妙的数学技巧,能让计算机处理无限多个特征。
总结
现在来回顾一下,这节课我们介绍了监督学习。其基本思想是,我们数据集中的每个样
本都有相应的 “正确答案 ”。 再根据这些样本作出预测 就像房子和肿瘤的例子中做的那样 。
我们还介绍了回归问题,即通过回归来推出一个连续的输出,之后我们介绍了分类问题,其
目标是推出一组离散的结果。
无监督学习
无监督学习算法可能会把这些数据分成两个不同的簇。所以叫做聚类算法。事实证明,它能被用在很多地方。
鸡尾酒宴会——另外一种夏日放假时光
单变量线性回归
步骤:
1. 确定目标,确定是否符合条件(将连续型的数据用来预测?(那就要算出最后的回归方程式))
目标:将连续型的数据用来预测?用来确定因变量与自变量的关系?(那就要算出最后的回归方程式)
符合条件:线性数据,一般是连续的,一般数据间不存在共线性
2. 列假设的公式,用梯度下降\最大似然估计,normal equation的方法算得
3.算出结果,结束方法
回归 一词指的是,我们根据之前的数据预测出一个准确的输出值,对于这个例子就是价格
这就是一个监督学习算法的工作方式,我们可以看到这里有我们的训练集里房屋价格
我们把它喂给我们的学习算法
我将选择最初的使用规则ℎ代表 hypothesis,因而,要解决房价预测问题,我们实际上
是要将训练集 “喂 ”给我们的学习算法 进而学习得到一个假设 ℎ,然后将我们要预测的房屋
的尺寸作为输入变量输入给 ℎ,预测出该房屋的交易价格作为输出变量输出为结果。
一种可能的表达方式为:,因为只含有一个特征 /输入变量,因此这样
的问题叫作单变量线性回归问题。
代价函数就是最小二乘法里面
最小二乘法
模型所预测的值与训练集中实际值之间的差距(下图中蓝线所指)就是 建模误差 modeling error)。
我们的目标便是选择出可以使得建模误差的平方和能够最小的模型参数。即使得代价
函数 最小
我们绘制一个等高线图,三个坐标分别为𝜃0和 𝜃1 和 𝐽(𝜃0,𝜃1)
则可以看出在三维空间中存在一个使得 𝐽(𝜃0,𝜃1)最小的点。
放到三维图上
红点表示的是代价函数的最小值
梯度下降——梯度下降是一个用来求函数最小值的算法,我们将使用梯度下降算法来求出代价函数
𝐽(𝜃0,𝜃1) 的最小值。
梯度下降背后的思想是:开始时我们随机选择一个参数的组合
(𝜃0,𝜃1,......,𝜃𝑛),计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做直到到到一个局部最小值( local minimum),因为我们并没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值是否便是全局最小值( global minimum),选择不同的初始参数 组合,可能会找到不同的局部最小值。
想象一下你正站立在山的这一点上,站立在你想象的公园这座红色山上,在梯度下降算
法中,我们要做的就是旋转 360度,看看我们的周围,并问自己要在某个方向上,用小碎步
尽快下山。这些小碎步需要朝什么方向?如果我们站在山坡上的这一点,你看一下周围,你
会发现最佳的下山方向,你再看看周围,然后再一次想想,我应该从什么方向迈着小碎步下
山?然后你按照自己的判断又迈出一步,重复上面的步骤,从这个新的点,你环顾四周,并
决定从什么方向将会最快下山,然后又迈进了一小步,并依此类推,直到你接近局部 最低点
的位置。
批量梯度下降(
batch gradient descent)算法的公式为
其中
𝑎是学习率( learning rate),它决定了我们沿着能让代价函数下降程度最大的方向
向下迈出的步子有多大,在批量梯度下降中,我们每一次都同时让所有的参数减去学习速率
乘以代价函数的导数。
在梯度下降算法中,这是正确实现同时更新的方法。我不打算解释为什么你需要同时更
新,同时更新是梯度下降中的一种常用方法。我们之后会讲到,同步更新是更自然的实现方
法。当人们谈到梯度下降时,他们的意思就是同步更新。
描述:对
𝜃赋值,使得 𝐽(𝜃)按梯度下降最快方向进行,一直迭代下去,最终得到局部最
小值。其中 𝑎是学习率( learning rate),它决定了我们沿着能让代价函数下降程度最大的方
向向下迈出的步子有多大 。
对于这个问题,求导的目的,基本上可以说取这个红点的切线,就是这样一条红色的直
线,刚好与函数相切于这一点,让我们看看这条红色直线的斜率,就是这条刚好与函数曲线
相切的这条直线,这条直线的斜率正好是这个三角形的高度除以这个水平长度,现在,这条
线有一个正斜率,也就是说它有正导数,因此,我得到的新的 𝜃1 𝜃1更新后等于 𝜃1减去一个
正数乘以 𝑎。
如果
𝑎太小了,即我的学习 速率太小,结果就是只能这样像小宝宝一样一点点地挪动,
去努力接近最低点,这样就需要很多步才能到达最低点,所以如果 𝑎太小的话,可能会很慢,
因为它会一点点挪动,它会需要很多步才能到达全局最低点。
如果
𝑎太大,那么梯度下降法可能会越过最低点,甚至可能无法收敛,下一次迭代又移
动了一大步,越过一次,又越过一次,一次次越过最低点,直到你发现实际上离最低点越来
对于单行
梯度下降python实现,BGD
# _*_ coding: utf-8 _*_
# 作者: yhao
# 博客: http://blog.csdn.net/yhao2014
# 邮箱: yanhao07@sina.com
# 训练集
# 每个样本点有3个分量 (x0,x1,x2)
x = [(1, 0., 3), (1, 1., 3), (1, 2., 3), (1, 3., 2), (1, 4., 4)]
# y[i] 样本点对应的输出
y = [95.364, 97.217205, 75.195834, 60.105519, 49.342380]
# 迭代阀值,当两次迭代损失函数之差小于该阀值时停止迭代
epsilon = 0.0001
# 学习率
alpha = 0.01
diff = [0, 0]
max_itor = 1000
error1 = 0
error0 = 0
cnt = 0
m = len(x)
# 初始化参数
theta0 = 0
theta1 = 0
theta2 = 0
while True:
cnt += 1
# 参数迭代计算
for i in range(m):
# 拟合函数为 y = theta0 * x[0] + theta1 * x[1] +theta2 * x[2]
# 计算残差
diff[0] = (theta0 + theta1 * x[i][1] + theta2 * x[i][2]) - y[i]
# 梯度 = diff[0] * x[i][j]
theta0 -= alpha * diff[0] * x[i][0]
theta1 -= alpha * diff[0] * x[i][1]
theta2 -= alpha * diff[0] * x[i][2]
# 计算损失函数
error1 = 0
for lp in range(len(x)):
error1 += (y[lp] - (theta0 + theta1 * x[lp][1] + theta2 * x[lp][2])) ** 2 / 2
if abs(error1 - error0) < epsilon:
break
else:
error0 = error1
print("theta0 : %f, theta1 : %f, theta2 : %f, error1 : %f" % (theta0, theta1, theta2, error1))
print('Done: theta0 : %f, theta1 : %f, theta2 : %f' % (theta0, theta1, theta2))
print('迭代次数: %d' % cnt)
#为什么相邻两个残差相差在0.0001说明我们能够找到全局最优解呢?因为根据梯度下降的原理,每一次迭代过程我们得到的m个theta必然越来越接近最优解的,相差0.0001说明m个theta无法继续下降
#为什么相邻两个残差相差在0.0001说明我们能够找到全局最优解呢?因为根据梯度下降的原理,每一次迭代过程我们得到的m个theta必然越来越接近最优解的,相差0.0001说明m个theta无法继续下降