Microsoft MVP성태의 닷넷 이야기
Math: 60. C# - 로지스틱 회귀를 이용한 분류 [링크 복사], [링크+제목 복사],
조회: 19922
글쓴 사람
정성태 (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

비밀번호

댓글 작성자
 




... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...
NoWriterDateCnt.TitleFile(s)
1580정성태1/12/201440331.NET Framework: 407. 닷넷 사용자 정의 예외 클래스의 최소 구현 코드 [1]
1579정성태1/12/201422326오류 유형: 207. System.ArgumentException was unhandled - Message=[net_WebHeaderInvalidControlChars]
1578정성태1/11/201433923개발 환경 구성: 209. Fiddler에서 WebSocket 통신을 모니터링하는 방법 [1]
1577정성태1/11/201424141오류 유형: 206. WriteFile Win32API 사용 시 비정상 종료 현상 [3]
1576정성태1/11/201442024Windows: 81. 긴 이름의 파일/폴더 삭제하는 법 [5]
1575정성태1/11/201422497오류 유형: 205. Exception calling "Provision" with "0" argument(s): "The timer job did not complete running within the allotted time."
1574정성태1/11/201424505오류 유형: 204. An unhandled exception ('System.Security.Cryptography.CryptographicException') occurred in OWSTIMER.EXE
1573정성태1/11/201422334오류 유형: 203. 이벤트 로그 에러 - MsiInstaller에서 Chart Controls 설치 관련 오류 발생
1572정성태1/9/201425794.NET Framework: 406. CoreLab - OraDirect .NET 사용법
1571정성태1/9/201421989.NET Framework: 405. override 메서드가 정의된 타입의 인스턴스로 base 메서드를 호출하는 방법 - 두 번째 이야기
1570정성태1/9/201425388Math: 11. C# 시뮬레이션 - 몬티홀 게임파일 다운로드1
1569정성태1/8/201422545Windows: 80. 윈도우 서버 백업의 복원하는 옵션 설명
1568정성태1/8/201423149오류 유형: 202. Hyper-V 서비스 시작 오류 - Not enough storage is available to complete this operation.
1567정성태1/8/201492499기타: 40. 오피스 2013 라이선스 리셋하는 방법 [5]
1566정성태1/7/201423433Windows: 79. 윈도우 8 - 스카이드라이브(skydrive)의 Online/Offline 동기화 방식 [1]
1565정성태1/3/201421922.NET Framework: 404. 리플렉션을 이용해 닷넷 LicenseManager를 우회할 수 있는 사례
1564정성태1/3/201422500.NET Framework: 403. override 메서드가 정의된 타입의 인스턴스로 base 메서드를 호출하는 방법파일 다운로드1
1563정성태1/3/201428235오류 유형: 201. ASP.NET 웹 사이트를 IIS 7 이상의 환경에서 호스팅할 때 500 오류 발생
1562정성태1/2/201432935.NET Framework: 402. 카카오톡 PC 버전 실행 시 개발자 컴퓨터에서 Themida 오류 나는 문제 - 두 번째 이야기
1561정성태1/1/201442452오류 유형: 200. 카카오톡 PC 버전 실행 시 개발자 컴퓨터에서 Themida 오류 나는 문제 [2]
1560정성태1/1/201421181오류 유형: 199. Hyper-V - Checkpoint 생성 오류
1559정성태12/30/201324474.NET Framework: 401. windbg에서 확인해 보는 관리 힙의 인스턴스 구조 [2]
1558정성태12/29/201333916.NET Framework: 400. 눈으로 확인하는 LayoutKind 옵션 효과 [2]파일 다운로드1
1557정성태12/27/201322994.NET Framework: 399. LayoutKind 옵션에 대해 [2]
1556정성태12/27/201343197개발 환경 구성: 208. IIS + Node.js 환경 구성 [8]
1555정성태12/27/201329951개발 환경 구성: 207. IIS의 80 포트를 공유하는 응용 프로그램 만드는 방법 [1]
... 136  137  138  [139]  140  141  142  143  144  145  146  147  148  149  150  ...