最適化最適化
関数フィッティング手法 基本クラス

概要
各種関数フィッティング手法クラスに継承される。

ソースコード

namespace DataFitting {
    /// <summary>フィッティング基本クラス</summary>
    public abstract class FittingMethod {

        /// <summary>フィッティング対象のデータ</summary>
        protected readonly FittingData[] data_list;

        /// <summary>コンストラクタ</summary>
        public FittingMethod(FittingData[] data_list, int parameters) {
            if(data_list == null) {
                throw new ArgumentNullException(nameof(data_list));
            }
            if(data_list.Length < 1) {
                throw new ArgumentException(nameof(data_list));
            }
            if(parameters < 1) {
                throw new ArgumentException(nameof(parameters));
            }

            this.data_list = data_list;
            this.ParametersCount = parameters;
        }

        /// <summary>パラメータ数</summary>
        public int ParametersCount {
            get; private set;
        }

        /// <summary>誤差二乗和</summary>
        public double Cost(Vector parameters) {
            if(parameters == null) {
                throw new ArgumentNullException(nameof(parameters));
            }
            if(parameters.Dim != ParametersCount) {
                throw new ArgumentException(nameof(parameters));
            }

            Vector errors = Error(parameters);
            double cost = 0;
            for(int i = 0; i < errors.Dim; i++) {
                cost += errors[i] * errors[i];
            }

            return cost;
        }

        /// <summary>誤差</summary>
        public Vector Error(Vector parameters) {
            if(parameters == null) {
                throw new ArgumentNullException(nameof(parameters));
            }
            if(parameters.Dim != ParametersCount) {
                throw new ArgumentException(nameof(parameters));
            }

            Vector errors = Vector.Zero(data_list.Length);

            for(int i = 0; i < data_list.Length; i++) {
                errors[i] = FittingValue(data_list[i].X, parameters) - data_list[i].Y;
            }

            return errors;
        }

        /// <summary>フィッティング値</summary>
        public abstract double FittingValue(double x, Vector parameters);
    }

    /// <summary>フィッティング関数真値</summary>
    public struct FittingData {

        /// <summary>コンストラクタ</summary>
        public FittingData(double x, double y) {
            this.X = x;
            this.Y = y;
        }

        /// <summary>独立変数</summary>
        public double X { get; set; }

        /// <summary>従属変数</summary>
        public double Y { get; set; }

        /// <summary>文字列化</summary>
        public override string ToString() {
            return $"{X},{Y}";
        }
    }

    /// <summary>フィッティング関数</summary>
    public class FittingFunction {
        readonly Func<double, Vector, double> f;
        readonly Func<double, Vector, Vector> df;

        /// <summary>コンストラクタ</summary>
        public FittingFunction(int parameters_count, Func<double, Vector, double> f, Func<double, Vector, Vector> df) {
            this.ParametersCount = parameters_count;
            this.f = f;
            this.df = df;
        }

        /// <summary>パラメータ数</summary>
        public int ParametersCount {
            get; private set;
        }

        /// <summary>関数値</summary>
        public double F(double x, Vector v) {
            return f(x, v);
        }

        /// <summary>関数勾配</summary>
        public Vector DiffF(double x, Vector v) {
            return df(x, v);
        }
    }
}

関連項目
ベクトルクラス
行列クラス
直線フィッティング
多項式フィッティング
非線形フィッティング Gauss-Newton法
非線形フィッティング Levenberg-Marquardt法
重み付き直線フィッティング
重み付き多項式フィッティング
最小二乗法におけるロバスト推定

ライブラリライブラリ
確率統計確率統計
線形代数線形代数
幾何学幾何学
最適化最適化
微分方程式微分方程式
画像処理画像処理
補間補間
機械学習機械学習
クラスタリングクラスタリング
パズルゲーム・パズル
未分類未分類