첨부 실행 코드는 나눔고딕코딩 폰트를 사용합니다.

728x90
반응형
728x170

▶ 최소 제곱법을 사용해 회귀분석 수식 구하기 예제

using System;
using System.Collections.Generic;

List<Item> itemList = new List<Item>();

itemList.Add(new Item(1d  , 2.1d));
itemList.Add(new Item(3d  , 3.7d));
itemList.Add(new Item(2.5d, 3.4d));
itemList.Add(new Item(3.9d, 3.1d));

LeastSquaresMethod lsm = new LeastSquaresMethod(itemList);

Console.WriteLine(lsm.FactorA0);
Console.WriteLine(lsm.FactorA1);

 

728x90

 

▶ 최소 제곱법을 사용해 회귀분석 수식 구하기

using System;
using System.Collections.Generic;

/// <summary>
/// 항목
/// </summary>
public struct Item
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Field
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// X 값
    /// </summary>
    private double xValue;

    /// <summary>
    /// Y 값
    /// </summary>
    private double yValue;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region X 값 - XValue

    /// <summary>
    /// X 값
    /// </summary>
    public double XValue
    {
        get
        {
            return this.xValue;
        }
        set
        {
            this.xValue = value;
        }
    }

    #endregion

    #region Y 값 - YValue

    /// <summary>
    /// Y 값
    /// </summary>
    public double YValue
    {
        get
        {
            return this.yValue;
        }
        set
        {
            this.yValue = value;
        }
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - Item(xValue, yValue)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="xValue">X 값</param>
    /// <param name="yValue">Y 값</param>
    public Item(double xValue, double yValue)
    {
        this.xValue = xValue;
        this.yValue = yValue;
    }

    #endregion
}

/// <summary>
/// 최소 제곱법
/// </summary>
public class LeastSquaresMethod
{
    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region Field

    /// <summary>
    /// 항목 리스트
    /// </summary>
    private List<Item> itemList = new List<Item>();

    /// <summary>
    /// 계수 A0
    /// </summary>
    private double factorA0 = 0d;

    /// <summary>
    /// 계수 A1
    /// </summary>
    private double factorA1 = 0d;

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Property
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 계수 A0 - FactorA0

    /// <summary>
    /// 계수 A0
    /// </summary>
    public double FactorA0
    {
        get
        {
            return this.factorA0;
        }
    }

    #endregion

    #region 계수 A1 - FactorA1

    /// <summary>
    /// 계수 A1
    /// </summary>
    public double FactorA1
    {
        get
        {
            return this.factorA1;
        }
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Constructor
    ////////////////////////////////////////////////////////////////////////////////////////// Public

    #region 생성자 - LeastSquaresMethod(itemList)

    /// <summary>
    /// 생성자
    /// </summary>
    /// <param name="itemList">항목 리스트</param>
    public LeastSquaresMethod(List<Item> itemList)
    {
        this.itemList = itemList;

        Calculate();
    }

    #endregion

    //////////////////////////////////////////////////////////////////////////////////////////////////// Method
    ////////////////////////////////////////////////////////////////////////////////////////// Private

    #region 계산하기 - Calculate()

    /// <summary>
    /// 계산하기
    /// </summary>
    private void Calculate()
    {
        double sigmaX  = 0d;
        double sigmaY  = 0d;
        double sigmaXY = 0d;
        double sigmaX2 = 0d;

        for(int i = 0; i < this.itemList.Count; i++)
        {
            Item item = this.itemList[i];

            sigmaX  += item.XValue;
            sigmaY  += item.YValue;
            sigmaXY += item.XValue * item.YValue;
            sigmaX2 += item.XValue * item.XValue;
        }

        if(this.itemList.Count > 1)
        {
            this.factorA0 = (sigmaX2 * sigmaY - sigmaXY * sigmaX) / (this.itemList.Count * sigmaX2 - sigmaX * sigmaX);
            this.factorA1 = (this.itemList.Count * sigmaXY - sigmaX * sigmaY) / (this.itemList.Count * sigmaX2 - sigmaX * sigmaX);
        }
    }

    #endregion
}
728x90
반응형
그리드형(광고전용)
Posted by icodebroker

댓글을 달아 주세요