Microsoft MVP성태의 닷넷 이야기
Math: 60. C# - 로지스틱 회귀를 이용한 분류 [링크 복사], [링크+제목 복사],
조회: 21237
글쓴 사람
정성태 (techsharer at outlook.com)
홈페이지
첨부 파일

(시리즈 글이 6개 있습니다.)
Math: 59. C# - 웨이트 벡터 갱신식을 이용한 퍼셉트론 분류
; https://www.sysnet.pe.kr/2/0/11938

Math: 60. C# - 로지스틱 회귀를 이용한 분류
; https://www.sysnet.pe.kr/2/0/11955

Math: 61. C# - 로지스틱 회귀를 이용한 선형분리 불가능 문제의 분류
; https://www.sysnet.pe.kr/2/0/11962

Math: 62. 활성화 함수에 따른 뉴런의 출력을 그리드 맵으로 시각화
; https://www.sysnet.pe.kr/2/0/11966

Math: 63. C# - 3층 구조의 신경망
; https://www.sysnet.pe.kr/2/0/11969

Math: 64. C# - 3층 구조의 신경망(분류)
; https://www.sysnet.pe.kr/2/0/11981




C# - 로지스틱 회귀를 이용한 분류

이번에도,

기초 수학으로 이해하는 머신러닝 알고리즘
; https://wikibook.co.kr/math-for-ml/

지난번의 퍼셉트론 분류에 이어,

C# - 웨이트 벡터 갱신식을 이용한 퍼셉트론 분류
; https://www.sysnet.pe.kr/2/0/11938

책에서 공개한 파이썬 버전의 로지스틱 회귀를,

wikibook/math-for-ml
; https://github.com/wikibook/math-for-ml/blob/master/classification2_logistic_regression.py

C# 버전으로 포팅해 보겠습니다. ^^




우선 예측 함수로서의 시그모이드는,



C#으로 이렇게 정의할 수 있습니다.

Func<Vector<double>, Vector<double>, double> f = (x, t) =>
                1 / (1 + Math.Exp(-x * theta));

재미있는 것은 가능도 함수(책에서는 우도 함수)가,



제곱 계산 때문에 0으로 빠르게 수렴하는 문제를 완화하기 위해 대수 우도 함수를 정의하는데,



이것을 미분해 얻은 갱신식이 결국,



웨이트 벡터 갱신식최소 자승법의 경우와 유사하다는 점입니다. 정말이지 수학 분야는 너무나 신비롭습니다. ^^

어쨌든 책에서는 위의 미분 함수에서 부호를 밖으로 빼내 다음과 같이 정리해서 사용합니다.



C# 코드로는 이 부분을 다음과 같이 바꿀 수 있습니다.

var fResult = imgList.ForEach((elem) => f(elem.AsVectorX(), theta) - elem.Y).ToVector();
theta = theta - ETA * fResult * X;

암튼, 이렇게 해서 classification2_logistic_regression.py 소스 코드를 C#으로 변환하면 (각종 확장 함수의 도움을 이용해 ^^;) 대충 이렇게 정리할 수 있습니다.

static void Main(string[] args)
{
    MLContext ctx = new MLContext();

    string inputFileName = "images2.csv";
    IDataView data = ctx.Data.LoadFromTextFile<ImageRect>(inputFileName, separatorChar: ',', hasHeader: true);

    // 매개변수 초기화
    Vector<double> theta = Vector<double>.Build.Dense(SystemRandomSource.Default.NextDoubles(3));

    var dataList = ctx.Data.CreateEnumerable<ImageRect>(data, false);
    var statInfo = dataList.GetStatisticsInfo();

    // 표준화
    var imgList = dataList.NormalizeZscore(statInfo);
    Matrix<double> X = imgList.ToMatrix();

    Console.WriteLine(X);

    // 시그모이드 함수
    Func<Vector<double>, Vector<double>, double> f = (x, t) =>
                    1 / (1 + Math.Exp(-x * theta));

    // 학습률
    double ETA = 1e-3;

    // 반복 횟수
    int epoch = 5000;

    // 갱신 횟수
    for (int i = 0; i < epoch; i ++)
    {
        var fResult = imgList.ForEach((elem) => f(elem.AsVectorX(), theta) - elem.Y).ToVector();
        theta = theta - ETA * fResult * X;

        // Console.WriteLine(theta);
    }

    Console.WriteLine($"theta = {theta}");

    OutputChart(imgList, theta);
}

그런대로 좀 비슷하죠?!!! ^^;

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




참고로, 분류 함수의 출력 그래프는 다음과 같고,

logistic_regression_1.png

지난 퍼셉트론 글에서 분류하지 못했던 "x2의 값이 300 이상인 경우 -1, 미만인 경우 1의 데이터"에 대해서도 다음과 같이 잘 분류를 하는 것을 볼 수 있습니다. ^^

