首页 > 编程语言 >LM拟合 C++

LM拟合 C++

时间:2023-10-19 19:44:06浏览次数:41  
标签:fx double LM C++ Js int vector 拟合 data

未完成

#include <iostream>
#include <vector>
#include <array>
#include <ctime>
#include <random>

using namespace std;

void Calc_J_fx(vector<array <double, 2> >& data,
			   double& k,
			   vector<double>& Js,
			   vector<double>& fx)
{
	for (int i = 0; i < data.size(); ++i)
	{
		double x = data[i][0];
		double y = data[i][1];
		Js[i] = 2 * x;
		fx[i] = k * x * x - y;
	}
}

void Calc_H_g(vector<double>& Js,
			  vector<double>& fx,
			  double& H,
			  double& g)
{
	H = 0;
	g = 0;
	for (int i = 0; i < data.size(); ++i)
	{
		H += Js[i] * Js[i];
		g += -Js[i] * fx[i]
	}
}

void Calc_Cost(vector<double>& fx,
			   double& cost)
{
	cost = 0
	for (int i = 0; i < fx.size(); ++i)
	{
		cost += fx[i] * fx[i]
	}
}

void Calc_F(vector<array <double, 2> >& data,
			double& k,
			double& F)
{
	for (int i = 0; i < data.size(); ++i)
	{
		double x = data[i][0];
		double y = data[i][1];
		double f = k * x * x - y;
		F += 0.5 * f;
	}
}

void Calc_L(double& mu,
			double& g, 
			double& dk,
		    double& dL)
{
	dL = 0.5 * dk * (mu * dk - g);
}

int main()
{
	int N = 30;
	vector< array<double, 2> > data;

	std::default_random_engine e;
    std::uniform_real_distribution<double> u(0,5);
	std::default_random_engine e_;
    std::uniform_real_distribution<double> u_(-0.5,0.5);
    e.seed(time(0));

	for (int i = 0; i < N; ++i)
	{
		double x = u(e);
		double y = k * x * x + double(u_(e_));
		data[i][0] = x;
		data[i][1] = y;
	}
	
	k = 0;
	double 
	int max_iter_num = 200;
	double epsilon2 = 1e-6;
	double epsilon1 = 1e-6;
	vector<double> Js;
	vector<double> fx
	double H = 0;
	double k = 2;
	double g = 0;
	double cost = 0;
	
	Cala_J_fx(data, k, Js, fx);
	Cala_H_g(Js, fx, H, g);
	double mu = H;
	double vu = 2.0;
	
	data.reserve(N);
	Js.reserve(N);
	fx.reserve(N);
	
	for (int it = 0; it < max_iter_num; ++it)
	{
		Cala_J_fx(data, k, Js, fx);
		Cala_H_g(Js, fx, H, g);
		
		// 梯度较小
		if (sqrt(g * g) < epsilon1)
		{
			break
		}
			
		double dk = 1./H * g;
		
		// 增量少
		if (sqrt(dk * dk) <= epsilon2 * sqrt(k * k) + epsilon2)
		{
			break;
		}
		else
		{
			double new_k = k + dk;
			double F0, F1, rho;
			Calc_F(data, k, F0);
			Calc_F(data, new_k, F1);
		    Calc_L(mu, g, dk, dL);
			rho = (F0 - F1)/dL;
			if (rho > 0)
			{
				k = new_k;
				mu = max(1.0 / 3.0, 1 - pow(2 * roi - 1, 3));
				vu = 2.0;	
			}
			else
			{
				mu = mu * vu;
				vu *= 2;
			}	
		}
	}
	
	

   	return 0;
}

标签:fx,double,LM,C++,Js,int,vector,拟合,data
From: https://www.cnblogs.com/narjaja/p/17775389.html

