最新代码https://github.com/JackJu-HIT/GradDesent.git能收敛,但是精度不高。
执行方法
cd build/
cmake ..
make
./RANSAC
执行效果
如何使用令牌上传代码到github
1742 git status
1743 git add ./
1744 git commit -m "[update Grad Descent Code]"
1745 git remote remove origin
1747 git remote add origin https://ghp_KtJ1WLibLaBnTRbkUYpj8CJPzAcC(令牌)@github.com/JackJu-HIT/GradDesent.git
1748 git push
1749 git push --set-upstream origin master
具体token令牌可参考这篇文章:https://blog.csdn.net/LanXiu_/article/details/122323713
20221211
此梯度下降还不收敛,在优化中。。。。。。。。。。。。。。。。。。。。。20221201
____________________________________分割线啊————————————————
我想写一个F(x) = B + W0X+W1X^2+W2X ^3 去使用数据估计W0 W1 W2 B的参数。
base
我准备按照下面的算法实现代码:
#include "GradDescent.h"
#include "MATRIXINVERSE.h"
#include <iostream>
using namespace std;
int main()
{
GradDecent gradSolve;
vector<vector<double> > Sample;//= { {1,11}, {2,13 }, { 3, 15 }, { 4, 17 } , {5,19},{6,21} };
for(int j = 0;j<100;j++){
vector<double> temp;
for(int i = 0;i < 2;i++){
temp.push_back(j);
temp.push_back(2*j+9);
}
Sample.push_back(temp);
}
gradSolve.sampleData = Sample;
vector<double> re = gradSolve.calculateGradDescent();
for(int i = 0;i < re.size();i++){
cout<<re[i]<<endl;
}
MATRIXINVERSE matrixinverse;
//matrixinverse.m_r = 2;
cout<<matrixinverse.calculateMATRIXInverse()<<endl;
/*
circle c1;//c1是起得名
//给圆的对象的属性进行赋值
c1.m_r=10;
cout<<"圆的周长(改):"<<c1.calculate()<<endl;;
*/
}
/**
* @file GradDescent.cpp
* @author juchunyu
* @brief
* @version 0.1
* @date 2022-11-27
* @copyright Copyright (c) 2022
*
*/
#include "GradDescent.h"
#include <iostream>
#include <cmath>
using namespace std;
double iterations = 2;
double tolerance = 0.01;
double Y = 0.5;
int J_iterations = 0;
double W = 0;
double W1 = 0;
double W2 = 0;
double B = 0;
double W_temp;
double W1_temp;
double W2_temp;
double B_temp;
double J_last;
double J_current;
double W_result;
double W1_result;
double W2_result;
double B_result;
//求解梯度下降
vector<double> GradDecent::calculateGradDescent()
{
vector<vector<double> > a = this->sampleData;
cout<<a[0][0]<<" "<<a[0][1]<<endl;
cout<<a.size()<<endl;
cout<<a[0].size()<<endl;
cout<<"已经进入梯度下降代码!"<<endl;
/***
Y = 2 X +9,
(1,11) (2,13) (3,15) (4,17)
*/
//double a[SIZE][2] = {1,11,2,13,3,15,4,17,5,19,6,21};
/*
*F = W*X+B
*J = (W*Xi+B-yi)^2/2*n
*/
cout<<"输入数据"<<endl;
for(int i = 0;i < a.size();i++){
for(int j = 0;j<2;j++){
cout<<a[i][j]<<" ";
}
cout<<endl;
}
for(int k = 0;k < a.size();k++){
J_last += (B + W * a[k][0]+ W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0] * a[k][0] - a[k][1]) * (B + W * a[k][0]+ W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0] * a[k][0] - a[k][1]);
}
J_last = J_last/(2*a.size());
for(int i = 0;i < iterations;i++){
double DJDW = 0;
for(int k = 0;k < a.size();k++){
DJDW += (B + W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0] * a[k][0]- a[k][1]) * a[k][0];
}
DJDW = DJDW/a.size();
cout<<"DIDW"<<DJDW<<endl;
double DJDW1 = 0;
for(int k = 0;k < a.size();k++){
DJDW1 += (B + W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0]* a[k][0] - a[k][1]) * a[k][0] * a[k][0];
}
DJDW1 = DJDW1/a.size();
cout<<"DIDW1"<<DJDW1<<endl;
double DJDW2 = 0;
for(int k = 0;k < a.size();k++){
DJDW2 += (B + W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0]* a[k][0] - a[k][1]) * a[k][0] * a[k][0]* a[k][0];
}
DJDW2 = DJDW2/a.size();
cout<<"DIDW2"<<DJDW2<<endl;
double DJDB = 0;
for(int k = 0;k < a.size();k++){
DJDB += B + W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0]* a[k][0] - a[k][1];
}
DJDB = DJDB/a.size();
cout<<"DJDB"<<DJDB<<endl;
W_temp = W - Y * DJDW;
W1_temp = W1 - Y * DJDW1;
W2_temp = W2 - Y * DJDW2;
B_temp = B - Y * DJDB;
W = W_temp;
W1 = W1_temp;
W2 = W2_temp;
B = B_temp;
cout<<"W"<<W<<endl;
cout<<"W1:"<<W1<<endl;
cout<<"W2:"<<W2<<endl;
cout<<"B"<<B<<endl;
J_current = 0;
for(int k = 0;k < a.size();k++){
J_current += (B + W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0]* a[k][0] - a[k][1]) * (B+ W * a[k][0] + W1 * a[k][0] * a[k][0] + W2 * a[k][0] * a[k][0]* a[k][0] - a[k][1]);
}
J_current = J_current/(2*a.size());
cout<<"J_current"<<J_current<<"J_Last"<<J_last<<endl;
if(abs(J_current - J_last) < tolerance){
W_result = W;
W1_result = W1;
W2_result = W2;
B_result = B;
J_iterations = i;
break;
}
cout<<"W_result:"<<W_result<<endl;
cout<<"W1_result:"<<W1_result<<endl;
cout<<"W2_result:"<<W2_result<<endl;
cout<<"B_result:"<<B_result<<endl;
cout<<"J_iterations:"<<J_iterations<<endl;
J_last = J_current;
}
cout<<"W_result:"<<W_result<<endl;
cout<<"W1_result:"<<W1_result<<endl;
cout<<"W2_result:"<<W2_result<<endl;
cout<<"B_result:"<<B_result<<endl;
cout<<"J_iterations:"<<J_iterations<<endl;
cout<<"a"<<a[0][0];
return {W_result,W1_result,W2_result,B_result ,J_iterations};
}
#include <iostream>
#include <vector>
using namespace std;
class GradDecent
{
public:
vector< vector<double> > sampleData; //输入样本数据
vector<double> calculateGradDescent();//计算梯度下降
};
CmakeLists
CMAKE_MINIMUM_REQUIRED(VERSION 2.8)
PROJECT(RANSAC)
set( CMAKE_CXX_FLAGS "-std=c++11")
INCLUDE_DIRECTORIES("/usr/include/eigen3") #("${EIGEN3_INCLUDE_DIR}")
#SET(EIGEN3_INCLUDE_DIR "$ENV{EIGEN3_INCLUDE_DIR}")
#IF(NOT EIGEN3_INCLUDE_DIR)
# MESSAGE( FATAL_ERROR "Please point the environment variable EIGEN3_INCLUDE_DIR to the include directory of your Eigen3 installation.")
#ENDIF()
#INCLUDE_DIRECTORIES(/usr/include/eigen3) #("${EIGEN3_INCLUDE_DIR}")
#ADD_EXECUTABLE(test test.cpp)
#include_directories(src)
# 找到src目录及其子目录下的所有c文件和h文件
file(GLOB_RECURSE PROJECT_SOURCES "src/*.cpp") #"MATRIX/*.cpp" "Grad/*.cpp"
file(GLOB_RECURSE PROJECT_HEADERS "src/*.h" )
#file(GLOB_RECURSE PROJECT_SOURCES "src/*.cpp" "src/*.c" "src/*.cc")
#file(GLOB_RECURSE PROJECT_HEADERS "src/*.hpp" "src/*.h" "src/*.hh")
add_executable(RANSAC ${PROJECT_SOURCES} ${PROJECT_HEADERS})