任务描述

本关任务:使用一个变量实现线性回归,以预测食品卡车的利润。假设你是一家餐馆的首席执行官,正在考虑到不同的城市开设一个分店。该连锁店已经在各个城市拥有卡车,而且你有来自城市的利润和人口数据,你希望使用这些数据来帮助你将选择在哪一个城市拓展到下一个城市。

相关知识

为了完成本关任务,你需要掌握:

1.线性回归;

2.梯度下降。

机器学习

我们以一个房价预测的例子开启线性回归模型,现在我们有很多关于房屋价格的数据,在这里,我们要根据不同的房屋尺寸所售出的价格,画出我们的数据集。比如说,你的朋友告诉你他有一套 120 平方米的公寓,你要告诉它这个房屋的价格。那么,你可以构造一个模型,这个模型可以是直线也可以是一条曲线。

线性回归

如图,假设现在有 m 个数据 (xi,yi) ,你需要根据这些数据来预测出线性函数 hθ(x)=θ01x 出来。那么怎么才能尽可能准确的算出这条直线呢?其实很简单,只要所有的真实值与预测值的差值的绝对值的总和,即1mi=1mhθx(i)y(i)\frac{1}{m}\sum_{i=1}^{m}\left | h_{θ}x^{(i)}-y^{(i)} \right | 越小,那么所得误差也就越小,我们所预测直线也就越准确。为了避免绝对值,方便运算,我们可以用差值的平方来描述误差,那么所有点与真实值误差平方的总和可以描述如下:


J(θ0,θ1)=1mi=1mhθx(i)y(i)2J(θ_ {0},θ_ {1}) = \frac{1}{m}\sum_{i=1}^{m}\left | h_{θ}x^{(i)}-y^{(i)} \right |^{2}

至此,我们误差方程已经构造出来了,那么接下来的任务也很明确,那就是求J(θ0,θ1)J(θ_{0}, θ _{1}) 的最小值所对应的

图1 线性回归问题

梯度下降
梯度下降的思想是:开始我们随机选择一个参数组合 (θ
1


2

,…,θ
n

) ,计算代价函数,然后我们寻找下一个能让代价函数值下降最多的参数组合。我们持续这么做,直到到达一个局部最小值,因为我们没有尝试完所有的参数组合,所以不能确定我们得到的局部最小值便是全局最小值,选择不同的初始参数组合,可能会找到不同的局部最小值。

图2 二元代价函数图像

想象一下你正站在图 2 中这座红山上,在梯度下降算法中,我们要做到的就是旋转 360 度,看看我们周围,并问问自己要从哪个方向上,可以尽快下山。我们应该朝哪个方向?如果我们站在山坡这一点,你看一下周围,你会发现最佳的下山方向,然后你走一步,你再看下周围,然后再想一次,我们应该从哪个方向下山?然后再走一步,重复上面的步骤,从这个新的点,你环顾四周,并决定从什么方向会最快下山,然后又迈进一步,直至最后你找到了局部最低点。 批量梯度下降公式如下:
repeat until θ收敛

{
θ
j


j

−α
∂θ
j



J(θ)
(for j=0 or j=1)
}

其中 α 是学习的效率,也就相当于我们下山的“步子大小”。在梯度下降过程中,我们每一次都让所有的参数减去学习速率乘以代价函数的导数。当 j=0 或 j=1 时会产生更新,你需要更新J(θ
0

)、J(θ
1

),具体的更新过程如下:
temp0:=θ
0


∂θ
0



J(θ)
temp1:=θ
1


∂θ
1



J(θ)
θ
0

:=temp0
θ
1

:=temp1
其中,
∂θ
j



J(θ)=
∂θ
j


2m
1

i=1

m

(h
θ

x
(i)
−y
(i)
)
2
=
2m
1

i=1

m


0


1

x
(i)
−y
(i)
)
2

当 j=0 时,
∂θ
j



J(θ)=
m
1

i=1

m

(h
θ

x
(i)
−y
(i)
)
当 j=1 时,
∂θ
j



J(θ)=
m
1

i=1

m

(h
θ

x
(i)
−y
(i)
)x
(i)

不难看出,这其实就是函数在求偏导数。
可能这样对你理解起来还是太抽象,我们结合一张图从数学的角度介绍一下,有一个一元梯度下降算法:

θ
j


j

−α
∂θ
j



J(θ)

描述:对 θ 进行赋值,使得 J(θ) 按梯度最快方向进行,一直迭代下去,最终得到局部最小值,α 是学习率。代价函数假设是下图:

