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

비밀번호

댓글 작성자
 




... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...
NoWriterDateCnt.TitleFile(s)
12609정성태4/22/20219354.NET Framework: 1045. C# - 런타임 시점에 이벤트 핸들러를 만들어 Reflection을 이용해 구독하는 방법파일 다운로드1
12608정성태4/21/202110267.NET Framework: 1044. C# - Generic Host를 이용해 .NET 5로 리눅스 daemon 프로그램 만드는 방법 [9]파일 다운로드1
12607정성태4/21/20218817.NET Framework: 1043. C# - 실행 시점에 동적으로 Delegate 타입을 만드는 방법파일 다운로드1
12606정성태4/21/202112909.NET Framework: 1042. C# - enum 값을 int로 암시적(implicit) 형변환하는 방법? [2]파일 다운로드1
12605정성태4/18/20218846.NET Framework: 1041. C# - AssemblyID, ModuleID를 관리 코드에서 구하는 방법파일 다운로드1
12604정성태4/18/20217509VS.NET IDE: 163. 비주얼 스튜디오 속성 창의 "Build(빌드)" / "Configuration(구성)"에서의 "활성" 의미
12603정성태4/16/20218411VS.NET IDE: 162. 비주얼 스튜디오 - 상속받은 컨트롤이 디자인 창에서 지원되지 않는 문제
12602정성태4/16/20219616VS.NET IDE: 161. x64 DLL 프로젝트의 컨트롤이 Visual Studio의 Designer에서 보이지 않는 문제 [1]
12601정성태4/15/20218729.NET Framework: 1040. C# - REST API 대신 github 클라이언트 라이브러리를 통해 프로그래밍으로 접근
12600정성태4/15/20218890.NET Framework: 1039. C# - Kubeconfig의 token 설정 및 인증서 구성을 자동화하는 프로그램
12599정성태4/14/20219613.NET Framework: 1038. C# - 인증서 및 키 파일로부터 pfx/p12 파일을 생성하는 방법파일 다운로드1
12598정성태4/14/20219713.NET Framework: 1037. openssl의 PEM 개인키 파일을 .NET RSACryptoServiceProvider에서 사용하는 방법 (2)파일 다운로드1
12597정성태4/13/20219767개발 환경 구성: 569. csproj의 내용을 공통 설정할 수 있는 Directory.Build.targets / Directory.Build.props 파일
12596정성태4/12/20219498개발 환경 구성: 568. Windows의 80 포트 점유를 해제하는 방법
12595정성태4/12/20218909.NET Framework: 1036. SQL 서버 - varbinary 타입에 대한 문자열의 CAST, CONVERT 변환을 C# 코드로 구현
12594정성태4/11/20218351.NET Framework: 1035. C# - kubectl 명령어 또는 REST API 대신 Kubernetes 클라이언트 라이브러리를 통해 프로그래밍으로 접근 [1]파일 다운로드1
12593정성태4/10/20219556개발 환경 구성: 567. Docker Desktop for Windows - kubectl proxy 없이 k8s 대시보드 접근 방법
12592정성태4/10/20219399개발 환경 구성: 566. Docker Desktop for Windows - k8s dashboard의 Kubeconfig 로그인 및 Skip 방법
12591정성태4/9/202112674.NET Framework: 1034. C# - byte 배열을 Hex(16진수) 문자열로 고속 변환하는 방법 [2]파일 다운로드1
12590정성태4/9/20219139.NET Framework: 1033. C# - .NET 4.0 이하에서 Console.IsInputRedirected 구현 [1]
12589정성태4/8/202110467.NET Framework: 1032. C# - Environment.OSVersion의 문제점 및 윈도우 운영체제의 버전을 구하는 다양한 방법 [1]
12588정성태4/7/202111026개발 환경 구성: 565. PowerShell - New-SelfSignedCertificate를 사용해 CA 인증서 생성 및 인증서 서명 방법
12587정성태4/6/202111825개발 환경 구성: 564. Windows 10 - ClickOnce 배포처럼 사용할 수 있는 MSIX 설치 파일 [1]
12586정성태4/5/20219518오류 유형: 710. Windows - Restart-Computer / shutdown 명령어 수행 시 Access is denied(E_ACCESSDENIED)
12585정성태4/5/20219267개발 환경 구성: 563. 기본 생성된 kubeconfig 파일의 내용을 새롭게 생성한 인증서로 구성하는 방법
12584정성태4/1/20219970개발 환경 구성: 562. kubeconfig 파일 없이 kubectl 옵션만으로 실행하는 방법
... 31  32  33  34  35  36  37  38  39  40  [41]  42  43  44  45  ...