//gradient descent algorithm
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace gradient_descent_algorithm
{
class Program
{
/// <summary>
/// 定义二元函数,容易知道该函数在(0,0)处有全局的最小值,可以用来检验算法是否收敛
/// </summary>
/// <param name="var1"></param>
/// <param name="var2"></param>
/// <returns></returns>
private static double function(double var1, double var2)
{
double value_fun = var1 * var1 + var2 * var2;
return value_fun;
}
static void Main(string[] args)
{
//求偏导数时的delta值
double delta_x = 0.001;
double delta_y = 0.001;
//迭代次数
double NumIterations = 0;
//初始值
double init_x = 4;
double init_y = 7;
//学习率
double rate = 0.002;
while (NumIterations < 10000) //迭代次数
{
double temp1 = function(init_x + delta_x, init_y) - function(init_x,init_y);
double temp2 = function(init_x, init_y + delta_y) - function(init_x, init_y);
//分别求关于x和y的偏导数
double patial_x = temp1 / delta_x;
double patial_y = temp2 / delta_y;
//更新初始值
double new_x = init_x - rate * patial_x;
double new_y = init_y - rate * patial_y;
Console.WriteLine("新的X值为:{0},新的Y值为:{1},当前最小值为:{2}", new_x,new_y,function(new_x,new_y));
init_x = new_x;
init_y = new_y;
NumIterations++;
}
double result = function(init_x,init_y);
Console.WriteLine("\r\n");
Console.WriteLine("迭代结果为:{0}", result);
Console.ReadKey();
}
}
}