吴恩达机器学习课后作业ex1
题目大体意思就是输入的是某地的人口,输出的是某地方的收益。
题目及数据集下载:
https://wwa.lanzous.com/b054sprza 密码:ba3w
大体模型如下图:现在X前边加一列值为1的列,然后求解两个参数theta1和theta2,这样求解和y=kx+b,求k与b一样,只不过是通过下边这种方法求解,模型更有适应性,可以更适应其他相似的模型。

1.计算损失
1.1计算损失的公式:
\]
# 计算损失
def computeLoss(x, y, theta):
error=np.power(x.dot(theta) - y, 2)
# print(error)
return np.sum(error)/(2*len(X))
2.多变量梯度下降
2.1根据上边计算损失的公式求导得计算梯度的公式:
\]
\]
代码里边各个元素的含义:

error:红框
xj:蓝框
term:绿框
temp:紫框
# 多变量梯度下降
def gradient(x,y,theta,learningrate,iters):
temp = np.zeros(theta.shape) # [2,1]
param = theta.size # 要学习参数的个数,2
for i in range(iters):
error = x @ theta - y # 数学矩阵相乘,[97,2]@[2,1]=[97,1]
for j in range(param):
xj=x[:,j].reshape(np.shape(x)[0],1) # 取X的第j列,[97,1]
term = error*xj # 对应元素相乘,[97,1]*[97,1]=[97,1]
temp[j,0]=theta[j,0]-learningrate*np.sum(term)/len(x) # 计算所有的损失和
theta = temp
return theta
最后的总代码:
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
lr=0.01 # 训练速率
Iters = 5000 # 训练次数
# 计算损失
def computeLoss(x, y, theta):
loss=np.power(x.dot(theta) - y, 2)
return np.sum(loss)/(2*len(X))
# 多变量梯度下降
def gradient(x,y,theta,learningrate,iters):
temp = np.zeros(theta.shape) # [2,1]
param = theta.size # 要学习参数的个数,2
for i in range(iters):
error = x @ theta - y # 数学矩阵相乘,[97,2]@[2,1]=[97,1]
for j in range(param):
xj=x[:,j].reshape(np.shape(x)[0],1) # 取X的第j列,[97,1]
term = error*xj # 对应元素相乘,[97,1]*[97,1]=[97,1]
temp[j,0]=theta[j,0]-learningrate*np.sum(term)/len(x) # 计算所有的损失和
theta = temp
return theta
if __name__ == '__main__':
# 1.1先拿到数据
path='ex1data1.txt'
data=pd.read_csv(path,header=None,names=['Population','Profit'])
# 1.2看一下数据大体什么样子
print(data.head())
print(data.describe())
# 1.3进行数据处理,在数据第0列前边加一列
data.insert(0,'Ones',1)
print(data.head())
# 1.4将X和Y分开,
cols=data.shape[1]
X=data.iloc[:,0:cols-1]
Y=data.iloc[:,cols-1:]
print(X.head())
print(Y.head())
# 1.5将数据转换成numpy格式
X=np.array(X)
Y=np.array(Y)
# 创建要训练的参数,并设置成两行一列向量
theta=np.array([1,1]).reshape([2,1])
# 1.6再看一下数据的各个形状
print(X.shape,Y.shape,theta.shape)
print(theta)
# 2.计算损失
print(computeLoss(X,Y,theta))
# 3.优化损失
theta=gradient(X,Y,theta,lr,Iters)
print(theta)
print(computeLoss(X,Y,theta))
# 求得最后的损失为4.476971407448775
# 求得theta1和theta2为[-3.8951929 , 1.19297458]
# 4.用plt绘制一下最后的图形
# 绘制直线
x = np.arange(5, 22.5)
y = theta[0]+x*theta[1]
plt.plot(x, y)
# 绘制散点
plt.scatter(X[:,1], Y)
plt.show()
吴恩达机器学习课后作业ex1的更多相关文章
- coursera吴恩达 机器学习编程作业原文件 及我的作业
保存在github上供广大网友下载:点击 8个zip,原文件,没有任何改动. 另外,不定期上传我自己关于这门课的学习过程笔记和心得,有兴趣的盆友可以点击这里查看.
- ML:吴恩达 机器学习 课程笔记(Week1~2)
吴恩达(Andrew Ng)机器学习课程:课程主页 由于博客编辑器有些不顺手,所有的课程笔记将全部以手写照片形式上传.有机会将在之后上传课程中各个ML算法实现的Octave版本. Linear Reg ...
- 吴恩达机器学习-终于完成ex4
几年前就想学习吴恩达的老课-机器学习,学了n次都没有坚持下来.其实很多东西都是这样,开始的时候信誓旦旦,信心满满,慢慢的就泄气了. 每天铺天盖地的深度学习,人工智能听得耳朵都要起茧子了.这算法,那框架 ...
- 用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)
Google TensorFlow程序员点赞的文章! 前言 目录: - 向量表示以及它的维度 - rnn cell - rnn 向前传播 重点关注: - 如何把数据向量化的,它们的维度是怎么来的 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业(线性回归)
一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业
一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)
多分类问题——识别手写体数字0-9 一.逻辑回归解决多分类问题 1.图片像素为20*20,X的属性数目为400,输出层神经元个数为10,分别代表1-10(把0映射为10). 通过以下代码先形式化展示数 ...
- Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业(逻辑回归)
一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...
- Coursera 吴恩达 机器学习 学习笔记
Week 1 机器学习笔记(一)基本概念与单变量线性回归 Week 2 机器学习笔记(二)多元线性回归 机器学习作业(一)线性回归——Matlab实现 机器学习作业(一)线性回归——Python( ...
随机推荐
- centos7挂载硬盘(大于2T)
配置方法: 1.root账户下,执行 fdisk -l 命令查看挂载的硬盘设备,假设设备号为/dev/sdb,接下来我们使用parted命令来进行GPT分区 2.使用parted命令进行GPT分区 # ...
- minio通过docker方式部署
MinIO 是在 GNU Affero 通用公共许可证 v3.0 下发布的高性能对象存储. 它是与 Amazon S3 云存储服务兼容的 API 官方文档http://docs.minio.org.c ...
- golang官方包管理vendor模式无法引用非go文件
主页 微信公众号:密码应用技术实战 博客园首页:https://www.cnblogs.com/informatics/ 背景&问题 golang作为高级计算机语言之一,在云原生以及web网站 ...
- Git修改最近一次提交的日志信息
一.问题由来 当前自己所在的项目组中,每次发完一个版本后,就需要创建个人新版本的git提交凭证,其实就是系统自动 生成的一串编码,如果没有这个凭证,代码是提交不了的,这是公司制定的开发规范之一.这两天 ...
- [VueJsDev] 快速入门 - vscode 设置推荐
[VueJsDev] 目录列表 https://www.cnblogs.com/pengchenggang/p/17037320.html vscode设置推荐 ::: details 目录 目录 v ...
- WebStorm 没有找到本地修改记录LocalChanges,怎么查看本地修改记录
一直用IDEA做后端Java开发,也写过vue+elementUI的前端代码,但前后端都放在一个项目里写,本地修改代码记录,可以在git-LocalChanges中查看修改记录. 最近前后端分离,自己 ...
- 工作记录:TypeScript从入门到项目实战(项目篇)
Vue项目中使用 前面两篇介绍过TypeScript基础和较深入的东西,本章介绍如何在Vue项目中使用. 项目创建 创建项目直接使用Vue-cli创建 下面是步骤: 1.运行vuecli, 2.选择合 ...
- 记录--10个超级实用的Set、Map使用技巧
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 Set是一种类似于数组的数据结构,但是它的值是唯一的,即Set中的每个值只会出现一次.Set对象的实例可以用于存储任何类型的唯一值,从而使 ...
- 记录--for in 和 for of的区别详解以及为for in的输出顺序
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 for in 和 for of 相对于大家肯定都不陌生,都是用来遍历属性的没错.那么先看下面的一个例子: 例1 const obj = { ...
- FFmpeg开发笔记(四)FFmpeg的动态链接库介绍
FFmpeg不仅提供了ffmpeg.ffplay和ffprobe三个可执行程序,还提供了八个工具库,使得开发者能够调用库里面的函数,从而实现更精准的定制化开发需求.这八个库的名字是avcodec.av ...