吴恩达机器学习2022-Jupyter特征缩放

news2025/1/19 14:34:06

1可选实验室: 特征缩放和学习率(多变量)

1.1 目标

在这个实验室里:

  • 利用前一实验室开发的多变量线性回归模型程序
  • 在具有多种功能的数据集上运行梯度下降法
  • 探讨学习速度 alpha 对梯度下降法的影响
  • 通过使用 z 分数标准化的特征缩放来提高梯度下降法的性能

1.2 工具

您将使用在上一个实验中开发的函数以及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

1.3 表示法

 2 问题陈述

与前面的实验一样,您将使用房价预测的激励实例。培训数据集包含许多示例,其中4个特征(大小、卧室、楼层和年龄)如下表所示。注意,在这个实验室中,尺寸特性是在平方英尺,而早期的实验室使用1000平方英尺。这个数据集比以前的实验室大。

我们希望利用这些价值建立一个线性回归模型,这样我们就可以预测其他房子的价格——比如,一套1200平方英尺、3间卧室、1层楼、40年历史的房子。

2.1 数据集

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

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

让我们通过绘制每个特征与价格的关系来查看数据集及其特征。

输出为:

绘制每个特性与目标价格的对比图,可以提供一些指示,说明哪些特性对价格的影响最大。可以看出,增加规模也会增加价格。卧室和地板似乎对房价没有太大影响。较新的房子比较旧的房子有更高的价格。

2.2 梯度下降法多变量

下面是你在上一个实验室里开发的多变量梯度下降法方程:

 其中,n 是特性的数量,参数 wj,b,同时更新

m是数据集中训练例子的数量。fw,b (x (i))是模型的预测值,而 y (i)是目标值。

2.3 学习率 

讲座讨论了一些与设置学习速率 α 有关的问题。学习速率控制参数更新的大小。见上方程式(1)。它由所有参数共享。

让我们运行梯度下降法并尝试一些 α 设置在我们的数据集上。

2.3.1  𝛼= 9.9e-7

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

输出:

 看来学习速度太快了。解不会收敛。成本不降反升。

让我们描绘一下结果:

plot_cost_i_w(X_train, y_train, hist)

 输出:

右边的图显示了其中一个参数 w0的值

.在每次迭代中,它都超出了最优值,结果是成本最终增加而不是接近最小值。请注意,这不是一个完全准确的图片,因为有4个参数被修改,而不是只有一个。此图仅显示 w0,其他参数固定为良性值。在本图和后面的图中,你可能会注意到蓝色和橙色的线条有些偏离。

2.3.2  𝛼= 9e-7

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

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

输出:

 成本在整个运行过程中不断下降,表明 alpha 不是太大。

在左边,您可以看到成本正在减少。在右边,你可以看到 w0仍然围绕最小值振荡,但是它在减少而不是增加每次迭代。上面注意,当 w [0]跳过最佳值时,dj _ dw [0]每次迭代都改变符号。这个 alpha 值将会收敛。您可以改变迭代次数,以查看它的行为。

2.3.3  𝛼= 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)

输出:

成本在整个运行过程中不断下降,表明 α 不是太大。

在左边,您可以看到成本正在减少,因为它应该这样做。在右边你可以看到 w0正在减少,但是没有越过最小值。注意上面的 dj _ w0在整个运行过程中都是负的。这个解决方案也会收敛,尽管不像前面的例子那么快。

2.4 特征缩放

讲座描述了重新缩放数据集的重要性,使特征具有相似的范围。如果你对为什么会出现这种情况的细节感兴趣,请点击下面的“细节”标题。如果没有,下面的部分将介绍如何进行特性扩展的实现。

让我们再来看看 α = 9e-7的情况。这非常接近我们可以不发散地设置 α 的最大值。这是显示最初几个迭代的短暂过程:

以上,虽然成本正在下降,很明显,w0比其他参数进展更快,因为它的梯度大得多。

下图显示了使用 α= 9e-7进行长时间运行的结果。这需要几个小时。

