机器学习作业 1 - 线性回归

1.单变量线性回归

导入需要使用的包

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

导入数据集。提醒大家:一定要把数据文件ex1data1.txt放在和程序同一个文件夹里,否则需要使用绝对路径访问文件
将csv文件读入并转化为数据框形式,路径,指定哪一行作为表头。默认设置为0(即第一行作为表头),如果没有表头的话,要修改参数,设置header=None,
指定列的名称,用列表表示。一般我们没有表头,即header=None时,这个用来添加列名
在默认情况下,head命令显示文件的头5行内容

path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
data.head()  #预览数据
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

对于数值数据,结果的索引将包括计数,平均值,标准差,最小值,最大值以及较低的百分位数和50。默认情况下,较低的百分位数为25,较高的百分位数为75.50百分位数与中位数相同。

data.describe()
Population Profit
count 97.000000 97.000000
mean 8.159800 5.839135
std 3.869884 5.510262
min 5.026900 -2.680700
25% 5.707700 1.986900
50% 6.589400 4.562300
75% 8.578100 7.046700
max 22.203000 24.147000

数据可视化,绘制散点图 kind: 取值为 line 或者 scatter, 后者为默认值 图像大小

data.plot(kind='scatter', x='Population', y='Profit', figsize=(12,8))
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-YA2zXIlR-1579357526501)(output_9_0.png)]

现在让我们使用梯度下降来实现线性回归,以最小化成本函数。 以下代码示例中实现的方程在“练习”文件夹中的“ex1.pdf”中有详细说明。

首先,我们将创建一个以参数θ为特征函数的代价函数
J(θ)=12m∑i=1m(hθ(x(i))−y(i))2J\left( \theta \right)=\frac{1}{2m}\sum\limits_{i=1}^{m}{{{\left( {{h}_{\theta }}\left( {{x}^{(i)}} \right)-{{y}^{(i)}} \right)}^{2}}}J(θ)=2m1​i=1∑m​(hθ​(x(i))−y(i))2
其中:\[{{h}{\theta }}\left( x \right)={{\theta }^{T}}X={{\theta }{0}}{{x}{0}}+{{\theta }{1}}{{x}{1}}+{{\theta }{2}}{{x}{2}}+…+{{\theta }{n}}{{x}_{n}}\]

np.power(x1,x2)数组的元素分别求n次方。x2可以是数字,也可以是数组,但是x1和x2的列数要相同

def computeCost(X, y, theta):# your code here  (appro ~ 2 lines)inner = np.power(((X*theta.T)-y),2)return np.sum(inner)/(2*len(X))

让我们在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。在训练集的左侧插入一列全为“1”的列,以便计算即x0=1
loc为0,name为ones,value为1.

data.insert(0, 'Ones', 1)

现在我们来做一些变量初始化。.shape[0] 为第一维的长度,shape[1] 为第二维的长度理解列.pandas中利用.iloc选取数据iloc’,’ 前的部分标明选取的行,‘,’后的部分标明选取的列 此时三列了

# set X (training data) and y (target variable)
cols = data.shape[1]
X = data.iloc[:,0:cols-1]#X是所有行,去掉最后一列
y = data.iloc[:,cols-1:cols]

观察下 X (训练集) and y (目标变量)是否正确.

X.head()#head()默认是观察前5行
Ones Population
0 1 6.1101
1 1 5.5277
2 1 8.5186
3 1 7.0032
4 1 5.8598
y.head()
Profit
0 17.5920
1 9.1302
2 13.6620
3 11.8540
4 6.8233

代价函数是应该是numpy矩阵,所以我们需要转换X和Y,然后才能使用它们。 我们还需要初始化theta,即把theta所有元素都设置为0.

X = np.matrix(X.values)
y = np.matrix(y.values)
# your code here  (appro ~ 1 lines)
theta = np.matrix(np.array([0,0]))

theta 是一个(1,2)矩阵

theta
matrix([[0, 0]])

看下维度

X.shape, theta.shape, y.shape
((97, 2), (1, 2), (97, 1))

计算代价函数 (theta初始值为0).

computeCost(X, y, theta)
32.072733877455676

2.batch gradient decent(批量梯度下降)

θj:=θj−α∂∂θjJ(θ){{\theta }_{j}}:={{\theta }_{j}}-\alpha \frac{\partial }{\partial {{\theta }_{j}}}J\left( \theta \right)θj​:=θj​−α∂θj​∂​J(θ)

def gradientDescent(X, y, theta, alpha, iters):temp = np.matrix(np.zeros(theta.shape)) #构建零值矩阵parameters = int(theta.ravel().shape[1])# ravel计算需要求解的参数个数 功能将多维数组降至一维cost = np.zeros(iters) #构建iters个0的数组for i in range(iters):# your code here  (appro ~ 1 lines)error = (X * theta.T) - yfor j in range(parameters):# your code here  (appro ~ 2 lines)term = np.multiply(error, X[:,j])#计算两矩阵(hθ(x)-y)xtemp[0,j] = theta[0,j] - ((alpha / len(X)) * np.sum(term))# your code here  (appro ~ 2 lines)    theta = tempcost[i] = computeCost(X, y, theta)return theta, cost

