Microsoft MVP성태의 닷넷 이야기
Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method) [링크 복사], [링크+제목 복사],
조회: 24443
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일
(연관된 글이 1개 있습니다.)
(시리즈 글이 7개 있습니다.)
Math: 15. 그래프 그리기로 알아보는 뉴턴-랩슨(Newton-Raphson's method)법과 제곱근 구하기 - C#
; https://www.sysnet.pe.kr/2/0/10911

Math: 53. C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)
; https://www.sysnet.pe.kr/2/0/11918

Math: 54. C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법
; https://www.sysnet.pe.kr/2/0/11919

Math: 55. C# - 다항식을 위한 최소 자승법(Least Squares Method)
; https://www.sysnet.pe.kr/2/0/11921

Math: 56. C# - 그래프 그리기로 알아보는 경사 하강법의 최소/최댓값 구하기
; https://www.sysnet.pe.kr/2/0/11923

Math: 57. C# - 해석학적 방법을 이용한 최소 자승법
; https://www.sysnet.pe.kr/2/0/11924

Math: 58. C# - 최소 자승법의 1차, 2차 수렴 그래프 변화 확인
; https://www.sysnet.pe.kr/2/0/11936




C# - 다항식을 위한 최소 자승법(Least Squares Method)

지난 글에서,

C# - 행렬식을 이용한 최소 자승법(LSM: Least Square Method)
; https://www.sysnet.pe.kr/2/0/11918

최소 자승법(최소 제곱법)을 이용해 1차 함수로 근사하는 것을 봤는데요, 이를 2차, 3차,...로 확장하는 것은 다음과 같이 매우 쉽습니다.

다항식(Polynomial): aXn 형식의 항들의 합으로 구성된 식
a: 계수(Coefficient)
X: 변수(Variable)
n: 지수(Exponent)

θ0 + θ1x1 + θ2x12 = y1
θ0 + θ1x2 + θ2x22 = y2
...
θ0 + θ1xn + θ2xn2 = yn



θ0 + θ1x1 + θ2x12 + θ3x13 = y1
θ0 + θ1x2 + θ2x22 + θ3x13 = y2
...
θ0 + θ1xn + θ2xn2 + θ3x13 = yn



따라서 행렬을 사용하는 경우 그냥 늘어나는 방정식의 계수만큼 행을 추가해 의사역행렬을 구한 후 연산하면 매개변수를 구할 수 있습니다.

private static double[] GetPolynomial(double[] xData, double[] yData, int numberOfEfficient)
{
    Matrix<double> matA = CreateMatrix.DenseOfColumnMajor(xData.Count(), 1, xData);
    Vector<double> add1 = Vector<double>.Build.DenseOfArray(Enumerable.Repeat(1.0, xData.Count()).ToArray());
    matA = matA.InsertColumn(1, add1);

    for (int i = 1; i < numberOfEfficient; i++)
    {
        double[] newColumnData = xData.Select((elem) => Math.Pow(elem, i + 1)).ToArray();
        Vector<double> addX = Vector<double>.Build.DenseOfArray(newColumnData);
        matA = matA.InsertColumn(0, addX);
    }

    Console.WriteLine(matA);
    Matrix<double> matB = CreateMatrix.DenseOfColumnMajor(yData.Count(), 1, yData);

    Matrix<double> pinvMatA = matA.PseudoInverse();
    Console.WriteLine(pinvMatA);

    Matrix<double> matX = pinvMatA * matB;
    return matX.AsColumnMajorArray();
}

[파란색 - 1차 함수, 빨간색 - 2차 함수, 노란색 3차 함수]
lsm_polynomial_1.png

일반적으로 차수가 올라갈수록 (과적합의 문제가 발생할 수 있지만) 오류는 더 적어집니다. 확인을 위해 간단하게 다음과 같이 작성해 보면,

private static void ReportError(double[] xData, double[] yData, Func<double, double> func)
{
    double error = 0.0;

    for (int i = 0; i < xData.Length; i ++)
    {
        double diff = yData[i] - func(xData[i]);
        error += (diff * diff);
    }

    Console.WriteLine("Error: " + error);
}
/*
1차: Error: 19086.9489618992
2차: Error: 6555.72459287144
3차: Error: 5038.32058563331
*/

1차에 비해 2차에서 두드러지게 오류가 낮아지는 것을 볼 수 있습니다. 따라서 이런 경우 효율을 고려한다면 2차 함수를 사용하는 것이 좋은 선택일 수 있습니다.

(첨부 파일은 이 글의 예제 코드를 포함합니다.)




지난 글에서 행렬 라이브러리를 직접 사용하지 않고 1차 근사식에 대한 매개 변수를 구하는 방법을 알아봤는데요,

C# - 최소 자승법의 1차 함수에 대한 매개변수를 단순 for 문으로 구하는 방법
; https://www.sysnet.pe.kr/2/0/11919

