文章目录
一、线性回归
1 实现简单示例函数
在该部分练习中,将通过代码实现返回一个5*5的对角矩阵。输出与如下相同:
1 0 0 0 0
0 1 0 0 0
0 0 1 0 0
0 0 0 1 0
0 0 0 0 1
1.1 提交解决方案
在以下代码框中进行如上的实现,完成部分练习后,得到如上的相同结果即为通过。
2 单变量线性回归
在该部分练习中,将实现单变量线性回归并用来预测餐车的利润。
假设你是一家餐厅的领导,正在考虑在不同的城市开设新的分店。该连锁店已经在不同的城市有了餐车,并且你能够获得每个城市的人口和利润数据。
现在需要使用这些数据来帮助你选择下一个被扩展的城市。
文件ex1data1.txt包含线性回归问题的数据集。第一列数据对应城市人口,第二列数据对应那座城市的餐车的利润。利润为负时表示亏损。
2.1 绘制数据
在开始进入练习之前,对数据进行可视化通常很有用。对于该数据集,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)。
接下来需要实现数据可视化的代码,该部分数据绘制出的图像应与如下相同。
要点:
- 实现散点图可视化
- 数据分布为红色点
- 标清横纵坐标名称
2.2 梯度下降
在该部分中,将使用梯度下降来选择合适的线性回归参数θ用以拟合给定数据集。
2.2.1 更新公式
线性回归的目的是最小化成本函数:
假设 ℎ𝜃(𝑋)由以下线性模型给出:
回顾一下,模型的参数是 𝜃𝑗
的值,这些将用来调整以最小化成本 𝐽(𝜃)
。
其中一种方法是使用批量梯度下降算法,在批量梯度下降中,每次迭代地执行更新,随着梯度下降的每一步计算,参数 𝜃𝑗
越来越接近能够使得成本 𝐽(𝜃)
达到最低的最佳值。
(同时更新所有的 𝜃𝑗
)
2.2.2 实现
在上一部分的练习中,我们已经将所需要用到的数据加载至变量data中,并为其列分别进行命名。
接下来,我们在数据中添加了一个维度来拟合截距项 𝜃0
。并将初始参数值设为0,学习率 𝛼
设为0.01。
2.2.3 计算成本J(θ)
在执行梯度下降最小化成本函数 𝐽(𝜃)
时,通过计算成本来监视收敛状态是有帮助的。
在该部分练习任务中,你需要实现一个计算成本 𝐽(𝜃)
的函数computeCost,用于检查梯度下降实现的收敛性。
其中,X和y不是标量值,而是矩阵,其行代表训练集中的示例。
要点: 完成该函数后,将 𝜃
值初始化为0并进行成本的计算,将得到的成本值打印出来。
如果结果为32.07,则计算通过。
2.2.4 梯度下降
接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供 𝜃
的更新。
在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容。
请记住,成本 𝐽(𝜃)
为参数-被向量 𝜃
终止,而不是 𝑋
和 𝑦
。也就是说,我们将 𝐽(𝜃)
的值最小化通过改变矢量 𝜃
的值,而不是通过改变 𝑋
或 𝑦
。
验证梯度下降是否正常工作的一种好方法是查看 𝐽(𝜃)
的值,并检查该值每步是否减小。每次迭代时,代码都会调用computeCost函数并打印成本。假设你实现了梯度下降,正确地计算成本, 𝐽(𝜃)
值永远不会增加,并且应该在算法结束时收敛到稳定值。
要点:
实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化,绘图结果需要类似如下图所示。
2.3 可视化成本函数
为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制。
二、逻辑回归
1 Logistic回归
在该部分练习中,将建立一个逻辑回归模型,用以预测学生能否被大学录取。
假设你是大学某个部门的负责人,你要根据两次考试的结果来决定每个申请人的入学机会。目前已经有了以往申请者的历史数据,并且可以用作逻辑回归的训练集。对于每行数据,都包含对应申请者的两次考试分数和最终的录取结果。
在本次练习中,你需要建立一个分类模型,根据这两次的考试分数来预测申请者的录取结果。
1.1 数据可视化
在开始实施任何算法模型之前,最好先对数据进行可视化,这将会更加直观的获取数据特征。
现在,你需要编写代码来完成数据的绘图,显示如下所示的图形。
要点:
- 导入需要使用的python库,并将从文件ex2data1.txt中读取数据,并显示前5行
- x-y轴分别为两次考试的分数
- 正负示例需要用不同的标记显示(不同的颜色)
1.2 实现
在前部分练习中所绘制的数据分布图中可以看出,在不同标识的数据点间,有一个较为清晰的决策边界。现在需要实现逻辑回归,并使用逻辑回归来训练模型用以预测分类结果。
1.2.1 Sigmoid函数
在正式开始之前,我们先来了解一个函数:Sigmoid函数。 我们还记得逻辑回归假设的定义是:
ℎ𝜃(𝑥)=𝑔(𝜃𝑇𝑋)
其中 g 代表一个常用的逻辑函数为S形函数(Sigmoid function),公式为:
𝑔(𝑧)=11+𝑒−𝑧
合起来,我们得到逻辑回归模型的假设函数:
ℎ𝜃(𝑥)=11+𝑒−𝜃𝑇𝑋
接下来,你需要编写代码实现Sigmoid函数,编写后试着测试一些值,如果x的正值较大,则函数值应接近1;如果x的负值较大,则函数值应接近0。而对于x等于0时,则函数值为0.5。
确保在进行调用你实现的Sigmoid函数后,以下代码会输出如下的图片:
1.2.2 代价函数和梯度
1.2.2.1 代价函数
我们知道逻辑回归的代价函数是:
现在,你需要编写代码实现代价函数以进行逻辑回归的成本计算,并且经过所给数据测试后,初始的成本约为0.693。
要点:
- 实现cost函数,参数为theta,X,y.
- 返回计算的成本值。
- 其中theta为参数,X为训练集中的特征列,y为训练集的标签列,三者均为矩阵。
1.2.2.2 梯度下降
接下来,我们需要编写代码实现梯度下降用来计算我们的训练数据、标签和一些参数 𝜃
的梯度。
要点:
- 代码实现gradient函数,参数为theta,X,y.
- 返回计算的梯度值。
- 其中theta为参数,X为训练集中的特征列,y为训练集的标签列,三者均为矩阵。
批量梯度下降转化为向量化计算:
这里需要注意的是,我们实际上没有在这个函数中执行梯度下降,我们仅仅在计算一个梯度步长。由于我们使用Python,我们可以用SciPy的optimize命名空间来做同样的事情。
1.2.3 寻找最优参数
现在可以用SciPy’s truncated newton(TNC)实现寻找最优参数。
让我们看看在这个结论下代价函数的值:
1.2.4 评估逻辑回归
接下来,我们需要编写代码实现预测函数,用所学的最优参数 𝜃
来为数据集X输出预测结果。然后,可以使用这个函数来给我们定义的分类器的训练精度进行打分。
逻辑回归的假设函数:
当 ℎ𝜃大于等于0.5时,预测 y=1
当 ℎ𝜃小于0.5时,预测 y=0。
要点:
- 代码实现predict函数,参数为theta,X.
- 返回X中的每行数据对应的预测结果。
- 其中theta为参数,X为训练集中的特征列。
2 正则化逻辑回归
在本部分练习中,我们将要通过加入正则项提升逻辑回归算法。
正则化是成本函数中的一个术语,它使算法更倾向于“更简单”的模型。这个理论助于减少过拟合,提高模型的泛化能力。
设想你是工厂的生产主管,你有一些芯片在两次测试中的测试结果。对于这两次测试,你想决定芯片是要被接受或抛弃。为了帮助你做出艰难的决定,你拥有过去芯片的测试数据集,从其中你可以构建一个逻辑回归模型。
2.1 数据可视化
与第一部分的练习类似,首先对数据进行可视化:
对于这部分数据,我们可以看出不同类别的数据点之间没有明显的线性决策界限用于划分两类数据。
因此,逻辑回归无法在此数据集上得到较好的效果,因为逻辑回归只能知道线性决策边界。
2.2 特征映射
一种能够更好地拟合数据的方法是构造从原始特征的多项式中得到的特征,即特征映射。如下图所示,作为这种映射的结果,我们的两个特征向量 𝑥1,𝑥2
(两次质量保证测试的分数)已经被转换成了28维的向量。
在这个高维特征向量上训练的逻辑回归分类器将具有更复杂的决策边界,并在二维图中绘制时呈现非线性的划分曲线。
虽然特征映射允许我们构建一个更具有表现力的分类器,但它也更容易过拟合。接下来,你需要实现正则化逻辑回归用于拟合数据,并使用正则化来帮助解决过拟合问题。
2.3 代价函数和梯度
接下来,你需要编写代码来实现计算正则化逻辑回归的代价函数和梯度,并返回计算的代价值和梯度。
正则化逻辑回归的代价函数如下:
其中 𝜆是“学习率”参数,其值会影响函数中的正则项值。且不应该正则化参数 𝜃0 。
接下来,我们需要实现正则化梯度函数,使用梯度下降法使得代价函数最小化。
因为在代价函数的计算中我们未对 𝜃0
进行正则化,所以梯度下降算法将分为两种情况:
对上面的算法中 j=1,2,…,n 时的更新式子进行调整可得:
接下来,类似于第一部分的练习中,进行变量的初始化。
接下来,使用初始化的变量值来测试你实现的代价函数和梯度函数。
2.4 寻找最优参数
现在我们可以使用和第一部分相同的优化函数来计算优化后的结果。
2.5 评估正则化逻辑回归
最后,我们可以使用第1部分中的预测函数来查看我们的方案在训练数据上的准确度。
三、小结
此次在cg平台进行的验证性实验为机器学习的两个基础实验,对python的学习有了巩固。