logistic_regression_2.png




시간 되시면 다음의 글도 읽어보시고. ^^

Sigmoid function (시그모이드 함수)
; https://m.blog.naver.com/2feelus/220363930362

Mathpresso 머신 러닝 스터디 - 3. 오차를 다루는 방법_1
; https://medium.com/qandastudy/mathpresso-%EB%A8%B8%EC%8B%A0-%EB%9F%AC%EB%8B%9D-%EC%8A%A4%ED%84%B0%EB%94%94-3-%EC%98%A4%EC%B0%A8%EB%A5%BC-%EB%8B%A4%EB%A3%A8%EB%8A%94-%EB%B0%A9%EB%B2%95-7d1fb64ea0cf

R을 이용한 회귀분석 (이부일 | 인사이트마이닝)
; https://www.youtube.com/watch?v=fCF1SXix10Y





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







[최초 등록일: ]
[최종 수정일: 4/16/2024]

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

비밀번호

댓글 작성자
 




... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...
NoWriterDateCnt.TitleFile(s)
10884정성태1/11/201622370개발 환경 구성: 280. 닷넷에서 SAP Adaptive Server Enterprise 데이터베이스 사용파일 다운로드1
10882정성태1/6/201622475Windows: 113. 윈도우의 2179, 26143, 47001 TCP 포트 사용 [1]
10881정성태1/3/201623493오류 유형: 316. 윈도우 10 - 바탕/돋음 체가 사라져 한글이 깨지는 현상 [2]
10880정성태12/16/201521545오류 유형: 315. 닷넷 프로파일러의 오류 코드 정보
10879정성태12/16/201523398오류 유형: 314. Error : DEP0700 : Registration of the app failed. error 0x80070005
10878정성태12/9/201526587디버깅 기술: 75. UWP(유니버설 윈도우 플랫폼) 앱에서 global::System.Diagnostics.Debugger.Break 예외 발생 시 대응 방법
10877정성태12/9/201530896VC++: 93. std::thread 사용 시 R6010 오류 [2]
10876정성태11/26/201526848.NET Framework: 541. SignedXml을 이용한 ds:Signature만드는 방법 [3]파일 다운로드1
10875정성태11/26/201532015개발 환경 구성: 279. signtool.exe의 다중 서명 기능 [2]
10874정성태11/26/201527717개발 환경 구성: 278. 인증서와 인증서를 이용한 코드 사인의 해시 구분
10873정성태11/25/201526284.NET Framework: 540. C# - 부동 소수 계산 왜 이렇게 나오죠? (2) [3]파일 다운로드1
10872정성태11/24/201534461.NET Framework: 539. C# - 부동 소수 계산 왜 이렇게 나오죠? (1) [1]
10871정성태11/23/201528849오류 유형: 313. SignTool Error: No certificates were found that met all the given criteria.
10870정성태11/23/201530053오류 유형: 312. 윈도우 10 TH2 (버전 1511) 업데이트가 안되는 경우 [1]
10869정성태11/23/201526222오류 유형: 311. certutil 실행 오류 - 0x80070057 [1]
10868정성태11/20/201525589제니퍼 .NET: 25. 제니퍼 닷넷 적용 사례 (5) - RestSharp 라이브러리의 CPU High 현상파일 다운로드1
10867정성태10/18/201528783.NET Framework: 538. Thread.Abort로 인해 프로세스가 종료되는 현상
10866정성태10/14/201523996.NET Framework: 537. C# - Reflection의 박싱 없이 값 형식을 다루는 방법파일 다운로드1
10865정성태10/13/201524359.NET Framework: 536. Thread.Abort의 스레드 종료 지연파일 다운로드1
10864정성태10/12/201522047.NET Framework: 535. aspnet.config 파일의 설정을 읽는 방법
10863정성태10/9/201527653.NET Framework: 534. ASP.NET 응용 프로그램이 예외로 프로세스가 종료된다면?
10862정성태10/9/201525779오류 유형: 310. 비주얼 스튜디오 - Unspecified error (Exception from HRESULT: 0x80004005 (E_FAIL))
10861정성태10/9/201530496기타: 54. 도서: 시작하세요! C# 6.0 프로그래밍: 기본 문법부터 실전 예제까지 (2)
10860정성태10/5/201528227개발 환경 구성: 277. IIS AppPool의 시작/중단에 대한 이벤트 로그 확인 방법
10859정성태10/5/201528630.NET Framework: 533. C#에서 string 형식이 primitive일까요? [6]
10858정성태10/2/201525130VS.NET IDE: 105. Visual Studio의 단위 테스트 작성 시 Fakes를 이용한 메서드 재정의 방법 [1]파일 다운로드1
... 121  122  [123]  124  125  126  127  128  129  130  131  132  133  134  135  ...