말 그대로 연립 방정식이므로 가우스 소거법을 이용해 매개 변수를 구하는 것도 가능합니다. 코드가 눈에 잘 안 들어오지만 어차피 복붙으로 써야 하는 것이라 큰 문제는 안 될 것입니다. ^^

Linear Equation Solver - Gaussian Elimination (C#)
; https://www.codeproject.com/Tips/388179/Linear-Equation-Solver-Gaussian-Elimination-Csharp

Gaussian elimination
; https://rosettacode.org/wiki/Gaussian_elimination#C.23

Solve a system of equations with Gaussian elimination in C#
; http://csharphelper.com/blog/2014/10/solve-a-system-of-equations-with-gaussian-elimination-in-c/

[C#/WINFORM] 다항식 최소 제곱법(Polynomial Least Squares Method) 사용하기
; https://icodebroker.tistory.com/5580




[이 글에 대해서 여러분들과 의견을 공유하고 싶습니다. 틀리거나 미흡한 부분 또는 의문 사항이 있으시면 언제든 댓글 남겨주십시오.]

[연관 글]






[최초 등록일: ]
[최종 수정일: 9/2/2021]

Creative Commons License
이 저작물은 크리에이티브 커먼즈 코리아 저작자표시-비영리-변경금지 2.0 대한민국 라이센스에 따라 이용하실 수 있습니다.
by SeongTae Jeong, mailto:techsharer at outlook.com

비밀번호

댓글 작성자
 




... 166  167  168  169  [170]  171  172  173  174  175  176  177  178  179  180  ...
NoWriterDateCnt.TitleFile(s)
765정성태8/22/200928666.NET Framework: 156. XamDataGrid의 UnboundField 사용파일 다운로드1
764정성태8/21/200923026Windows: 47. Windows Virtual PC에 설치된 Windows 7 VPC에서 Aero 효과 사용 [3]
763정성태8/20/200926592Windows: 46. Windows 7 - XP 모드 응용 프로그램 바로가기 만드는 방법 [2]
762정성태8/18/200932233개발 환경 구성: 48. 개발자 PC 환경 - 유니코드(Unicode)를 위한 설정 [3]
760정성태8/17/200938632개발 환경 구성: 47. XmlCodeGenerator 1.0.0.4 업데이트 [2]
759정성태8/16/200930481.NET Framework: 155. 닷넷 프로파일러의 또 다른 응용: Visual Studio 2010 Historical Debugging
758정성태8/15/200923845VS.NET IDE: 65. WPF 프로젝트용 Visual Studio 패치들 [2]
757정성태8/12/200923279오류 유형: 84. TFS 작업 항목 보기 오류 - WorkItemTypeDeniedOrNotExistException
756정성태8/9/200922847오류 유형: 83. A revocation check could not be performed for the certificate.
755정성태8/6/200920542.NET Framework: 154. 이벤트 2중 구독
754정성태7/16/200932918VS.NET IDE: 64. Visual Studio 2010 - 64bit 혼합 모드 디버깅 지원
753정성태7/15/200931426.NET Framework: 153. WPF와 WinForm의 Shown 이벤트 시점
752정성태7/14/200927062개발 환경 구성: 46. .NET Service Bus 응용 사례: SocketShifter [2]파일 다운로드1
751정성태7/9/200928345.NET Framework: 152. 순환 참조와 XmlSerializer파일 다운로드1
750정성태7/7/200928075.NET Framework: 151. Team Explorer가 설치되지 않은 PC에서 System.InvalidProgramException 예외 발생파일 다운로드1
748정성태7/2/200925921.NET Framework: 150. WPF - Property Element 사용 의미파일 다운로드2
747정성태7/1/200945660.NET Framework: 149. WPF - UI 업데이트를 바로 반영하고 싶다면? [3]파일 다운로드1
746정성태6/25/200932778.NET Framework: 148. WPF - 데이터 바인딩 시의 예외 처리 방법 [1]파일 다운로드1
745정성태6/22/200924829.NET Framework: 147. WPF - Binding에 Sibling 요소 지정 [2]파일 다운로드1
744정성태6/21/200923623.NET Framework: 146. WPF - 중첩된 ScrollViewer의 크기 제어 [2]파일 다운로드1
743정성태6/17/200927692.NET Framework: 145. Unity Container 개체 풀이
742정성태6/17/200927120.NET Framework: 144. WPF - FrameworkElement.Parent 속성이 null이라면? [3]
740정성태6/12/200924740.NET Framework: 143. WPF - Transform의 역변환파일 다운로드1
739정성태6/8/200937466.NET Framework: 142. WPF - Grid 컨트롤의 ShowGridLine 개선 [5]파일 다운로드1
737정성태6/6/200942940.NET Framework: 141. Win32 Interop - 크기가 정해지지 않은 배열을 C++에서 C#으로 전달하는 경우파일 다운로드2
734정성태6/4/200926380.NET Framework: 140. WPF - CellPadding 속성을 구현하는 Grid Layout [2]파일 다운로드1
... 166  167  168  169  [170]  171  172  173  174  175  176  177  178  179  180  ...