使用 NumPy 进行 LMS 批量梯度下降

2024-01-02

我正在尝试编写一些非常简单的 LMS 批量梯度下降,但我相信我在梯度方面做错了。数量级与初始值之间的比率theta的元素有很大不同theta所以要么theta[2]不动(例如,如果alpha = 1e-8) or theta[1]发射(例如,如果alpha = .01).

import numpy as np

y = np.array([[400], [330], [369], [232], [540]])
x = np.array([[2104,3], [1600,3], [2400,3], [1416,2], [3000,4]])
x = np.concatenate((np.ones((5,1), dtype=np.int), x), axis=1)
theta = np.array([[0.], [.1], [50.]])
alpha = .01

for i in range(1,1000):
    h = np.dot(x, theta)
    gradient = np.sum((h - y) * x, axis=0, keepdims=True).transpose()
    theta -= alpha * gradient
    print ((h - y)**2).sum(), theta.squeeze().tolist()

所写的算法是完全正确的,但如果没有特征缩放,收敛速度将非常慢,因为一个特征将控制梯度计算。

您可以通过多种方式执行缩放;现在,让我们按照 L^1 范数来缩放特征,因为这很简单

import numpy as np
y = np.array([[400], [330], [369], [232], [540]])
x_orig = np.array([[2104,3], [1600,3], [2400,3], [1416,2], [3000,4]])
x_orig = np.concatenate((np.ones((5,1), dtype=np.int), x_orig), axis=1)
x_norm = np.sum(x_orig, axis=0)
x = x_orig / x_norm

也就是说,每列的总和x是 1。如果您想保留对正确参数的正确猜测,则必须相应地缩放这些参数。

theta = (x_norm*[0., .1, 50.]).reshape(3, 1)

有了这个,我们可以像您在原始帖子中所做的那样继续,您将不得不再次调整学习率,直到找到最佳点。

alpha = .1
for i in range(1, 100000):
    h = np.dot(x, theta)
    gradient = np.sum((h - y) * x, axis=0, keepdims=True).transpose()
    theta -= alpha * gradient

既然我们发现了一些似乎收敛的东西,那么让我们看看我们得到了什么。同样,您的参数必须进行缩放以与原始未缩放的特征相关。

print (((h - y)**2).sum(), theta.squeeze()/x_norm)
# Prints 1444.14443271 [ -7.04344646e+01   6.38435468e-02   1.03435881e+02]

现在,让我们作弊并检查我们的结果

theta, error, _, _ = np.linalg.lstsq(x_orig, y)
print(error, theta)
# Prints [ 1444.1444327] [[ -7.04346018e+01]
#                         [  6.38433756e-02]
#                         [  1.03436047e+02]]

关于特征缩放的一般介绍性参考是.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

使用 NumPy 进行 LMS 批量梯度下降 的相关文章

