题目大体意思就是输入的是某地的人口,输出的是某地方的收益。

题目及数据集下载:

https://wwa.lanzous.com/b054sprza 密码:ba3w

大体模型如下图:现在X前边加一列值为1的列,然后求解两个参数theta1和theta2,这样求解和y=kx+b,求k与b一样,只不过是通过下边这种方法求解,模型更有适应性,可以更适应其他相似的模型。

1.计算损失

1.1计算损失的公式:

\[loss={(X_{i1}\theta1+X_{i2}\theta2-Y_{i1})}^{2}
\]
# 计算损失
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根据上边计算损失的公式求导得计算梯度的公式:

\[\frac{\partial{loss}}{\partial{\theta1}}=\frac{1}{N}\sum_{i=1}^{n}{(X_{i1}\theta1+X_{i2}\theta2-Y_{i1})}*X_{i1}
\]
\[\frac{\partial{loss}}{\partial{\theta2}}=\frac{1}{N}\sum_{i=1}^{n}{(X_{i1}\theta1+X_{i2}\theta2-Y_{i1})}*X_{i2}
\]

代码里边各个元素的含义:

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的更多相关文章

  1. coursera吴恩达 机器学习编程作业原文件 及我的作业

    保存在github上供广大网友下载:点击 8个zip,原文件,没有任何改动. 另外,不定期上传我自己关于这门课的学习过程笔记和心得,有兴趣的盆友可以点击这里查看.

  2. ML:吴恩达 机器学习 课程笔记(Week1~2)

    吴恩达(Andrew Ng)机器学习课程:课程主页 由于博客编辑器有些不顺手,所有的课程笔记将全部以手写照片形式上传.有机会将在之后上传课程中各个ML算法实现的Octave版本. Linear Reg ...

  3. 吴恩达机器学习-终于完成ex4

    几年前就想学习吴恩达的老课-机器学习,学了n次都没有坚持下来.其实很多东西都是这样,开始的时候信誓旦旦,信心满满,慢慢的就泄气了. 每天铺天盖地的深度学习,人工智能听得耳朵都要起茧子了.这算法,那框架 ...

  4. 用纯Python实现循环神经网络RNN向前传播过程(吴恩达DeepLearning.ai作业)

    Google TensorFlow程序员点赞的文章!   前言 目录: - 向量表示以及它的维度 - rnn cell - rnn 向前传播 重点关注: - 如何把数据向量化的,它们的维度是怎么来的 ...

  5. Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业

    一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...

  6. Coursera-AndrewNg(吴恩达)机器学习笔记——第二周编程作业(线性回归)

    一.准备工作 从网站上将编程作业要求下载解压后,在Octave中使用cd命令将搜索目录移动到编程作业所在目录,然后使用ls命令检查是否移动正确.如: 提交作业:提交时候需要使用自己的登录邮箱和提交令牌 ...

  7. Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业

    一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...

  8. Coursera-AndrewNg(吴恩达)机器学习笔记——第四周编程作业(多分类与神经网络)

    多分类问题——识别手写体数字0-9 一.逻辑回归解决多分类问题 1.图片像素为20*20,X的属性数目为400,输出层神经元个数为10,分别代表1-10(把0映射为10). 通过以下代码先形式化展示数 ...

  9. Coursera-AndrewNg(吴恩达)机器学习笔记——第三周编程作业(逻辑回归)

    一. 逻辑回归 1.背景:使用逻辑回归预测学生是否会被大学录取. 2.首先对数据进行可视化,代码如下: pos = find(y==); %找到通过学生的序号向量 neg = find(y==); % ...

  10. Coursera 吴恩达 机器学习 学习笔记

    Week 1 机器学习笔记(一)基本概念与单变量线性回归 Week 2   机器学习笔记(二)多元线性回归 机器学习作业(一)线性回归——Matlab实现 机器学习作业(一)线性回归——Python( ...

随机推荐

  1. spring 注入参数时为list map写法用例

    导包基础:这了让服务器支持json 需要导入下面包 <dependency> <groupId>com.alibaba</groupId> <artifact ...

  2. 真实开发中-redis在项目中的应用场景

    一.需求描述 从自己当前负责参与开发的一个项目中来看,redis主要的应用场景有如下几个,第一个是保存用户信息,这个需要频繁的获取.比如 在打开某一个页面进行查询时,就先需要获取用户信息,看用户是否具 ...

  3. 宝塔Linux面板 https://www.bt.cn/ 服务器环境搭建软件

    宝塔Linux面板 https://www.bt.cn/

  4. C++学习笔记之高级语法

    目录 高级语法 面向对象--类 对象的属性 运算符重载 拷贝构造函数 IO缓存 头文件的重复包含问题 深拷贝与浅拷贝 面向对象三大特性 高级语法 面向对象--类 C++使用struct.class来定 ...

  5. 风控规则引擎(一):Java 动态脚本

    风控规则引擎(一):Java 动态脚本 日常场景 共享单车会根据微信分或者芝麻分来判断是否交押金 汽车租赁公司也会根据微信分或者芝麻分来判断是否交押金 在一些外卖 APP 都会提供根据你的信用等级来发 ...

  6. 安装swagger过程及遇到问题

    参考:欢迎点击原文:https://www.cnblogs.com/liconglong/p/11477401.html(主要) https://blog.csdn.net/liangjiabao55 ...

  7. 公开的Webservice集锦

    备注:以下所有的来自 互联网,版权归原作者所有 股票行情数据 WEB 服务(支持香港.深圳.上海基金.债券和股票:支持多股票同时查询) Endpoint: http://webservice.webx ...

  8. String类为什么要用final修饰?

    final修饰符的意义? https://www.cnblogs.com/loren-Yang/p/13380318.html String类被实现的目标是什么? 效率和安全 如何实现期望? 参考文献 ...

  9. TP6框架--EasyAdmin学习笔记:项目初始化+环境配置

    最近在研究一个基于TP6的框架EasyAdmin,这里分享下我的开发心得 首先要获取原始项目文件 这里是git地址 https://github.com/zhongshaofa/easyadmin 项 ...

  10. 记录--elementui源码学习之仿写一个el-button

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 本篇文章记录仿写一个el-button组件细节,从而有助于大家更好理解饿了么ui对应组件具体工作细节.本文是elementui源码学习仿写 ...