相关文章

  • C++
    1.什么是引用?简单来说就是给一个变量起别名。(本质是一个指针常量)当编译器遇到int&a=b;时,自动转成int*consta=&b,然后遇到a时编译成*a用法:数据类型&引用名=变量名inta=10;int&b=a;//b与a代表同一个数据注意①引用必须要初始化。int&b;//错误②引用一旦初始化后,就不能再更改......
  • C++ 模板特化与偏特化:解析与应用
    引言在C++中,模板是一种非常强大的特性,它们允许我们编写通用、可重用的代码。但有时,我们需要为某些特定的数据类型或类提供特殊的实现,这时就需要使用到模板特化(TemplateSpecialization)和模板偏特化(PartialTemplateSpecialization)。本文将深入探讨这两者的概念、用法和注意事项......
  • 多源最短路径的原理及C++实现
    时间复杂度O(n3),n是端点数。核心代码template<classT,TINF=1000*1000*1000>classCNeiBoMat{public:CNeiBoMat(intn,constvector<vector<int>>&edges,boolbDirect=false,boolb1Base=false){m_vMat.assign(n,vector<int>......
  • 存在负权边的单源最短路径的原理和C++实现
    负权图此图用朴素迪氏或堆优化迪氏都会出错,floyd可以处理。负环图 但floyd无法处理负权环,最短距离是无穷小。在环上不断循环。经过k条边的最短距离(可能有负权变)贝尔曼福特算法(bellman_ford)就是解决此问题的。原理循环k次,循环第i次时,m_vDis表示各点最多经过i-1条边的最短距离;v......
  • 堆优化迪氏最短单源路径原理及C++实现
    时间复杂度O(ElogE),E是边数。适用与稀疏图。使用前提边的权为正。可以非连通,非连通的距离为-1。原理优选队列(小根堆)记录两个数据:当前点到源点距离,当前点。先处理距离小的点;如果距离相等,先处理谁都可以。可以用pair记录,不用重写小于。优先队列只记录如下情况的距离:一,{0,源点}。二,......
  • 有向图计数优化版原理及C++实现
    题目见前面章节。有向图访问计数的原理及C++实现第一版不需要拓扑排序,也不需要并集查找,直接dfs了。完成以下三个职责:一,DFS那些端点在环上。二,DFS环上各点此环的长度。三,DFS非环上各点。分析cur是当前dfs的节点,next为edges[cur]。从后向前分析:判定处理ret的值返回值找到环尾ret......
  • 朴素迪氏最短单源路径的原理及C++实现
    Dijkstra算法,翻译为迪杰斯特拉或狄克斯特拉。在下驽钝,记不住如此长的翻译,故简称迪氏。时间复杂度O(n2),端点数的平方。使用前提边的权为正。可以非连通,非连通的距离为-1。原理源点到源点的最短路径只有一个节点{s}。除源点本身外,其它端点的最短路径至少有两个端点,整个路径{s...x2}可......
  • 有向图访问计数的原理及C++实现
    题目现有一个有向图,其中包含n个节点,节点编号从0到n-1。此外,该图还包含了n条有向边。给你一个下标从0开始的数组edges,其中edges[i]表示存在一条从节点i到节点edges[i]的边。想象在图上发生以下过程:你从节点x开始,通过边访问其他节点,直到你在此过程中再次......
  • [Mac] 安装paddle-pipelines出现 ERROR: Failed building wheel for lmdb
    今天在mac换了新系统,然后重新安装paddle-piplines的时候出现了下面的问题:xcrun:error:invalidactivedeveloperpath(/Library/Developer/CommandLineTools),missingxcrunat:/Library/Developer/CommandLineTools/usr/bin/xcrunerror:command'/usr/bin/clang'fai......
  • LLM探索:为ChatGLM2的gRPC后端增加连续对话功能
    前言之前我做AIHub的时候通过gRPC的方式接入了ChatGLM等开源大模型,对于大模型这块我搞了个StarAI框架,相当于简化版的langchain,可以比较方便的把各种大模型和相关配套组合在一起使用。主要思路还是用的OpenAI接口的那套,降低学习成本,但之前为了快速开发,就只搞了个简单......