随机推荐

  • 使用 .NET 4.6.2 中的 HttpClientFactory

    我有一个 NET 4 6 2 控制台应用程序 使用简单注入器 我需要调用 HTTP 服务 直接使用 HttpClient 遇到问题后 我尝试使用 HttpClientFactory https github com aspnet HttpC
  • 链接器如何解析 C 中多重定义的全局符号

    我的教科书上是这么说的 函数和初始化的全局变量获得强符号 未初始化的全局变量获得弱符号 给定一个强符号和多个弱符号 选择强符号 所以我创建了两个文件来查看 file1 c int number int main int argc char
  • 与具有 10M 记录的 MySQL 相比,MongoDB 非常慢

    我有一个负载相当高的项目 在 MySQL 上运行 有大约 10M 条记录 每秒大约有 500 个请求 数据相当独特 缓存命中率只有3 左右 每行大约有 10 个字段 其中 2 个已建立索引 我的查询 99 使用这两个索引字段来请求 我决定尝
  • R 中的函数将小数转换为具有指定分母的分数

    假设我有一个小数列表 x lt c 0 55 0 246 0 767 然后我希望将这些转换成 10 以内的分数 这样我就得到 6 10 2 10 8 10 我遇到过这个 效果非常好 但是 我想知道是否有一个函数可以做到这一点 frac fu
  • 无需网络连接的桌面应用程序防止盗版?

    假设对于一个在其生命周期内永远不会接收互联网连接的应用程序 如何防止该软件的盗版 安装过程中不能有单一的产品密钥要求 因为一旦合法安装 任何人都可以复制安装并重新分发它 因此 每次应用程序运行时 它都应该检查某些内容 如果检查失败 则崩溃
  • 具有一个固定列宽的 Flexbox [重复]

    这个问题在这里已经有答案了 我正在努力实现flexbox有两列 左侧具有固定宽度 右侧随着页面大小的变化而缩放 例如 div class flex container div class flex col left div div
  • 即使特定日期没有数据,mysql日期列表也包含计数[重复]

    这个问题在这里已经有答案了 可能的重复 MySQL如何填充范围内缺失的日期 https stackoverflow com questions 3538858 mysql how to fill missing dates in range
  • 无需浏览器的 Selen 测试

    我使用 Selenium RC 进行测试 现在要执行负载测试 我想运行并行测试用例 有没有什么方法可以在不打开浏览器的情况下运行它们 Chrome 现在有无头模式 op webdriver ChromeOptions op add argu
  • Array.prototype.concat() 底层

    如何查看函数 concat 中的代码 它是如何做它所做的事情的 有人有代码的副本或在浏览器控制台中查看它的方法吗 console dir 不允许我访问过去 console dir Array prototype concat functio
  • 让 golang Gorilla CORS 处理程序工作

    我在这里有相当简单的设置 如下面的代码所述 但我无法得到CORS上班 我不断收到此错误 XMLHttpRequest 无法加载http localhost 3000 signup http localhost 3000 signup 响应
  • 无法以非 root 用户身份在 DockerFile 中解压缩 zip 文件

    当我尝试在 DockerFile 中解压 zip 文件时 不断收到以下错误 checkdir error cannot create my archive Permission denied unable to process my arc
  • Spring Data 似乎不理解@Column 名称

    我正在使用 Spring boot 1 4 1 RELEASE 以及 Spring Data 和 Hibernate 将一些数据保存到 MySQL 数据库中 我有这堂课Respondent 注释为 Entity以及注释如下的字段之一 Col
  • 如何在Python中使用win32gui关闭带句柄的窗口

    我已经通过 Python 中的 win32gui 库获得了我想要定位的窗口的句柄 我如何关闭窗口 我有以下代码 第二行做了我想做的事情 但最后一行似乎是错误的 handle win32gui FindWindow None r Notepa
  • 在android中制作一个RTL导航抽屉

    我想让我的导航从以下位置打开right to left 但是 一旦我更改这些步骤中的任何一个 我的程序就会在运行应用程序后单击导航后面临错误强制关闭 我的 main activity xml
  • 如何从任务管理器进程列表中的进程列表中区分不同的JavaWS应用程序?

    我正在使用 JavaWS 启动应用程序 然后如何检查该应用程序是否在用户计算机中运行 因为它在任务管理器进程列表中的名称不是我在 JNLP 文件中给出的名称 NOTE 我检查了任务管理器进程列表 但该进程的名称是 javaw exe 并且所
  • 将子元素添加到 React 元素

    如何向 React 组件添加子组件 this props children似乎是只读的 所以不能直接改变它 假设我有 var myComponent
  • .NET 4.5 中 WPF 中的异步事件处理程序无响应

    我创建了一个简单的异步操作 当单击按钮时该操作将被踢出 这是整个代码 public partial class MainWindow Window public MainWindow InitializeComponent private
  • 创建使用 .NET 命名空间的库的最佳实践

    编写一个定义依赖于另一个库的接口的库是一种不好的做法吗 我知道紧密耦合不好 但是在使用 NET 类时这仍然适用吗 例如 在 NET 中 如果我有一个返回 Color 对象的库 它将强制使用我的库的任何内容都依赖于 System Drawin
  • 强制 Maven 仅使用第一级依赖项

    我有一个 Maven Java 项目 我不希望在编译项目时通过一系列子依赖项偶然满足我的项目依赖项 当构建最终的战争时 maven 必须检查所有使用的依赖项并向战争添加必要的库 这对我来说是可以的 但是在编译代码时 我想确保只使用直接依赖项
  • 使用 NumPy 进行 LMS 批量梯度下降

    我正在尝试编写一些非常简单的 LMS 批量梯度下降 但我相信我在梯度方面做错了 数量级与初始值之间的比率theta的元素有很大不同theta所以要么theta 2 不动 例如 如果alpha 1e 8 or theta 1 发射 例如 如果