相关资料:

线性回归Python实现源码与数据集下载

吴恩达机器学习课件与课后习题下载

1. 单变量线性回归

在本练习的这一部分中, 您将使用一个变量实现线性回归, 以预测食品卡车的道具。假设你是一个餐厅的CEO, 并正在考虑开放一个在不同城市的新的网点。该连锁企业已经在各个城市拥有卡车, 你有来自城市的道具和人口的数据(ex1data1.txt)。你需要使用这些数据来帮助你选择哪座城市去扩展。这个文件包含了线性回归问题的数据集。第一列是一个城市的人口,第二列该城市的食品卡车的利润。负值代表负利润,正直代表正利润。下面是相关的Python代码

导入需要使用的包

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

导入数据集。提醒大家:一定要把数据文件ex1data1.txt放在和程序同一个文件夹里,否则需要使用绝对路径访问文件

path =  'ex1data1.txt'
data = pd.read_csv(path, header=None, names=['Population', 'Profit'])
data.head()  #预览数据

运行结果为:

注意:data.head()在没有传入参数的时候,默认显示前五位数据。

描述数据

data.describe()

运行结果为:

数据可视化,绘制散点图

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

运行结果为:

现在让我们使用梯度下降来实现线性回归,以最小化成本函数。首先,我们将创建一个以参数θ为特征函数的代价函数:

其中

根据以上公式,计算代价函数为:

def computeCost(X, y, theta):temp = np.dot(X, theta.T)-yresult = [[temp[i][j]**2 for j in range(len(temp[i]))] for i in range(len(temp))]return np.sum(result)/(2*len(temp))

让我们在训练集中添加一列,以便我们可以使用向量化的解决方案来计算代价和梯度。

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

然后做一些变量的初始化。

# 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是所有行,最后一列

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

X.head()#head()是观察前5行

y.head()

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

X = np.matrix(X.values)
y = np.matrix(y.values)
theta = np.matrix([0,0])

theta 是一个(1,2)矩阵

2. 批量梯度下降

梯度下降的公式为:

根据该式子,梯度下降的函数可以写为:

def gradientDescent(X, y, theta, alpha, iters):temp = np.matrix(np.zeros(theta.shape))parameters = int(theta.ravel().shape[1])cost = np.zeros(iters)for i in range(iters):part_1 = np.dot(X, theta.T) - yfor j in range(parameters):part_2 = np.multiply(part_1, X[:,j])temp[0,j] -= alpha * np.sum(part_2)/len(X)theta = tempcost[i] = computeCost(X, y, theta)return theta, cost

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

alpha = 0.01
iters = 1000

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

g, cost = gradientDescent(X, y, theta, alpha, iters)
g

结果为:

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

computeCost(X, y, g)

结果为:4.515955503078912

现在我们来绘制线性模型以及数据,直观地看出它的拟合。

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, 'r', label='Prediction')
ax.scatter(data.Population, data.Profit, label='Traning Data')
ax.legend(loc=2)
ax.set_xlabel('Population')
ax.set_ylabel('Profit')
ax.set_title('Predicted Profit vs. Population Size')
plt.show()

输出结果为:

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

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()

3. 多变量线性回归

在这一部分,你将完成多变量线性回归去预测房价。假设你正在售卖你的房子并且你想去了解一个好的市场价格。一个方法就是首先去收集最近房子的信息并建立一个房价预测模型,文件“exidata2.txt”中包含了波兰的房价的训练集。第一列数据是房子的大小(平方英尺),第二列是卧室的数目,第三列是房价。下面的代码来完成房价的预测:

首先,读取数据:

path =  'ex1data2.txt'
data2 = pd.read_csv(path, header=None, names=['Size', 'Bedrooms', 'Price'])
data2.head()

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

data2 = (data2 - data2.mean()) / data2.std()
data2.head()

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

# 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.130703369607711892

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

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()

4. 正规方程法

正规方程是通过求解下面的方程来找出使得代价函数最小的参数的:

假设我们的训练集特征矩阵为X(包含了X0=1)并且我们的训练集结果为向量 y,则利用正规方程解出向量 ?=(???)−1???θ=(XTX)−1XTy 。 上标T代表矩阵转置,上标-1 代表矩阵的逆。设矩阵?=???A=XTX,则:(???)−1=?−1

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

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

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

# 正规方程
def normalEqn(X, y):A = np.dot(X.T, X).IB = np.dot(A, X.T)theta = np.dot(B,y)return theta
final_theta2=normalEqn(X, y)#感觉和批量梯度下降的theta的值有点差距
final_theta2

输出结果为:

matrix([[-3.89578088],[ 1.19303364]])