初始化一些附加变量 - 学习速率α和要执行的迭代次数。

alpha = 0.01
iters = 1000

现在让我们运行梯度下降算法来将我们的参数θ适合于训练集。

g, cost = gradientDescent(X, y, theta, alpha, iters)
g
matrix([[-3.24140214,  1.1272942 ]])

最后,我们可以使用我们拟合的参数计算训练模型的代价函数(误差)。

computeCost(X, y, g)
4.515955503078912

现在我们来绘制线性模型以及数据,直观地看出它的拟合。fig代表整个图像,ax代表实例

x = np.linspace(data.Population.min(), data.Population.max(), 100)#抽100个样本
f = g[0, 0] + (g[0, 1] * x)#g[0,0] 代表theta0 , g[0,1] 代表theta1fig, ax = plt.subplots(figsize=(12,8))
ax.plot(x, f, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=4)#显示标签位置
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-wXgnzmMI-1579357526503)(output_38_0.png)]

由于梯度方程式函数也在每个训练迭代中输出一个代价的向量,所以我们也可以绘制。 请注意,代价总是降低 - 这是凸优化问题的一个例子。

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oKcqswrI-1579357526504)(output_40_0.png)]

3.多变量线性回归

练习1还包括一个房屋价格数据集,其中有2个变量(房子的大小,卧室的数量)和目标(房子的价格)。 我们使用我们已经应用的技术来分析数据集。

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

对于此任务,我们添加了另一个预处理步骤 - 特征归一化。 这个对于pandas来说很简单

如果这个房子价格不归一化,它的数量级和你输入值规一化数量级差别太大,几十万的数量级和个位小数做回归,就不能保证收敛了
预测的y和实际上y几十万差的太多了

data2 = (data2 - data2.mean()) / data2.std()
data2.head()
Size Bedrooms Price
0 0.130010 -0.223675 0.475747
1 -0.504190 -0.223675 -0.084074
2 0.502476 -0.223675 0.228626
3 -0.735723 -1.537767 -0.867025
4 1.257476 1.090417 1.595389

现在我们重复第1部分的预处理步骤,并对新数据集运行线性回归程序。

# add ones column
data2.insert(0, 'Ones', 1)# 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)
theta2 = np.matrix(np.array([0,0,0]))# perform linear regression on the data set
g2, cost2 = gradientDescent(X2, y2, theta2, alpha, iters)# get the cost (error) of the model
computeCost(X2, y2, g2)
0.13070336960771892

我们也可以快速查看这一个的训练进程。

fig, ax = plt.subplots(figsize=(12,8))
ax.plot(np.arange(iters), cost2, 'r')
ax.set_xlabel('Iterations')
ax.set_ylabel('Cost')
ax.set_title('Error vs. Training Epoch')
plt.show()

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-zJSZCw0W-1579357526506)(output_49_0.png)]

4. normal equation(正规方程)(选做)