以上,你可以看到成本降低后,其最初的减少缓慢。注意 w0和 w0、 w1、 w2以及 dj _ dw0和 dj _ dw1-3之间的区别。W0很快达到接近最终值,dj _ dw0很快降低到一个很小的值,表明 w0接近最终值。其他参数的降低要慢得多。

为什么会这样? 有什么我们可以改进的吗? 看下面:

上图显示了为什么更新得不均匀。

  • α由所有参数更新(w 和 b)共享
  • 常见误差项乘以 w 的特征(不是 b)
  • 这些特性的数量级差异很大,使得一些特性的更新速度比其他特性快得多。在这种情况下,w0乘以“ size (sqft)”,通常大于1000,而 w1乘以“ number of bedrooms”,通常是2-4。

解决方案是特征缩放。

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

  • 特性缩放,本质上是将每个特性除以用户选择的值,得到 -1到1之间的范围。
  • 平均标准化: xi: = (xi-μi)/(max-min)
  • Z 分数标准化,我们将在下面探讨。

2.4.1 Z-分数正规化

在 z 分数标准化后,所有特性的平均值为0,标准差为1。

要实现 z 分数标准化,调整输入值,如下公式所示:

 其中 j 选择 X 矩阵中的一个特征或列。μj 是特征(j)所有值的平均值,σj 是特征(j)的标准差。

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

def zscore_normalize_features(X):
    """
    computes  X, zcore normalized by column
    
    Args:
      X (ndarray): Shape (m,n) input data, m examples, n features
      
    Returns:
      X_norm (ndarray): Shape (m,n)  input normalized by column
      mu (ndarray):     Shape (n,)   mean of each feature
      sigma (ndarray):  Shape (n,)   standard deviation of each feature
    """
    # find the mean of each column/feature
    mu     = np.mean(X, axis=0)                 # mu will have shape (n,)
    # find the standard deviation of each column/feature
    sigma  = 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 column
    X_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" and "sqft"。这些都是等比例绘制的。

左: 非标准化: “ size (sqft)”特征的值范围或方差比年龄范围大得多

中间: 第一步查找删除每个特性的平均值或平均值。这样就剩下了以零为中心的特性。很难看出“ age”特性之间的差异,但“ size (sqft)”显然在零附近。

右: 第二步除以方差,这样两个特征的中心位置都为零,尺度相似。

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

# 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)}")

输出:

X_mu = [1.42e+03 2.72e+00 1.38e+00 3.84e+01], 
X_sigma = [411.62   0.65   0.49  25.78]
Peak to Peak range by column in Raw        X:[2.41e+03 4.00e+00 1.00e+00 9.50e+01]
Peak to Peak range by column in Normalized X:[5.85 6.14 2.06 3.69]

通过归一化,每个列的峰值到峰值范围从几千减少到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()

输出:

注意,在上面,规范化数据的范围以零为中心,大致为 +/-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()

输出:

结果看起来不错,需要注意以下几点:

  • 有了多个特征,我们不能再有一个单一的plot显示结果与特征。
  • 在生成图形时,使用归一化特征。任何使用从规范化训练集中学到的参数的预测也必须进行规范化。

预测生成我们的模型的要点是使用它来预测数据集中没有的房价。让我们来预测一套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}")

输出:

[-0.53  0.43 -0.79  0.06]
 predicted price of a house with 1200 sqft, 3 bedrooms, 1 floor, 40 years old = $318709

成本轮廓

查看特性扩展的另一种方法是根据成本轮廓。当特征尺度不匹配时,等高线图中的成本与参数的关系图是不对称的。

在下面的图中,参数的比例尺是匹配的。左边的图是 w [0]的成本等高线图,平方英尺与 w [1]的比值,以及标准化特征之前的卧室数量。曲线是如此的不对称,完成等高线的曲线是不可见的。相比之下,当特征标准化时,成本轮廓更加对称。其结果是,在梯度下降法期间对参数的更新可以使每个参数取得相同的进展。

plt_equal_scale(X_train, X_norm, y_train)

 输出:

3 总结

在这个实验室里:

  • 利用你在以前的实验室中开发的具有多种功能的线性回归程序
  • 探讨了学习速率 α 的影响
  • 利用 z 分数归一化发现了特征尺度在加速收敛中的价值

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

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

