c# - 非线性模型参数的非线性(加权)最小二乘估计
问题描述
我正在尝试使用具有以下公式的 sigmoidal 函数(4PL)来拟合指数数据:
y = a + (k-a) /(1 + exp((v-x)/c)
虽然使用 RI 有很好的结果,但使用 C# 和框架 Accord.Net 我得到的结果很差。
这是我的代码:
var nls = new NonlinearLeastSquares()
{
NumberOfParameters = 4,
StartValues = new[] {0d, 40000d, 35d,1d }
Function = (parameters, input) =>
{
return parameters[0] + ((parameters[1] - parameters[0]) / ( 1 +
Math.Exp((parameters[2] - input[0] )/parameters[3]) ) );
},
Gradient = (parameters, input, result) =>
{
result[0] = 1 - ( 1 / (1 + Math.Exp((parameters[2] - input[0]) /
parameters[3]))); // d/da
result[1] = 1 / (1 + Math.Exp((parameters[2] - input[0]) /
parameters[3])); // d/dk
result[2] = -((parameters[1] - parameters[0])*
Math.Exp((parameters[2] - input[0]) / parameters[3])) /
parameters[3]*Math.Pow(1 + Math.Exp((parameters[2] -
input[0]) / parameters[3]),2); // d/dv
result[3] = ((parameters[1] - parameters[0]) * (parameters[2] -
input[0]) * Math.Exp((parameters[2] - input[0]) /
parameters[3])) / Math.Pow(parameters[3], 2) *
Math.Pow(1 + Math.Exp((parameters[2] - input[0]) /
parameters[3]), 2); // d/dc
},
Algorithm = new LevenbergMarquardt()
{
MaxIterations = 100,
Tolerance = 0
}
};
var regression = nls.Learn(inputs, outputs);
// The solution will be at:
double a = regression.Coefficients[0];
double k = regression.Coefficients[1];
double v = regression.Coefficients[2];
double c = regression.Coefficients[3];
我被这个问题困住了,任何帮助将不胜感激,
解决方案
对于有兴趣的人,我找到了解决方案。
问题是 result[2] (d/dv) 和 result[3] (d/dc) 的梯度。
分母中缺少括号。
result[2] = -((parameters[1] - parameters[0])*
Math.Exp((parameters[2] - input[0]) / parameters[3])) /
(parameters[3]*Math.Pow(1 + Math.Exp((parameters[2] -
input[0]) / parameters[3]),2)); // d/dv
result[3] = ((parameters[1] - parameters[0]) * (parameters[2] -
input[0]) * Math.Exp((parameters[2] - input[0]) /
parameters[3])) / (Math.Pow(parameters[3], 2) *
Math.Pow(1 + Math.Exp((parameters[2] - input[0]) /
parameters[3]), 2)); // d/dc
推荐阅读
- java - /data/local/tmp/test 错误=13,权限被拒绝
- python - 根据中位数和标准差去除异常值
- javascript - litelement - 处理点击离开事件
- python - 追加到列表每次都会换行?
- c# - 使用 SignalR 和 ASP.NET MVC 5.2 在长时间运行的操作完成时发送消息
- javascript - 用于检查确切的字母数字和特殊字符的 Javascript 正则表达式
- flutter - 点击时如何更改容器的背景颜色
- enums - 我可以匹配所有具有相同形状值的枚举变体吗?
- java - 更改列表中的字符串值
将 java.sql.date 值插入 SQL DB - python-3.x - 词表压缩