吴恩达机器学习-可选实验:特征缩放和学习率(多变量)

文章目录

    • 目标
    • 工具
    • 概念
    • 问题陈述
    • 数据集
    • 多变量梯度下降
    • 学习率
      • a=9.9e-7
      • a=9e-7
      • a=1e-7
    • 特征缩放
      • 实现
    • 恭喜
    • 致谢

目标

在本实验中,你将:

  • 利用在上一个实验中开发的多变量例程
  • 对具有多个特征的数据集运行梯度下降
  • 探讨学习率alpha对梯度下降的影响
  • 通过使用z-score归一化的特征缩放提高梯度下降的性能

工具

您将利用在上一个实验中开发的函数以及matplotlib和NumPy

import numpy as np
np.set_printoptions(precision=2)
import matplotlib.pyplot as plt
dlblue = '#0096ff'; dlorange = '#FF9300'; dldarkred='#C00000'; dlmagenta='#FF40FF'; dlpurple='#7030A0'; 
plt.style.use('./deeplearning.mplstyle')
from lab_utils_multi import  load_house_data, compute_cost, run_gradient_descent 
from lab_utils_multi import  norm_plot, plt_contour_multi, plt_equal_scale, plot_cost_i_w

当前jupyter note工作目录需要包含:
在这里插入图片描述

概念

在这里插入图片描述

问题陈述

与之前的实验一样,您将使用房价预测的激励示例。训练数据集包含许多具有4个特征(大小,卧室,楼层和年龄)的示例,如下表所示。注意,在本实验中,尺寸特征以平方英尺为单位,而早期的实验室使用1000平方英尺。这个数据集比以前的实验室要大。
我们想用这些值建立一个线性回归模型,这样我们就可以预测其他房子的价格——比如,一栋1200平方英尺、3间卧室、1层、40年的房子。

数据集

在这里插入图片描述

# load the dataset
X_train, y_train = load_house_data()
X_features = ['size(sqft)','bedrooms','floors','age']

data里面需要包含house.txt
在这里插入图片描述
让我们通过绘制每个特征与价格的关系来查看数据集及其特征。

fig,ax=plt.subplots(1, 4, figsize=(12, 3), sharey=True)
for i in range(len(ax)):ax[i].scatter(X_train[:,i],y_train)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("Price (1000's)")
plt.show()

在这里插入图片描述
将每个特征与目标价格进行对比,可以显示哪些特征对价格的影响最大。以上,增大尺寸也增加价格。卧室和楼层似乎对房价没有太大影响。新房子的价格比旧房子高。

多变量梯度下降

在这里插入图片描述

学习率

讲座讨论了与设置学习率相关的一些问题。学习率控制参数更新的大小。见式(1)。它由所有参数共享。让我们运行梯度下降并在我们的数据集上尝试一些a的设置在这里插入图片描述

a=9.9e-7

#set alpha to 9.9e-7
_, _, hist = run_gradient_descent(X_train, y_train, 10, alpha = 9.9e-7)

在这里插入图片描述
看来学习率太高了。解不收敛。损失Cost在增加而不是减少(Cost列)。让我们来绘制结果:

plot_cost_i_w(X_train, y_train, hist)

在这里插入图片描述
右图显示了其中一个参数的值。在每次迭代中,它都会超过最优值,因此,损失Cost最终会增加而不是接近最小值。请注意,这不是一个完全准确的图片,因为每次有4个参数被修改,而不仅仅是一个。该图仅显示w[0],其他参数固定在良性值。在这个和后面的图中,你可能会注意到蓝色和橙色的线稍微偏离了。

a=9e-7

我们试试小一点的值,看看会发生什么。

#set alpha to 9e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 9e-7)

在这里插入图片描述
损失Cost在整个运行过程中不断下降,这表明alpha不是太大。

plot_cost_i_w(X_train, y_train, hist)

在这里插入图片描述
在左边,你可以看到成本在下降。在右边,你可以看到,wo仍然在最小值附近振荡,但它每个都在减小迭代而不是增加。注意,dj_dw[0]随着每次迭代而改变符号,因为w[0]跳过了最优值。这个值会收敛。您可以改变迭代的次数来查看它的行为。

a=1e-7

我们试试小一点的α值,看看会发生什么。

#set alpha to 1e-7
_,_,hist = run_gradient_descent(X_train, y_train, 10, alpha = 1e-7)

在这里插入图片描述
成本在整个运行过程中不断下降,表明α不是太大。

plot_cost_i_w(X_train,y_train,hist)

在这里插入图片描述
在左边,你可以看到成本在下降。在右边你可以看到,在没有超过最小值的情况下,wo在增加。上面请注意Dj_wo在整个运行过程中为负。这个解决方案也会收敛,尽管没有前面的示例那么快。

特征缩放