图3 一元代价函数图像

接着我们结合图来理解我们的公式。在公式中,我们求导的目的其实就是这个红点的切线,这条直线刚好与函数相切于这一点,这个红线的斜率正好是这个三角形的高度除以水平长。现在,这条线正好是一个正斜率,也就是说它有正导数。因此,我得到的新 θ
1

, θ
1

更新后等于 θ
1

减去一个正数乘以 α ,接着我们来看看 α 的偏大和偏小会出现什么情况,如果 α 太小,那么就是我们只能一点一点的往下移,去努力接近最低点,这样就需要很多步才能到达局部最低点。如果 α 太大,很有可能就一下越过最低点甚至无法收敛,直到你发现你离最低点越来越远。

多元线性回归
前面我们已经可以简单地利用线性回归和梯度下降算法求得一条直线了,但是这条直线仅仅只能代表单变量模型。在生活中我们要预测的数据一般都有多方面的特征,那么这就需要构建一个多变量的回归模型:

h
θ

(x)=θ
0


1

x+θ
2

x+…+θ
n

x

学过线性代数的同学应该都知道我们可以把它化成一个向量的形式:
令 θ=(θ
1


2

,…,θ
n

)
T
,X=(x
1

,x
2

,…,x
n

)
T
,则 h
θ

(x)=θ
T
X 。

与单元线性回归相同,在多元线性回归中,我们也构造一个代价函数,这个代价函数是所有建模误差的平方和:J(θ
0


1

,…,θ
n

)=
m
1

i=1

m

(h
θ

(x
(i)
−y
(i)
)
2
,我们的目标和单变量线性回归一样,是要求使得代价函数最小的一系列参数。多元线性回归的批量梯度下降算法为:

Repeat

{
θ
j

:=θ
j

−α
∂θ
j



J(θ
0


1

,…,θ
n

)
}

不难看出,多元线性回归就是将 θ 从一两个增加到了 n 个,操作步骤和单元梯度下降是一样的,至此,我们就简单的了解了最基本的线性回归模型。

编程要求
根据提示,本关的编程任务是补全右侧代码片段 Begin 至 End 中间的代码。我们的任务是训练房价数据,最后得到关于 Profit (收益)和 Population (人口)的线性关系,最终代价函数经过梯度下降算法的误差函数值。你只需要完成相应公式的代码实现,具体的赋值由我们提供,对于关键函数描述如下。
代价函数:

J(θ
0


1

)=
2m
1

i=1

m

(h
θ

x
(i)
−y
(i)
)
2

其中:

h
θ

(x)=θ
T
X=θ
0

x
0


1

x
1

+…+θ
n

x
n

批量梯度下降算法:

θ
j

:=θ
j

−α
∂θ
j



J(θ)
θ
j

:=θ
j

−α
m
1

i=1

m

(h
θ

x
(i)
−y
(i)
)x
j
(i)

测试说明
平台会对你编写的代码进行测试,误差在 0 - 0.3 之间即可通过测评,你不需要考虑预测结果的精确度,你只需确认你的代码是否与我们提供的公式完全一致。
训练数据文件夹为:ex1data1.txt
部分数据示例:

6.1101,17.592
5.5277,9.1302
8.5186,13.662
7.0032,11.854
5.8598,6.8233

第一列为人口数据,第二列为收益数据,为了方便编程,你可以直接使用我们处理后的数据

Population Profit
0 6.1101 17.5920
1 5.5277 9.1302
2 8.5186 13.6620
3 7.0032 11.8540
4 5.8598 6.8233
对于数据预处理的过程可以参考以下代码:

names添加列名,header用指定的行来作为标题,若原无标题且指定标题则设为None

data = pd.read_csv(path, header=None, names=[‘Population’, ‘Profit’])

#在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。
data.insert(0, ‘Ones’, 1)

#变量初始化。取最后一列为 y,其余为 X
cols = data.shape[1] # 列数
X = data.iloc[:,0:cols-1] # 取前cols-1列,即输入向量
y = data.iloc[:,cols-1:cols] # 取最后一列,即目标向量
X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix([0,0]) #theta(参数θ)是一个(1,2)矩阵

#X,y,theta的维度:X.shape, theta.shape, y.shape:((97, 2), (1, 2), (97, 1))
预期输出:

4.515955503078912
参考资料
1.线性回归实现

2.吴恩达机器学习

文档更新时间: 2024-11-28 16:45   作者:admin