相关文章

第七章:FCN——Fully Convolutional Networks for Semantic Segmentation

0.摘要 卷积神经网络是强大的视觉模型,能够产生特征的层级结构。我们展示了通过端到端、像素到像素的训练的卷积神经网络在语义分割方面超越了现有技术的最新成果。我们的关键发现是构建“全卷积”网络,它可以接受任意大小的输入并生成相应大小的输出&am…

OSPF和VLAN综合实验

目录 题目 1.IP地址的规划设计 2.搭建拓扑并进行基础IP配置 3.配置虚拟局域网 1)按子网划分要求配置PC1和PC2 检测:输入[SW1]display vlan进行检查 配置路由器R3 检测:用PC1去访问PC2 2)配置拓扑中其余路由器的网关以及回…

基于安森美音频处理器Ezairo 8300助听器设计

v hezkz17进数字音频系统研究开发交流答疑 Ezairo 8300 系统框图 许多现代音频产品将受益于安森美(onsemi)基于DSP的EZAIRO系列音频处理器。 安森美(ON Semiconductor)的EZAIRO系列音频处理器是基于数字信号处理器(DSP)的产品系列…

​​Layui之用户管理实例(对数据的增删改查)

目录 ​编辑一、R工具介绍() ​编辑二、数据表的增删改查 ​编辑2.1我们先得从查询数据库的语句入手 2.2优化dao类 2.4UserAction类 2.5前台的页面实现增删改查操作 2.6 userManage页面JS 2.7user新增、修改iframe层js 前言 上一篇我分享了…

http1.0、http1.1 http 2.0

HTTP/1.0是无状态、无连接的应用层协议。 无连接 无连接:每次请求都要建立连接,需要使用 keep-alive 参数建立长连接、HTTP1.1默认长连接keep-alive   无法复用连接,每次发送请求都要进行TCP连接,TCP的连接释放都比较费事&…

vue-next-admin vue3.x版本,table自定义

vue3.x版本&#xff0c;将table进行了封装。使用起来更方便了。但是&#xff0c;有时候我们需要将一组信息显示到一列中。所以我将其进行了简单的二次改造。支持table-column自定义。 table改造代码 <template><div class"table-container"><el-tabl…

R语言的水文、水环境模型优化技术及快速率定方法与多模型案例实践

在水利、环境、生态、机械以及航天等领域中&#xff0c;数学模型已经成为一种常用的技术手段。同时&#xff0c;为了提高模型的性能&#xff0c;减小模型误用带来的风险&#xff1b;模型的优化技术也被广泛用于模型的使用过程。模型参数的快速优化技术不但涉及到优化本身而且涉…

高速入门知识03:路阻抗匹配方法

文章目录 前言一、简单并行匹配二、戴维南并行匹配三、主动并行匹配四、串联RC并行匹配五、串联匹配六、差分对匹配七、收发器片内匹配 前言 高速电路阻抗匹配方法 阻抗不匹配会导致信号在传输线上来回反射&#xff0c;使负载接收器出现振铃。振铃降低了接收 器的动态范围&am…

Centos使用docker部署nacos

Centos使用docker部署nacos 对于使用Docker部署Nacos&#xff0c;您可以按照以下步骤进行操作&#xff1a; 在您的服务器上安装Docker和Docker Compose。创建一个用于存储Nacos数据的目录&#xff0c;例如/path/to/nacos/data。创建一个docker-compose.yml文件&#xff0c;并…

【数学建模】统计分析方法

文章目录 1.回归分析2. 逻辑回归3. 聚类分析4. 判别分析5. 主成分分析6. 因子分析7. 对应分析 1.回归分析 数据量要多&#xff0c;样本总量n越大越好——>保证拟合效果更好&#xff0c;预测效果越好 一般n>40/45较好 方法 建立回归模型 yiβ0β1i……βkxkiεi 所估计的…

vscode 端口转发实现端口映射,实现端口自由

用vscode连接server进行开发&#xff0c; 是非常方便的&#xff0c;但很多时候&#xff0c;server的端口开放的很有限&#xff0c;那么就可以利用vscode进行端口映射 举一个应用场景&#xff1a; 先通过A利用vscode 连接B&#xff0c;然后再vscode 的port窗口进行端口转发&…