入门机器学习(三)--课后作业解析-线性回归(Python实现)相关推荐

  1. 入门机器学习(十)--课后作业解析-神经网络(Python实现)

    源代码与数据集 对于这个练习,我们将处理手写数字数据集,这次使用反向传播的前馈神经网络. 我们将通过反向传播算法实现神经网络成本函数和梯度计算的非正则化和正则化版本. 我们还将实现随机权重初始化和使用 ...

  2. 入门机器学习(六)--课后作业解析-logistics回归(python实现)

    相关资料: 逻辑回归Python实现源码与数据集下载 吴恩达机器学习课件与课后习题下载 编程作业2 logistic_regression(逻辑回归) 推荐运行环境:python 3.6 建立一个逻辑 ...

  3. java课后习题七解析_《Java基础入门》_课后习题解析.doc

    <Java基础入门>_课后习题解析 <Java基础入门>课后习题 Java开发入门 一.填空题 1.Java的三大体系分别是_JavaSE_____._JavaEE_____. ...

  4. 入门机器学习(十二)--课后作业解析-偏差与方差(Python 实现)

    在本次作业中,我们要完成的是预测水库水位的变化预测大坝流出的水量.已知特征为水库的水位,要预测的y是大坝流出的水量. 编程作业 5 - 偏差和方差 这次练习我们将会看到如何使用课上的方法改进机器学习算 ...

  5. 吴恩达机器学习课后作业ex1(python实现)

    作业介绍 吴恩达老师的作业资源可以在github或者网上找到 . ex1主要是对线性回归的一些复习和梯度下降.损失函数等的具体代码实现. pdf文件是对作业的说明.文件夹则是作业数据的各种格式,pyt ...

  6. 吴恩达机器学习课后作业ex3(python实现)

    ex3是机器学习中经典的手写数字识别(使用逻辑回归分类),给出的数据是.mat后缀,可以用python中load方法加载数据.手写体"1"到"9"的类别分别标为 ...

  7. 入门机器学习(十七)--编程作业-K-means和PCA(Python实现)

    编程作业-K-means和PCA K-means 聚类 Principal component analysis(主成分分析) 在本练习中,我们将实现K-means聚类,并使用它来压缩图像. 我们将从 ...

  8. 计算机组成原理 第三章【存储系统】课后作业解析【MOOC答案】

    目   录 第1题 第2题 第3题 第4题 第5题 第1题 1 ( 26分 ) 解释概念:Cache.主存.辅存.虚存.RAM.SRAM.DRAM.ROM.MROM.PROM.EPROM.EEPROM ...

  9. python 课后作业_python 学习笔记 三 课后作业

    # 1.有变量name = "aleX leNb"完成如下操作: # 1,移除name变量对应的值两边的空格,并输出处理结果 """ name = ' ...

最新文章

  1. 排序算法之直接插入排序
  2. java 老年代回收_Java垃圾回收之老年代垃圾收集器
  3. python将数据存入数据库_python3 两种方法将数据存入mysql数据库
  4. boost::shared_ptr用法测试程序
  5. 如何让开关打开_安卓手机如何打开USB调试模式
  6. linux文本处理脚本题,Linux文本处理工具sed练习题
  7. php excel header,【IT专家】PHP生成excel,方法一-header生成
  8. String.raw()方法
  9. ArcMap自定义脚本工具制作
  10. Gym102174 (The 14-th BIT Campus Programming Contest)
  11. 台服海岛纪元显示无法连接服务器,打开海岛纪元提示网络异常或者连接不上
  12. 光立方体c语言程序,444光立方程序怎么写 光立方原理图、源代码及制作教程
  13. Opencv之疲劳检测
  14. 小狼毫[rime_win][眀月拼音]简单配置方法
  15. 青出于蓝而胜于蓝 — Vue.js对Angular.js的那些进步
  16. vijos 1641 Vs Snowy
  17. ps界面为啥突然变大了_PS修图教程,如何把把照片变得更有质感
  18. 五种常用的Web安全认证方式
  19. 在VMware上如何创建虚拟机并安装linux操作系统,以及虚拟机的账户密码破解
  20. 网课查题极速响应系统-公众号查题

热门文章

  1. 最详细的FCN论文笔记
  2. 鸿蒙(HarmonyOS)刷机指南
  3. android 底部黑边,android – 截屏周围的黑色边缘
  4. table表格的增删查改、图片的处理、数据的导入导出
  5. 从零开始实现数据结构(一) 动态数组
  6. 安恒杯月赛 babypass getshell不用英文字母和数字
  7. 清除无用工具栏:CommandbarCleaner下载
  8. 数组巧去重new Set
  9. 转:谈谈Unicode编码,简要解释UCS、UTF、BMP、BOM等名词
  10. 把你的项目升级到IE8