讲座描述了重新缩放数据集的重要性,以便特征有相似的范围。

讲座讨论了三种不同的技巧:

  • 特征缩放,本质上是将每个特征除以用户选择的值,得到一个介于-1和1之间的范围。
  • 均值归一化
  • z分数归一化,我们将在下面探讨。
    在这里插入图片描述
    在z-score归一化之后,所有特征的均值为0,标准差为1。要实现z-score归一化,调整输入值,如下公式所示:在这里插入图片描述

实现注意:在对特征进行归一化时,存储用于归一化的值是很重要的——用于计算的平均值和标准偏差。在从模型中学习参数之后,我们经常想要预测我们之前没有见过的房子的价格。给定一个新的x值(客厅面积和卧室数量),我们必须首先使用我们之前从训练集中计算的平均值和标准差对x进行规范化。

实现

def zscore_normalize_features(X):"""computes  X, zcore normalized by columnArgs:X (ndarray): Shape (m,n) input data, m examples, n featuresReturns:X_norm (ndarray): Shape (m,n)  input normalized by columnmu (ndarray):     Shape (n,)   mean of each featuresigma (ndarray):  Shape (n,)   standard deviation of each feature"""# find the mean of each column/featuremu     = np.mean(X, axis=0)                 # mu will have shape (n,)# find the standard deviation of each column/featuresigma  = np.std(X, axis=0)                  # sigma will have shape (n,)# element-wise, subtract mu for that column from each example, divide by std for that columnX_norm = (X - mu) / sigma      return (X_norm, mu, sigma)#check our work
#from sklearn.preprocessing import scale
#scale(X_orig, axis=0, with_mean=True, with_std=True, copy=True)

让我们看看z分数归一化的步骤。下面的图一步一步地展示了这个转换。

mu     = np.mean(X_train,axis=0)   
sigma  = np.std(X_train,axis=0) 
X_mean = (X_train - mu)
X_norm = (X_train - mu)/sigma      fig,ax=plt.subplots(1, 3, figsize=(12, 3))
ax[0].scatter(X_train[:,0], X_train[:,3])
ax[0].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[0].set_title("unnormalized")
ax[0].axis('equal')ax[1].scatter(X_mean[:,0], X_mean[:,3])
ax[1].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[1].set_title(r"X - $\mu$")
ax[1].axis('equal')ax[2].scatter(X_norm[:,0], X_norm[:,3])
ax[2].set_xlabel(X_features[0]); ax[0].set_ylabel(X_features[3]);
ax[2].set_title(r"Z-score normalized")
ax[2].axis('equal')
plt.tight_layout(rect=[0, 0.03, 1, 0.95])
fig.suptitle("distribution of features before, during, after normalization")
plt.show()

在这里插入图片描述
上图显示了两个训练集参数“age”和“sqft”之间的关系。这些是用等比尺绘制的。

  • 左:未归一化:“大小(平方英尺)”特征的值范围或方差比年龄大得多
  • 中间:第一步find从每个中移除平均值或平均值特性。这就留下了以零为中心的特征。很难看出“年龄”特征的区别,但“尺寸(平方英尺)”明显接近于零。
  • 右:第二步除以方差。这使得两个特征都以相似的比例居中于零。

让我们对数据进行标准化,并将其与原始数据进行比较。

# normalize the original features
X_norm, X_mu, X_sigma = zscore_normalize_features(X_train)
print(f"X_mu = {X_mu}, \nX_sigma = {X_sigma}")
print(f"Peak to Peak range by column in Raw        X:{np.ptp(X_train,axis=0)}")   
print(f"Peak to Peak range by column in Normalized X:{np.ptp(X_norm,axis=0)}")

在这里插入图片描述
通过归一化,每列的峰到峰范围从千的因数减少到2-3的因数。

fig,ax=plt.subplots(1, 4, figsize=(12, 3))
for i in range(len(ax)):norm_plot(ax[i],X_train[:,i],)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count");
fig.suptitle("distribution of features before normalization")
plt.show()
fig,ax=plt.subplots(1,4,figsize=(12,3))
for i in range(len(ax)):norm_plot(ax[i],X_norm[:,i],)ax[i].set_xlabel(X_features[i])
ax[0].set_ylabel("count"); 
fig.suptitle(f"distribution of features after normalization")plt.show()

在这里插入图片描述
在这里插入图片描述
注意,上面的归一化数据的范围以0为中心,大致为+/-1。最重要的是,每个特性的范围是相似的。让我们用规范化数据重新运行梯度下降算法。注意,alpha的值要大得多。这将加速下降。

w_norm, b_norm, hist = run_gradient_descent(X_norm, y_train, 1000, 1.0e-1, )

