牛顿法(吴恩达机器学习c#实践)
参考书目:机械最优设计技术,孟兆明 常德功编著
以下公式,要求理解泰勒展开和矩阵求导,可以参考我的博文,sift高斯差分函数泰勒展开的理解(矩阵求导)
namespace 牛顿法//求函数minF(X)=x0^2+x1^2-x0*x1-15*x0+75
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
int 维数N = 2;
double 收敛精度E = 0.01;
double[] X;
private void Form1_Load(object sender, EventArgs e)
{
X = new double[维数N];
for (int n = 0; n < 维数N; n++)
{
X[n] = 0; // X[0] = 0;
// X[1] = 0;
}
newton迭代(X[0], X[1]);
}
private void newton迭代(double a0, double a1)
{
double[] X的偏导数P = new double[维数N];
X的偏导数P[0] = 2 * a0 - a1 - 15;//x0^2+x1^2-x0*x1-15*x0+75=f
X的偏导数P[1] = 2 * a1 - a0;
//求梯度幅值
double G = 0;
for (int i = 0; i < 维数N; i++)
{
G += X的偏导数P[i] * X的偏导数P[i];
}
G = Math.Sqrt(G);
double f = a0 * a0 + a1 * a1 - a0 * a1 - 15 * a0 + 75;
//求黑塞矩阵,此处已经求出
int H00 = 2;
int H01 = -1;
int H10 = -1;
int H11 = 2;
if (G > 收敛精度E)//继续迭代
{
//求黑塞矩阵的逆矩阵,此处已经求出
double 逆H00 = 2.0 / 3;//A
double 逆H01 = 1.0 / 3;//B
double 逆H10 = 1.0 / 3;//C
double 逆H11 = 2.0 / 3;//D
a0 = a0 - 逆H00 * X的偏导数P[0] - 逆H01 * X的偏导数P[1];
a1 = a1 - 逆H10 * X的偏导数P[0] - 逆H11 * X的偏导数P[1];
//继续迭代
newton迭代(a0, a1);
}
}
}
}