ex1-linearRegression
练习1:线性回归
介绍
在本练习中,您将 实现线性回归并了解其在数据上的工作原理。
在开始练习前,需要下载如下的文件进行数据上传:
- ex1data1.txt -单变量的线性回归数据集
- ex1data2.txt -多变量的线性回归数据集
在整个练习中,涉及如下的必做作业,及标号*
的选做作业:
- 实现简单示例函数----------(5分)
- 实现数据集显示的函数-------(5分)
- 计算线性回归成本的函数-----(40分)
- 运行梯度下降的功能函数-----(50分)
- 数据标准化*
- 多变量线性回归的梯度下降功能实现*
必做作业为实现单变量的线性回归;选做作业为实现多变量线性回归。
点击屏幕右上方的下载实验数据模块,选择下载,然后再依次选择点击上方的File->Open->Upload,上传刚才下载的数据集。
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 提交解决方案
在以下代码框中进行如上的实现,完成部分练习后,得到如上的相同结果即为通过。
import numpy as np
###在这里填入代码###
mat = np.zeros((5,5))
for i in range(5):mat[i][i]=1
mat
array([[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.]])
2 单变量线性回归
在该部分练习中,将实现单变量线性回归并用来预测餐车的利润。
假设你是一家餐厅的领导,正在考虑在不同的城市开设新的分店。该连锁店已经在不同的城市有了餐车,并且你能够获得每个城市的人口和利润数据。
现在需要使用这些数据来帮助你选择下一个被扩展的城市。
文件ex1data1.txt
包含线性回归问题的数据集。第一列数据对应城市人口,第二列数据对应那座城市的餐车的利润。利润为负时表示亏损。
2.1 绘制数据
在开始进入练习之前,对数据进行可视化通常很有用。对于该数据集,可以使用散点图进行可视化,因为它只有两个属性(人口、利润)。
# 引入所需要的库文件
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import os%matplotlib inline
# 数据存储路径
path = 'ex1data1.txt'# 读入相应的数据文件
data = pd.read_csv(path, header=None,names=['Population','Profit'])#查看数据的前五条
data.head(20)
Population | Profit | |
---|---|---|
0 | 6.1101 | 17.59200 |
1 | 5.5277 | 9.13020 |
2 | 8.5186 | 13.66200 |
3 | 7.0032 | 11.85400 |
4 | 5.8598 | 6.82330 |
5 | 8.3829 | 11.88600 |
6 | 7.4764 | 4.34830 |
7 | 8.5781 | 12.00000 |
8 | 6.4862 | 6.59870 |
9 | 5.0546 | 3.81660 |
10 | 5.7107 | 3.25220 |
11 | 14.1640 | 15.50500 |
12 | 5.7340 | 3.15510 |
13 | 8.4084 | 7.22580 |
14 | 5.6407 | 0.71618 |
15 | 5.3794 | 3.51290 |
16 | 6.3654 | 5.30480 |
17 | 5.1301 | 0.56077 |
18 | 6.4296 | 3.65180 |
19 | 7.0708 | 5.38930 |
接下来需要实现数据可视化的代码,该部分数据绘制出的图像应与如下相同。
要点:
- 实现散点图可视化
- 数据分布为红色点
- 标清横纵坐标名称
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wIJdMHjo-1672217455060)(1-1.png)]
###在这里填入代码###
plt.scatter(data.Population,data.Profit,color='red')
<matplotlib.collections.PathCollection at 0x7ff182b68358>
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-ItCVVlnS-1672217455062)(output_8_1.png)]
2.2 梯度下降
在该部分中,将使用梯度下降来选择合适的线性回归参数θ用以拟合给定数据集。
2.2.1 更新公式
线性回归的目的是最小化成本函数:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-HspunGV9-1672217455063)(1-2.png)]
假设hθ(X)h_{\theta}(X)hθ(X)由以下线性模型给出:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-IOFTQXuJ-1672217455063)(1-3.png)]
回顾一下,模型的参数是θj\theta_jθj的值,这些将用来调整以最小化成本J(θ)J(\theta)J(θ)。
其中一种方法是使用批量梯度下降算法,在批量梯度下降中,每次迭代地执行更新,随着梯度下降的每一步计算,参数θj\theta_jθj越来越接近能够使得成本J(θ)J(\theta)J(θ)达到最低的最佳值。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-euILZnvq-1672217455064)(1-4.png)](同时更新所有的θj\theta_jθj)
2.2.2 实现
在上一部分的练习中,我们已经将所需要用到的数据加载至变量data
中,并为其列分别进行命名。
接下来,我们在数据中添加了一个维度来拟合截距项θ0\theta_0θ0。并将初始参数值设为0,学习率α\alphaα设为0.01。
#在列索引为0处添加数据列,该列值均为1
data.insert(0, 'Ones', 1)#获取数据列数
cols = data.shape[1]#对变量X和y进行初始化,并将其数据类型转换为矩阵
X = data.iloc[:,0:cols-1]
y = data.iloc[:,cols-1:cols]
X = np.matrix(X.values)
y = np.matrix(y.values)#学习率、迭代次数的初始化
alpha = 0.01
iterations = 1500
2.2.3 计算成本J(θ)
在执行梯度下降最小化成本函数J(θ)J(\theta)J(θ)时,通过计算成本来监视收敛状态是有帮助的。
在该部分练习任务中,你需要实现一个计算成本J(θ)J(\theta)J(θ)的函数computeCost
,用于检查梯度下降实现的收敛性。
其中,X
和y
不是标量值,而是矩阵,其行代表训练集中的示例。
要点:
完成该函数后,将θ\thetaθ值初始化为0并进行成本的计算,将得到的成本值打印出来。
如果结果为32.07,则计算通过。
###在这里填入代码###
def computeCost(X, y, w):inner = np.power(((X * w) - y), 2)return np.sum(inner) / (2 * len(X))w = np.matrix(np.zeros((2,1)))
computeCost(X, y, w)
32.072733877455676
2.2.4 梯度下降
接下来,我们将实现梯度下降,给出的代码已经实现了循环结构,你只需要在每次的迭代中提供θ\thetaθ的更新。
在进行代码实现时,请确保你了解要优化的内容,和正在更新的内容。
请记住,成本J(θ)J(\theta)J(θ)为参数-被向量θ\thetaθ终止,而不是XXX和yyy。也就是说,我们将J(θ)J(\theta)J(θ)的值最小化通过改变矢量θ\thetaθ的值,而不是通过改变XXX或yyy。
验证梯度下降是否正常工作的一种好方法是查看J(θ)J(\theta)J(θ)的值,并检查该值每步是否减小。每次迭代时,代码都会调用computeCost
函数并打印成本。假设你实现了梯度下降,正确地计算成本,J(θ)J(\theta)J(θ)值永远不会增加,并且应该在算法结束时收敛到稳定值。
要点:
实现梯度下降后,需要使用最终的参数值将线性回归的拟合结果进行可视化,绘图结果需要类似如下图所示。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-5IHrXj9B-1672217455064)(1-5.png)]
###在这里填入代码###
def gradientDescent(X, y, w, alpha, iters):temp = np.matrix(np.zeros(w.shape))parameters = int(w.ravel().shape[1])cost = np.zeros(iters)for i in range(iters):error = (X * w) - yfor j in range(parameters):term = np.multiply(error, X[:,j])temp[j,0] = w[j,0] - ((alpha / len(X)) * np.sum(term))w = tempcost[i]=computeCost(X,y,w)return w, cost
print(X.shape)
print(y.shape)
print(theta.shape)
print(alpha)
(97, 2)
(97, 1)
(1, 2)
0.01
g,cost = gradient(X, y, theta, alpha, iterations)
# 计算最终的参数所得到的成本值computeCost(X, y, g)
---------------------------------------------------------------------------ValueError Traceback (most recent call last)<ipython-input-233-995c7017ff12> in <module>
----> 1 g,cost = gradient(X, y, theta, alpha, iterations)2 # 计算最终的参数所得到的成本值3 4 computeCost(X, y, g)<ipython-input-209-7d1d6bc49c50> in gradient(X, y, theta, alpha, iters)11 temp[0,j] = theta[0,j]-((alpha/len(X)))*np.sum(term) #梯度下降的错误率汇总12 theta = temp;
---> 13 cost[i] = computeCost(X,y,theta)14 return theta,cost15 print(X.shape)<ipython-input-231-679de0b02568> in computeCost(X, y, w)1 ###在这里填入代码###2 def computeCost(X, y, w):
----> 3 inner = np.power(((X * w) - y), 2)4 return np.sum(inner) / (2 * len(X))5 /opt/conda/lib/python3.6/site-packages/numpy/matrixlib/defmatrix.py in __mul__(self, other)218 if isinstance(other, (N.ndarray, list, tuple)) :219 # This promotes 1-D vectors to row vectors
--> 220 return N.dot(self, asmatrix(other))221 if isscalar(other) or not hasattr(other, '__rmul__') :222 return N.dot(self, other)<__array_function__ internals> in dot(*args, **kwargs)ValueError: shapes (97,2) and (1,2) not aligned: 2 (dim 1) != 1 (dim 0)
###在这里填入代码###
#对拟合曲线进行绘制x = np.linspace(data.Population.min(), data.Population.max(), 100)
f = g[0, 0] + (g[0, 1] * x)fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'b')
ax.scatter(data.Population, data.Profit, c='red')
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
Text(0.5, 1.0, 'Predicted Profit vs. Population Size')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-9pzX8TsI-1672217455065)(output_16_1.png)]
2.3 可视化成本函数
为了更好地理解成本函数的迭代计算,将每一步计算的cost值进行记录并绘制。
fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iterations), cost, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
Text(0.5, 1.0, 'Error vs. Training Epoch')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6a4EleEW-1672217455065)(output_18_1.png)]
选做练习
3 多变量线性回归
在该部分中,将使用多个变量来实现用线性回归预测房屋价格。假设你目前正在出售房屋,想知道什么是好的市场价格。
一种方法是首先收集最近出售房屋的信息,其次是建立房屋价格模型。
文件ex1data2.txt
包含俄勒冈州波特兰市的房屋价格及相关信息。第一列是房屋的大小(以平方英尺为单位),第二列是卧室的个数,第三列是房屋的价格。
3.1 特征标准化
以下代码将从文件ex1data2.txt
文件中加载并显示该数据集。
通过观察这些数据,可以发现房屋的大小大约是卧室数量的1000倍。而当不同的特征值之间相差几个数量级时,将特征进行缩放可以使梯度下降收敛得更快。
path = 'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head()
Size | Bedrooms | Price | |
---|---|---|---|
0 | 2104 | 3 | 399900 |
1 | 1600 | 3 | 329900 |
2 | 2400 | 3 | 369000 |
3 | 1416 | 2 | 232000 |
4 | 3000 | 4 | 539900 |
在该部分练习中,你的任务是编写代码并实现数据集中的数据标准化。
要点:
- 从数据集中减去每个特征的平均值。
- 减去平均值后,再将新的特征值除以各自的“标准差”
标准差是一种衡量特定特征的值的范围内有多大变化的方法(大多数数据点将位于平均值的两个标准差内);这是取值范围的替代方法。
当标准化特征时,需要存储用于标准化的值——平均值和标准差。从模型中学习参数后,经常需要预测新的房屋的价格。此时给定一个新的xxx值(房屋面积和卧室数量),必须首先使用先前从训练集中计算的平均值和标准差来对新的数据进行标准化。
###在这里填入代码###
data2 = (data2-data2.mean()) / data2.std()
data.head()
Ones | Population | Profit | |
---|---|---|---|
0 | 1 | 6.1101 | 17.5920 |
1 | 1 | 5.5277 | 9.1302 |
2 | 1 | 8.5186 | 13.6620 |
3 | 1 | 7.0032 | 11.8540 |
4 | 1 | 5.8598 | 6.8233 |
3.2 梯度下降
在之前的练习中,我们使用单变量线性回归实现了梯度下降的问题。在该部分联系中,唯一的区别是,此时我们的数据变为矩阵XXX。
假设函数和批次梯度下降的更新规则保持不变,你的任务是代码实现多变量线性回归的成本函数和梯度下降。
要点:
- 确保你的代码中可以支持任何大小的数据,并且数据均已被向量化。
- 代码实现成本函数和梯度下降后,最终的成本值应大约为0.13。
- 请依照单变量线性回归练习中要求,绘制成本的变化曲线。
###在这里填入代码#### set X (training data) and y (target variable)
cols = data2.shape[1]
X2 = data2.iloc[:,0:cols-1]
y2 = data2.iloc[:,cols-1:cols]##====================== 在这里填入代码 ======================= # convert to matrices and initialize theta
X2 = np.matrix(X2.values)
y2 = np.matrix(y2.values)
w2 = np.matrix(np.zeros((2,1)))print(X2.shape)
print(y2.shape)
print(w2.shape)
# perform linear regression on the data set
w2_final, cost2_final = gradientDescent(X2, y2, w2, alpha, iterations)# perform linear regression on the data set##=============================================================
# get the cost (error) of the model
print('The weight vector:\n',w2_final)
computeCost(X2, y2, w2_final)fig, ax = plt.subplots(figsize=(9,6))
ax.plot(np.arange(iterations), cost2_final, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Iterations')
(47, 2)
(47, 1)
(2, 1)
The weight vector:[[ 0.88404235][-0.05245518]]Text(0.5, 1.0, 'Error vs. Iterations')
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-eq1qAFET-1672217455066)(output_24_2.png)]
ex1-linearRegression相关推荐
- 吴恩达机器学习课后作业ex1(python实现)
作业介绍 吴恩达老师的作业资源可以在github或者网上找到 . ex1主要是对线性回归的一些复习和梯度下降.损失函数等的具体代码实现. pdf文件是对作业的说明.文件夹则是作业数据的各种格式,pyt ...
- spark mllib 预测之LinearRegression(线性回归)
为什么80%的码农都做不了架构师?>>> 商品价格与消费者输入之间的关系 商品需求(y, 吨),价格(x1, 元),消费者收入(x2, 元) y x1 x2 5 1 1 8 1 ...
- 【Python-ML】SKlearn库线性回归器LinearRegression
# -*- coding: utf-8 -*- ''' Created on 2018年1月24日 @author: Jason.F @summary: 有监督回归学习-基于最小二乘法构建线性回归模型 ...
- 吴恩达机器学习Ex1
本次是week2 Linear Regression 的作业情况. 作业得分情况 作业代码 通过执行ex1.m文件获得想要的结果,其他函数为该文件所调用. ex1.m文件 %% Machine Lea ...
- 【深度学习】Tensorflow完成线性回归对比机器学习LinearRegression()
首先构建一个线性的点状图 import warnings warnings.filterwarnings('ignore') import numpy as np import matplotlib. ...
- 机器学习--线性回归(LinearRegression)
机器学习–线性回归 基本概念 LinearRegression 拟合一个带有系数 w=(w1,...,wp)w = (w_1, ..., w_p)w=(w1,...,wp) 的线性模型,使得数据集 ...
- Python数据挖掘学习笔记】九.回归模型LinearRegression简单分析氧化物数据
#2018-03-23 16:26:20 March Friday the 12 week, the 082 day SZ SSMR [Python数据挖掘学习笔记]九.回归模型LinearRegre ...
- 吴恩达机器学习编程题ex1上 单变量线性回归: (python版含题目要求、代码、注解)
不得不说安卓老师是真的用心良苦,给我们把编程题弄成了填空题,但是很可惜原版使用的是Octave和MATLAB所以作为初学者我就直接当编程题用python去做了 问题:让你绘制一个5阶单位阵 答案: ...
- Sklearn——用Sklearn实现线性回归(LinearRegression)
文章目录 1.前言 2.Sklearn实战线性回归 2.1.导入必要模块 2.2.加载数据 2.3.训练+预测 1.前言 Sklearn 中的datasets,很多而且有用,可以用来学习算法模型. 比 ...
- sklearn 细节 —— LinearRegression、Ridge
sklearn 细节,主要关注: 除了 fit.transform等常用接口之外,其他成员,能够展示训练过程.训练结果的其他成员: 原理性的东西: 0. basics LinearRegression ...
最新文章
- java事件处理模型_从零开始理解JAVA事件处理机制(3)
- 第四章,简答题4-5,2017-4-6
- 贝聊运维自动化体系演化
- boost::graph模块实现读graph文件.dat的测试程序
- hashmap hash冲突怎么解决_HashMap原理及冲突之简谈
- C++ 以对象管理资源
- 13位数字转日期 oracle_12amp;13. 整数转罗马数字 - 中等amp;简单
- kaggle实战笔记_1.数据处理
- 深入学习Java虚拟机(三)
- 基于AIML2.0写一个机器人
- 精灵图,雪碧图的应用
- 增量式光电编码器原理及其结构
- VHDL实验二::半加器、一位和四位全加器(绘制原理图)
- 比较自然语言与计算机语言,计算机语言与自然语言的比较研究.pdf
- 猜java数字游戏大全_Java 猜数字游戏
- 聚合架构-晓岩企业架构系列讲座整理(0-19)
- 移动硬盘更改驱动器号和路径_如何在Windows 10中更改默认硬盘驱动器以保存文档和应用程序...
- uni-app开发的微信小程序隐藏返回首页按钮
- SPI 及 NOR Flash 介绍
- mysql格式化日期如果日期为空_为什么在使用MySQL数据库格式化日期时,此查询会提供一个空集?...
热门文章
- 八年级下计算机教师工作总结,有关于下学期初二数学教师工作总结
- 重新认识HashMap(jdk1.8新增特性)
- omv安装mysql插件_WD MyCloud安装openmediavault插件篇(完整版)
- 微信小程序获取顶部状态栏和胶囊的高度
- html如何退出登录,睡眠、退出登录和关机快捷键
- 笔记本的桌面怎么添加计算机,桌面备忘录,教您怎么在电脑桌面添加备忘录
- SeqList头文件
- 2023大数据、互联网与教育技术国际学术会议(ICBDIET 2023)
- C语言之字符串以空格分割
- 基于cocos creator画六维图