在这里插入图片描述
缩放的特征得到非常准确的结果,快得多!注意,在这个相当短的运行结束时,每个参数的梯度都很小。对于使用归一化特征的回归来说,学习率为0.1是一个良好的开端。让我们根据目标值绘制出预测结果。注意,预测是使用归一化特征进行的,而图是使用原始特征值显示的。

#predict target using normalized features
m = X_norm.shape[0]
yp = np.zeros(m)
for i in range(m):yp[i] = np.dot(X_norm[i], w_norm) + b_norm# plot predictions and targets versus original features    
fig,ax=plt.subplots(1,4,figsize=(12, 3),sharey=True)
for i in range(len(ax)):ax[i].scatter(X_train[:,i],y_train, label = 'target')ax[i].set_xlabel(X_features[i])ax[i].scatter(X_train[:,i],yp,color=dlorange, label = 'predict')
ax[0].set_ylabel("Price"); ax[0].legend();
fig.suptitle("target versus prediction using z-score normalized model")
plt.show()

在这里插入图片描述
结果看起来不错。
有几点需要注意:

  • 有了多个特征,我们就不能再用一个图来显示结果和特征了。
  • 在生成图时,使用归一化特征。使用从规范化训练集中学习到的参数的任何预测也必须规范化,生成模型的目的是用它来预测数据集中没有的房价。

让我们来预测一套1200平方英尺、3间卧室、1层、40年历史的房子的价格。回想一下,当训练数据被归一化时,必须使用得到的均值和标准差对数据进行归一化。

# First, normalize out example.
x_house = np.array([1200, 3, 1, 40])
x_house_norm = (x_house - X_mu) / X_sigma
print(x_house_norm)
x_house_predict = np.dot(x_house_norm, w_norm) + b_norm
print(f" predicted price of a house with 1200 sqft, 3 bedrooms, 1 floor, 40 years old = ${x_house_predict*1000:0.0f}")

