用c++用4个凸函数(觉得啥好用用啥)去测试adam,rmsprop,adagrad算法的性能(谁先找到最优点)

为了测试 Adam、RMSProp 和 Adagrad 算法的性能,你可以使用四个凸函数进行实验。以下是一些常用的凸函数示例:

  1. Rosenbrock 函数:

    Rosenbrock函数

  2. Booth 函数:

    Booth函数

  3. Himmelblau 函数:

    Himmelblau函数

  4. Beale 函数:

    Beale函数

你可以选择其中一个或多个函数来测试算法的性能。对于每个函数,你可以使用不同的初始点,并应用 Adam、RMSProp 和 Adagrad 算法来寻找最优点。最优点可以通过达到较低的函数值或满足预定精度条件来定义。

在实验过程中,你可以记录每个算法在不同函数和初始点上找到最优点的迭代次数、计算时间以及最终的函数值。通过比较这些指标,你可以评估每个算法的性能和效果。

请注意,算法的性能可能会因函数的形状和参数设置而有所不同。因此,建议你在不同的凸函数上进行多次实验,以获得更全面的性能比较结果。

#include <iostream>
#include <cmath>
#include <vector>

// 定义凸函数类
class ConvexFunction {
public:
    virtual double evaluate(const std::vector<double>& x) = 0;
};

// Rosenbrock 函数
class RosenbrockFunction : public ConvexFunction {
public:
    double evaluate(const std::vector<double>& x) override {
        double sum = 0.0;
        for (size_t i = 0; i < x.size() - 1; ++i) {
            double term1 = pow(x[i + 1] - pow(x[i], 2), 2);
            double term2 = pow(1 - x[i], 2);
            sum += 100 * term1 + term2;
        }
        return sum;
    }
};

// Booth 函数
class BoothFunction : public ConvexFunction {
public:
    double evaluate(const std::vector<double>& x) override {
        double term1 = pow(x[0] + 2 * x[1] - 7, 2);
        double term2 = pow(2 * x[0] + x[1] - 5, 2);
        return term1 + term2;
    }
};

// Himmelblau 函数
class HimmelblauFunction : public ConvexFunction {
public:
    double evaluate(const std::vector<double>& x) override {
        double term1 = pow(pow(x[0], 2) + x[1] - 11, 2);
        double term2 = pow(x[0] + pow(x[1], 2) - 7, 2);
        return term1 + term2;
    }
};

// Beale 函数
class BealeFunction : public ConvexFunction {
public:
    double evaluate(const std::vector<double>& x) override {
        double term1 = pow(1.5 - x[0] + x[0] * x[1], 2);
        double term2 = pow(2.25 - x[0] + x[0] * pow(x[1], 2), 2);
        double term3 = pow(2.625 - x[0] + x[0] * pow(x[1], 3), 2);
        return term1 + term2 + term3;
    }
};

// Adam 算法
std::vector<double> adam(const ConvexFunction& func, const std::vector<double>& initial_x, double learning_rate, int max_iterations) {
    std::vector<double> x = initial_x;
    std::vector<double> m(x.size(), 0.0);
    std::vector<double> v(x.size(), 0.0);
    double beta1 = 0.9;
    double beta2 = 0.999;
    double epsilon = 1e-8;

    for (int i = 0; i < max_iterations; ++i) {
        // 计算梯度
        std::vector<double> gradient(x.size(), 0.0);
        for (size_t j = 0; j < x.size(); ++j) {
            std::vector<double> x_plus_delta = x;
            x_plus_delta[j] += epsilon;
            double f_plus_delta = func.evaluate(x_plus_delta);
            gradient[j] = (f_plus_delta - func.evaluate(x)) / epsilon;
        }

        // 更新参数
        for (size_t j = 0; j < x.size(); ++j) {
            m[j] = beta1 * m[j] + (1 - beta1) * gradient[j];
            v[j] = beta2 * v[j] + (1 - beta2) * pow(gradient[j], 2);
            double m_hat = m[j] / (1 - pow(beta1, i + 1));
            double v_hat = v[j] / (1 - pow(beta2, i + 1));
            x[j] -= learning_rate * m_hat / (sqrt(v_hat) + epsilon);
        }
    }

    return x;
}

// RMSProp 算法
std::vector<double> rmsprop(const ConvexFunction& func, const std::vector<double>& initial_x, double learning_rate, double decay_rate, int max_iterations) {
    std::vector<double> x = initial_x;
    std::vector<double> cache(x.size(), 0.0);
    double epsilon = 1e-8;

    for (int i = 0; i < max_iterations; ++i) {
        // 计算梯度
        std::vector<double> gradient(x.size(), 0.0);
        for (size_t j = 0; j < x.size(); ++j) {
            std::vector<double> x_plus_delta = x;
            x_plus_delta[j] += epsilon;
            double f_plus_delta = func.evaluate(x_plus_delta);
            gradient[j] = (f_plus_delta - func.evaluate(x)) / epsilon;
        }

        // 更新参数
        for (size_t j = 0; j < x.size(); ++j) {
            cache[j] = decay_rate * cache[j] + (1 - decay_rate) * pow(gradient[j], 2);
            x[j] -= learning_rate * gradient[j] / (sqrt(cache[j]) + epsilon);
        }
    }

    return x;
}