正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:∂∂θjJ(θj)=0\frac{\partial }{\partial {{\theta }_{j}}}J\left( {{\theta }_{j}} \right)=0∂θj​∂​J(θj​)=0 。
假设我们的训练集特征矩阵为 X(包含了x0=1{{x}_{0}}=1x0​=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量 θ=(XTX)−1XTy\theta ={{\left( {{X}^{T}}X \right)}^{-1}}{{X}^{T}}yθ=(XTX)−1XTy 。
上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵A=XTXA={{X}^{T}}XA=XTX,则:(XTX)−1=A−1{{\left( {{X}^{T}}X \right)}^{-1}}={{A}^{-1}}(XTX)−1=A−1

梯度下降与正规方程的比较:

梯度下降:需要选择学习率α,需要多次迭代,当特征数量n大时也能较好适用,适用于各种类型的模型

正规方程:不需要选择学习率α,一次计算得出,需要计算(XTX)−1{{\left( {{X}^{T}}X \right)}^{-1}}(XTX)−1,如果特征数量n较大则运算代价大,因为矩阵逆的计算时间复杂度为O(n3)O(n3)O(n3),通常来说当nnn小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型

np.linalg.inv求逆操作 @相当于dot() ,dot函数可以通过numpy库调用,也可以由数组实例对象进行调用。a.dot(b) 与 np.dot(a,b)效果相同。

# 正规方程
def normalEqn(X, y):# your code here  (appro ~ 1 lines)theta = np.linalg.inv(X.T@X)@X.T@yreturn theta
final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距
final_theta2
matrix([[-3.89578088],[ 1.19303364]])
#梯度下降得到的结果是matrix([[-3.24140214,  1.1272942 ]])

在练习2中,我们将看看分类问题的逻辑回归。

深度之眼_Week2 编程作业1_梯度下降相关推荐

  1. 深度学习(33)随机梯度下降十一: TensorBoard可视化

    深度学习(33)随机梯度下降十一: TensorBoard可视化 Step1. run listener Step2. build summary Step3.1 fed scalar(监听标量) S ...

  2. 深度学习(32)随机梯度下降十: 手写数字识别问题(层)

    深度学习(32)随机梯度下降十: 手写数字识别问题(层) 1. 数据集 2. 网络层 3. 网络模型 4. 网络训练 本节将利用前面介绍的多层全连接网络的梯度推导结果,直接利用Python循环计算每一 ...

  3. 深度学习(31)随机梯度下降九: Himmelblau函数优化实战

    深度学习(31)随机梯度下降九: Himmelblau函数优化实战 1. Himmelblau函数 2. 函数优化实战 1. Himmelblau函数 Himmelblau函数是用来测试后话算法的常用 ...

  4. 深度学习(30)随机梯度下降七: 多层感知机梯度(反向传播算法)

    深度学习(30)随机梯度下降八: 多层感知机梯度(反向传播算法) 1. 多层感知机模型 2. 多层感知机梯度 3. 传播规律小结 tens Recap Chain Rule Multi-output ...

  5. 深度学习(28)随机梯度下降六: 多输出感知机梯度

    深度学习(28)随机梯度下降六: 多输出感知机梯度 1. Multi-output Perceptron 2. Derivative 3. 代码 Perceptron 单输出感知机梯度 ∂E∂wj0= ...

  6. 深度学习(27)随机梯度下降五: 单输出感知机梯度

    深度学习(27)随机梯度下降五: 单输出感知机梯度 1. Perceptrnon with Sigmoid + MSE 2. Derivative 3. 代码 Recap y=XW+by=XW+by= ...

  7. 深度学习(26)随机梯度下降四: 损失函数的梯度

    深度学习(26)随机梯度下降四: 损失函数的梯度 1. Mean Squared Error(MSE) 2. Cross Entropy Loss CrossEntropy 3. Softmax (1 ...

  8. 深度学习(25)随机梯度下降三: 激活函数的梯度

    深度学习(25)随机梯度下降三: 激活函数的梯度 1. Activation Functions 2. Deriative 3. Sigmoid/Logistic (1) Derivative (2) ...

  9. 深度学习(24)随机梯度下降二: 常见函数的梯度

    深度学习(24)随机梯度下降二: 常见函数的梯度 Common Functions 1. y=xw+by=xw+by=xw+b 2. y=xw2+b2y=xw^2+b^2y=xw2+b2 3. y=x ...

  10. 深度学习(23)随机梯度下降一: 随机梯度下降简介

    深度学习(23)随机梯度下降一: 随机梯度下降简介 1. What's Gradient? 2. What does it mean? 3. How to search? 4. For instanc ...

最新文章

  1. Java并发编程—线程同步类
  2. android中组件获取焦点
  3. 大数据实时推荐系统的思考
  4. 为什么Linux内核里大量使用goto,而很多书籍却不提倡使用?
  5. Windows 10 之重新安装应用
  6. vue打包放到Java项目里_如何把vuejs打包出来的文件整合到springboot里
  7. ios 重复引用 静态库_Swift 制作静态库
  8. PHRefreshTriggerView
  9. 小牛uqi几个版本区别_川崎ZX25R便宜版本长这样?
  10. 微信小程序视频+微信视频号视频下载教程
  11. Navicat Premium 12注册码与破解解决方案
  12. 如果我来治理城市大气污染
  13. 读取金山词霸的词库程序
  14. 计算机课程培养关键能力,大学生计算机应加强自学能力培养
  15. 【转】在线网页取色器
  16. JavaScript实现手机拍摄图片的旋转、压缩
  17. 支付系统中如何应用加密方式的
  18. 什么是JavaBeans
  19. 计算机怎么把音乐调出来怎么办,五步教你轻松调出好音乐,汽车音响调音就是这么简单-音频管理器怎么设置...
  20. nao机器人c语言编程教程,NAO机器人编程学习.pdf

热门文章

  1. 关于Java的反射机制,你需要理解这些..
  2. 狂人传记:戎马半生 何以安家
  3. 静态常量static和方法重载
  4. 毕业设计 ASP.Net+EasyUI开发 X X露天矿调度管理信息系统(一)
  5. BZOJ2933 : [Poi1999]地图
  6. 使cmd窗口不自动关闭
  7. poj 3928 树状数组
  8. Win8:Setting
  9. 【mfc】vs2019创建MFC基于对话框的项目没有插入任何代码运行报错:0xC0000005:读取位置 0xFFFFFFFFFFFFFFFF 时发生访问冲突
  10. for XML path 转义