在这里插入图片描述
成本轮廓另一种查看特征缩放的方法是根据成本轮廓。当特征尺度不匹配时,等值线图中成本与参数的关系是不对称的。在下面的图中,参数的比例是匹配的。左边的图是在特征归一化之前w[0](平方英尺与w1的成本等高线图。这个图是如此不对称,完成等高线的曲线是不可见的。相比之下,当特征归一化时,成本轮廓更加对称。结果是,在梯度下降过程中对参数的更新可以使每个参数取得相同的进展。在这里插入图片描述

plt_equal_scale(X_train, X_norm, y_train)

在这里插入图片描述

恭喜

在这个实验中,你

  • 利用您在以前的实验中开发的具有多个特性的线性回归例程
  • 探讨了学习率a对收敛的影响
  • 发现使用z-score归一化的特征缩放在加速收敛方面的价值

致谢

住房数据来源于Dean De Cock为数据科学教育编制的Ames住房数据集。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/733114.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

域控操作十:安装包exe转msi软件下发

需要的文件 Advanced Installer 软件用来将exe转换成msi因为域控只能下发msi格式 一个exe安装包这里拿微信举例 一个没有密码的共享文件夹 1.exe转MSI 2,开始下发 服务器和用户刷新策略 #完成

某品零食交易平台设计与实现|基于springboot+ Mysql+Java的某品交易平台设计与实现(源码+数据库+文档+PPT)

目录 基于springboot MysqlJava的某品交易平台设计与实现 摘 要 系统详细设计 数据库设计 论文参考 源码获取 文末获取源码联系 基于springboot MysqlJava的某品交易平台设计与实现 摘 要 随着科学技术的飞速发展,社会的方方面面、各行各业都在努力与现代的…

html--彩虹爱心

文章目录 js内容cssreset.min.cssstyle.css html内容 js内容 const colors ["#e03776","#8f3e98","#4687bf","#3bab6f","#f9c25e","#f47274"]; const SVG_NS http://www.w3.org/2000/svg; const SVG_XLINK &q…

Spring Boot 多环境配置

Spring Boot 多环境配置 在现代的软件开发中,通常需要将应用程序部署到不同的环境中,如开发环境、生产环境和测试环境等。每个环境可能需要不同的配置参数,例如数据库连接信息、日志级别等。在 Spring Boot 中,我们可以通过简单的…

智慧库室管控系统-智慧枪弹管控系统

项目背景: 针对部队装备管理现状,部队在进行硬件系统建设的同时,需通过装备管理系统软件的建设,综合集成监控、报警、出入库、信息发布、库管理、监测、防护等系统,对装备进行立体监控、实时预警、快速处理&#xff0…

springboot255基于spring boot的疫情信息管理系统

疫情信息管理系统的设计与实现 摘要 近年来,信息化管理行业的不断兴起,使得人们的日常生活越来越离不开计算机和互联网技术。首先,根据收集到的用户需求分析,对设计系统有一个初步的认识与了解,确定疫情信息管理系统…

【每日刷题】栈与队列-LC394、LC347、LC215

题外话:感觉脑子没长到栈这块…最近刷栈的题都好难啊…哭哭…坚持坚持!多刷几遍就好了!! 1. LC394.字符串解码 题目链接 先说数据结构。 维护两个栈:一个栈存之前的字符串,另一个栈存之后的字符串的重复…

基于命名实体链接的事件抽取与知识图谱在电商领域的应用

开源项目推荐 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口,功能强大,欢迎体验。 多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口…

mysql | 查询数据的过程|优化-->索引 |存储引擎

查询的过程 首先确认mysql 服务器是否启动 systemctl mysqld status 登录连接 mysql -h i p − u ip -u ip−uuser -p (-h 指定服务器ip -u 指定用户名 -p 指定密码) mysql 数据包 经过抓包分析(mysql包其实就是基于tcp协议 3306端口) 传输采用mysql 协议&#xff0…

云原生构建 微服务、容器化与容器编排

第1章 何为云原生,云原生为何而生 SOA也就是面向服务的架构 软件架构的发展主要经历了集中式架构、分布式架构以及云原生架构这几代架构的发展。 微服务架构,其实是SOA的另外一种实现方式,属于SOA的子集。 在微服务架构下,系统…

Web本体语言OWL

语义网(Semantic Web): 语义网是万维网联盟(W3C)提出的一种愿景,旨在增强现有Web的表达能力和智能处理能力,通过标准化的技术手段赋予网络数据更加精确和可计算的语义,使得机器能够…

ReactNative项目构建分析与思考之react-native-gradle-plugin

前一段时间由于业务需要,接触了下React Native相关的知识,以一个Android开发者的视角,对React Native 项目组织和构建流程有了一些粗浅的认识,同时也对RN混合开发项目如何搭建又了一点小小的思考。 RN环境搭建 RN文档提供了两种…

西门子PLC中的程序块及类别详解

在PLC的编程中,程序块是指一组逻辑控制代码,用于实现系统中特定的控制功能。程序块主要分为四类,包括函数块(FB)、函数(FC)、数据块(DB)和组织块(OB&#xff…

300分钟吃透分布式缓存-24讲:Redis崩溃后,如何进行数据恢复的?

Redis 持久化是一个将内存数据转储到磁盘的过程。Redis 目前支持 RDB、AOF,以及混合存储三种模式。 RDB Redis 的 RDB 持久化是以快照的方式将内存数据存储到磁盘。在需要进行 RDB 持久化时,Redis 会将内存中的所有数据以二进制的格式落地,每…

Python算法题集_在排序数组中查找元素的第一个和最后一个位置

Python算法题集_在排序数组中查找元素的第一个和最后一个位置 题34:在排序数组中查找元素的第一个和最后一个位置1. 示例说明2. 题目解析- 题意分解- 优化思路- 测量工具 3. 代码展开1) 标准求解【二分法两次左边界】2) 改进版一【二分法左右边界】3) 改进版二【第三…

基于YOLOv8深度学习的葡萄病害智能诊断与防治系统【python源码+Pyqt5界面+数据集+训练代码】深度学习实战

《博主简介》 小伙伴们好,我是阿旭。专注于人工智能、AIGC、python、计算机视觉相关分享研究。 ✌更多学习资源,可关注公-仲-hao:【阿旭算法与机器学习】,共同学习交流~ 👍感谢小伙伴们点赞、关注! 《------往期经典推…

寻找完全平方数——浮点数陷阱

【题目描述】 输出所有形如aabb的4位完全平方数(即前两位数字相等,后两位数字也相等)。 【解析】 一、问题分析 从问题出发,题目要求输出的是满足一定条件的数。数在计算机中是要占存储空间的,要在计算机中表示一个…

C语言字符串型常量

在C语言中,字符串型常量是由一系列字符组成的常量。字符串常量在C中以双引号(")括起来,例如:“Hello, World!”。字符串常量在C中是不可变的,也就是说,一旦定义,就不能修改其内…

Web自动化测试流程:从入门到精通,帮你成为测试专家

摘要: Web应用程序在今天的软件开发中占据着越来越重要的地位。保证Web应用程序的质量和稳定性是非常必要的,而自动化测试是一种有效的方法。本文将介绍Web自动化测试流程,并提供代码示例。 步骤一:选取测试工具 选择适合自己团…

像SpringBoot一样使用Flask - 5.统一处理(日志、异常、响应报文)

接上文《像SpringBoot一样使用Flask - 4.拦截器》,通过拦截器处理一些日志,异常、还有统一的响应报文。 统一的目的就是为了让前后端调用请求不会因为各自习惯而随意编写,增加技术人员快速上手及代码的可阅读性。 一、定义一个返回类。是不是…