// Adagrad 算法
std::vector<double> adagrad(const ConvexFunction& func, const std::vector<double>& initial_x, double learning_rate, int max_iterations) {
    std::vector<double> x = initial_x;
    std::vector<double> cache(x.size(), 0.0);
    double epsilon = 1e-8;

    for (int i = 0; i < max_iterations; ++i) {
        // 计算梯度
        std::vector<double> gradient(x.size(), 0.0);
        for (size_t j = 0; j < x.size(); ++j) {
            std::vector<double> x_plus_delta = x;
            x_plus_delta[j] += epsilon;
            double f_plus_delta = func.evaluate(x_plus_delta);
            gradient[j] = (f_plus_delta - func.evaluate(x)) / epsilon;
        }

        // 更新参数
        for (size_t j = 0; j < x.size(); ++j) {
            cache[j] += pow(gradient[j], 2);
            x[j] -= learning_rate * gradient[j] / (sqrt(cache[j]) + epsilon);
        }
    }

    return x;
}

int main() {
    // 创建凸函数对象
    RosenbrockFunction rosenbrock;
    BoothFunction booth;
    HimmelblauFunction himmelblau;
    BealeFunction beale;

    // 设置算法参数
    double learning_rate = 0.01;
    double decay_rate = 0.9;
    int max_iterations = 1000;

    // 初始化初始点
    std::vector<double> initial_x = { 0.0, 0.0 };

    // 使用 Adam 算法找到最优点
    std::vector<double> adam_result = adam(rosenbrock, initial_x, learning_rate, max_iterations);
    std::cout << "Adam Result: (" << adam_result[0] << ", " << adam_result[1] << ")" << std::endl;

    // 使用 RMSProp 算法找到最优点
    std::vector<double> rmsprop_result = rmsprop(rosenbrock, initial_x, learning_rate, decay_rate, max_iterations);
    std::cout << "RMSProp Result: (" << rmsprop_result[0] << ", " << rmsprop_result[1] << ")" << std::endl;

    // 使用 Adagrad 算法找到最优点
    std::vector<double> adagrad_result = adagrad(rosenbrock, initial_x, learning_rate, max_iterations);
    std::cout << "Adagrad Result: (" << adagrad_result[0] << ", " << adagrad_result[1] << ")" << std::endl;

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

企业活动想找媒体报道宣传怎样联系媒体?

在那遥远的公关江湖里,有一个传说,说的是一位勇士,手持鼠标和键盘,踏上了寻找媒体圣杯的征途。这位勇士,就是我们亲爱的市场部门小李,他的任务是为公司即将举行的一场盛大的企业活动找到媒体的聚光灯。 小李的故事,开始于一张空白的Excel表格,上面列着各大媒体的名称,旁边是一片…

4. C++网络编程-TCP客户端的实现

TCP Client网络编程基本步骤 创建socket&#xff0c;指定使用TCP协议使用connect连接服务器使用recv/send接收/发送数据关闭socket TCP-connect连接请求 !man 2 connect #include <sys/types.h> /* See NOTES */ #include <sys/socket.h> int connect(int sock…

Aws EC2 + Aws Cli + Terraform

1 什么是 Terraform&#xff1f; Terraform 是由 HashiCorp 创建的“基础架构即代码”(Infrastructure-as-Code&#xff0c;IaC)开源工具。Terraform 的配置语言是 HashiCorp Configuration Language&#xff08;HCL&#xff09;&#xff0c;用来替代更加冗长的 JSON 和 XML 等…

vue数据持久化仓库

本文章是一篇记录实用性vue数据持久化仓的使用&#xff01; 首先在src中创建store文件夹&#xff0c;并创建一个根据本页面相关的名称&#xff0c; 在终端导入&#xff1a;npm i pinia 和 npm i pinia-plugin-persistedstate 接下来引入代码&#xff1a; import { defineSt…

【Mac】Cinemagraph Pro for Mac(gif图片特效软件) v2.11安装教程

软件介绍 Cinemagraph Pro是一款专为MacOS开发的软件&#xff0c;用于创建精美的cinemagraphs&#xff08;活动静止图&#xff09;。它是一个功能强大且易于使用的工具&#xff0c;可以将您的静态照片转化为带有部分动画的引人注目的图像。 通过Cinemagraph Pro&#xff0c;您…

Go语言之GORM框架(二) ——GORM的单表操作

前言 在上一篇文章中&#xff0c;我们对Gorm进行了介绍&#xff0c;而在这一篇文章中我们主要介绍GORM的单表查询与Hook函数,在进行今天的内容之前我们先事先说明一下&#xff0c;下面我们对单表进行操作的表结构如下&#xff1a; type Student struct {ID uint gorm:&qu…

机器人回调接口完善

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 免责声明&#xff1a;该工具仅供学习使用&#xff0c;禁止使用该工具从事违法活动&#xff0c;否则永久拉黑封禁账号&#xff01;&#xff01;&#xff01;本人不对任何工具的使用负责&am…

Python学习---利用Python操作数据库

如何理解连接connection和游标 cursor&#xff1f; connection就像是连接出发地和目的地的高速公路cursor就像是在高速公路上的货车-拉货我们使用游标就可以完成对数据的操作当我们完成操作完成后就可以停下货车&#xff0c;然后公路再停止使用。 pysql实现查询 ""…

需求开发和管理

人们对需求术语的困惑甚至延伸到整个学科的称谓上。有些作者将整个范围都称为“需求工程”。有些人统称为“需求管理”。还有些人认为这些活动属于广义上的业务分析的一个分支。我们发现&#xff0c;最好将需求工程分为需求开发和需求管理&#xff0c;如图所示。不管项目遵循什…

ubuntu2404 AMD64 编译并安装virtualbox7.0.18

ubuntu2404 AMD64 编译并安装virtualbox7.0.18 0、官方参考文档&#xff1a; https://www.virtualbox.org/wiki/Linux%20build%20instructions 1、下载源码&#xff1a; $ wget https://download.virtualbox.org/virtualbox/7.0.18/VirtualBox-7.0.18.tar.bz2 2、安装库&…

基于信号分解方法的机械故障诊断方法存在的问题

一方面&#xff0c;由于结构共振、测试噪声的干扰&#xff0c;为了确保分解精度&#xff0c;需要给定准确的参数初值(例如&#xff0c;瞬时频率)。研究人员通常认为零部件特征频率与通过传动比和驱动转速计算的理论值基本吻合&#xff0c;并基于理论值设置参数初值。事实上&…

Pytest对协程异步函数进行单元测试

安装 安装基础包 pytest&#xff0c;pytest-asyncio pip install pytest pytest-asyncio测试&#xff1a; pytest -s -v ./python-code/do-async/aiohttp_session_pytest.py书写规范 类名必须以 Test 开头方法和函数名必须以test开头 class TestAddFunc(object): # 测试…

AIGC 006-textual-inversion使用文本反转实现个性化文本到图像生成!

AIGC 006-textual-inversion使用文本反转实现个性化文本到图像生成&#xff01; 文章目录 0 论文工作1 论文方法2 效果 0 论文工作 这篇论文 (An Image is Worth One Word: Personalizing Text-to-Image Generation using Textual Inversion) 提出了一种新颖的技术&#xff0c…

算法:树状数组

文章目录 面试题 10.10. 数字流的秩327. 区间和的个数315. 计算右侧小于当前元素的个数 树状数组可以理解一种数的存储格式。 面试题 10.10. 数字流的秩 假设你正在读取一串整数。每隔一段时间&#xff0c;你希望能找出数字 x 的秩(小于或等于 x 的值的个数)。 请实现数据结构…

揭秘Python安装目录:你的编程宝库隐藏了哪些宝藏?

python3.10安装目录结构 Python310/ │ ├── DLLs/ # Python 解释器所需的 DLL 文件 ├── Doc/ # Python 的 官方文档和参考手册 ├── include/ # 头文件和静态库文件 ├── Lib/ # Python 标准库 ├── libs/ …

可以免费试用得微信辅助工具wetool升级版,可以群发,可以清理僵尸粉,可以自动回复,可以批量添加

今天给大家推荐一款我们目前在使用的电脑群发工具掘金小蜜&#xff0c;不仅可以无限多开&#xff0c;方便你同时管理多个账号&#xff0c;群发功能更是十分强大&#xff0c;轻松释放你的双手。 掘金小蜜&#xff08;只支持Win7及以上操作系统&#xff0c;没有推Mac版和手机客户…

【C语言】二叉树的实现

文章目录 前言⭐一、二叉树的定义&#x1f6b2;二、创建二叉树&#x1f3a1;三、二叉树的销毁&#x1f389;四、遍历二叉树1. 前序遍历2. 中序遍历3. 后序遍历4. 层序遍历 &#x1f332;五、二叉树的计算1. 计算二叉树结点个数2. 计算二叉树叶子结点的个数3. 计算二叉树的深度4…

决策控制类软件项目的团队配置

决策控制类软件项目的团队配置怎样才是最合适的&#xff1f;目的就是实现高效的项目协作以及为企业降本增效。软件项目的主要费用来源是研发人员的开支以及差旅费用。 下面的思维导图从项目与产品的关系、团队架构、项目成员配置、项目可复制性、招聘这几点进行说明如何组织人…

力扣刷题--2176. 统计数组中相等且可以被整除的数对【简单】

题目描述 给你一个下标从 0 开始长度为 n 的整数数组 nums 和一个整数 k &#xff0c;请你返回满足 0 < i < j < n &#xff0c;nums[i] nums[j] 且 (i * j) 能被 k 整除的数对 (i, j) 的 数目 。 示例 1&#xff1a; 输入&#xff1a;nums [3,1,2,2,2,1,3], k …