Hadoop 之 HDFS 配置与使用(二)

HDFS 配置与使用 一.HDFS配置二.HDFS Shell1.默认配置说明2.shell 命令 三.Java 读写 HDFS1.Java 工程配置2.测试 一.HDFS配置 ## 基于上一篇文章进入 HADOOP_HOME 目录 cd $HADOOP_HOME/etc/hadoop ## 修改文件权限 chown -R root:root /usr/local/hadoop/hadoop-3.3.6/* ## …

LLMs之Baichuan:Baichuan-13B模型的简介(包括Baichuan-7B)、安装、使用方法之详细攻略

LLMs之Baichuan&#xff1a;Baichuan-13B模型的简介(包括Baichuan-7B)、安装、使用方法之详细攻略 导读&#xff1a;2023年6月15日&#xff0c;百川智能(搜狗创始人王小川创建)发布了首个大模型成果Baichuan-7B&#xff0c;开源可商用&#xff0c;它在C-Eval、AGIEval和Gaokao中…

java通过url获取视频时长(无需下载文件)

1、导入架包 <!-- jave 核心依赖 --><dependency><groupId>ws.schild</groupId><artifactId>jave-core</artifactId><version>2.4.6</version></dependency><!-- 根据不同操作系统引入不同FFmpeg包 --><!-- wi…

KEIL安装额外版本的arm compiler v6.16 v5.06update7

很多时候安装了一个版本的keil&#xff0c;但是别人的工程是拿另一个版本做的&#xff0c;重新安装也不是不行&#xff0c;但是会占很多地方&#xff0c;文件关联也很乱套&#xff0c;所以记录一下怎么安装额外的&#xff0c;比如我的是keil mdk530&#xff0c;自带Compiler v6…

Linux 离线安装软件

这里写目录标题 0.注意1.防火墙操作2.安装jdk1.上传jdk安装包2.安装3.配置环境变量 3.安装redis1.上传tar包2.安装命令3.项目连接时报错4.问题一保存信息解决 4.安装rabbitMq1.查看erlang与mq对应版本2.下载软件2.1下载erlang2.2下载rabbitMq 3.将文件拖放到linux4.安装5.开放端…

loki技巧 - 结构化log日志文本

将非结构化的log日志信息结构化为JSON格式&#xff0c;以方便在Grafana界面侧的浏览和查询。 0. 目录 1. 需求背景和描述2. 实现&#xff08;Promtail侧&#xff09;3. 注意事项4. 参考 1. 需求背景和描述 最近几个月&#xff0c;部门内部开始尝试统一日志收集、查询统计相关的…

没有广告的浏览器(AdBlock)

AdBlock是一个广告拦截器&#xff0c;可以帮你拦截所有浏览网站上的广告。 安装&#xff1a; 有梯子 1、官网 https://getadblock.com/zh_CN/ 2、点击【以及获得Adblock】跳转浏览器->扩展程序->插件详情页&#xff0c;目前支持 Chrome Firefox Edge Safari 浏览器&am…

KaiwuDB CTO 魏可伟:多模架构 —“化繁为简”加速器

以下为浪潮 KaiwuDB CTO 魏可伟受邀于7月4日在京举行的可信数据库发展大会发表演讲的实录&#xff0c;欢迎大家点赞、收藏、关注&#xff01; 打造多模引擎&#xff0c;AIoT数据库探索之路 01 何为“繁”&#xff1f; 工业 4.0 时代&#xff0c; 物联网产业驱动数据要素市场不…

H3C-Cloud Lab实验-PPP实验

实验拓扑图&#xff1a; 实验需求&#xff1a; 1. R1 和 R2 使用 PPP 链路直连&#xff0c;R2 和 R3 把 2 条 PPP 链路捆绑为 PPP MP 直连 2. 按照图示配置 IP 地址 3. R2 对 R1 的 PPP 进行单向 chap 验证 4. R2 和 R3 的 PPP 进行双向 chap 验证 实验步骤&#xff1a; …