Microsoft MVP성태의 닷넷 이야기
글쓴 사람
홈페이지
첨부 파일

C# - 로지스틱 회귀를 이용한 선형분리 불가능 문제의 분류

지난번의 글에서 다룬 소스 코드가,

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

T * x"의 계산식이 단순한 1차 식을 사용했으므로,

θT * x = θ0 * x0 + θ1 * x1 + θ2 * x2
       = θ0 + θ1 * x1 + θ2 * x2 = 0

선형적인 데이터 분류에만 사용할 수 있었습니다. 하지만, 최소 자승법에 했던 방식과 유사하게,

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

2차 함수로 확장시켜주면,

θT * x = θ0 * x0 + θ1 * x1 + θ2 * x2 + θ3 * x1 * x1
       = θ0 + θ1 * x1 + θ2 * x2 + θ3 * x1 * x1 = 0

간단하게 선형 분리 불가능 문제도 해결할 수 있습니다.




코드 변경은 딱 2군데만 해주면 됩니다. 우선 θ 값을 하나 더 늘려주고,

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

데이터의 벡터도 역시 늘려주면 끝입니다.

// ImageRect.cs
public Vector<double> AsVectorX()
{
    return Vector<double>.Build.Dense(new double[] { 1.0, X1, X2, X1 * X1 });
}

이렇게 하고 에서 나온 data3.csv에 대해 분류를 하면 다음과 같이 출력되는 것을 확인할 수 있습니다.

logistic_regression_non_linear_1.png

(확장 함수의 도움을 받아 작성한 ^^) 핵심 소스 코드를,

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

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

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

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

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

    Console.WriteLine(X);

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

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

    // 반복 횟수
    int epoch = 5000;

    // 갱신 횟수
    for (int i = 0; i < epoch * 1; i ++)
    {
        theta = theta - ETA * (f(X, theta) - train_y) * X;
        // Console.WriteLine(theta);
    }

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

    OutputChart(imgList, theta);
}

파이썬과 비교해보는 것도 좋겠지요. ^^

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

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





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





[최초 등록일: ]
[최종 수정일: 6/27/2019 ]

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

비밀번호

댓글 쓴 사람
 




1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
12144정성태2/23/2020330.NET Framework: 891. 실행 시에 메서드 가로채기 - CLR Injection: Runtime Method Replacer 개선 - 두 번째 이야기파일 다운로드1
12143정성태2/13/2020229.NET Framework: 890. 상황별 GetFunctionPointer 반환값 정리 - x64파일 다운로드1
12142정성태2/27/2020297.NET Framework: 889. C# 코드로 접근하는 MethodDesc, MethodTable파일 다운로드1
12141정성태2/10/2020404.NET Framework: 888. C# - ASP.NET Core 웹 응용 프로그램의 출력 가로채기 [1]파일 다운로드1
12140정성태2/10/2020275.NET Framework: 887. C# - ASP.NET 웹 응용 프로그램의 출력 가로채기파일 다운로드1
12139정성태2/9/2020446.NET Framework: 886. C# - Console 응용 프로그램에서 UI 스레드 구현 방법
12138정성태2/9/2020474.NET Framework: 885. C# - 닷넷 응용 프로그램에서 Sqlite 사용 [3]파일 다운로드1
12137정성태2/9/2020255오류 유형: 592. [AhnLab] 경고 - 디버거 실행을 탐지했습니다.
12136정성태2/6/2020212Windows: 166. Windows + S(또는 Q)로 뜨는 작업 표시줄의 검색 바가 동작하지 않는 경우
12135정성태2/6/2020257개발 환경 구성: 468. Nuget 패키지의 로컬 보관 폴더를 옮기는 방법
12134정성태2/5/2020577.NET Framework: 884. eBEST XingAPI의 C# 래퍼 버전 - XingAPINet Nuget 패키지파일 다운로드1
12133정성태2/7/2020357디버깅 기술: 161. Windbg 환경에서 확인해 본 .NET 메서드 JIT 컴파일 전과 후 - 두 번째 이야기
12132정성태2/20/2020544.NET Framework: 883. C#으로 구현하는 Win32 API 후킹(예: Sleep 호출 가로채기)파일 다운로드1
12131정성태1/27/2020515개발 환경 구성: 467. LocaleEmulator를 이용해 유니코드를 지원하지 않는(한글이 깨지는) 프로그램을 실행하는 방법
12130정성태1/26/2020305VS.NET IDE: 142. Visual Studio에서 windbg의 "Open Executable..."처럼 EXE를 직접 열어 디버깅을 시작하는 방법
12129정성태1/26/2020876.NET Framework: 882. C# - 키움 Open API+ 사용 시 Registry 등록 없이 KHOpenAPI.ocx 사용하는 방법
12128정성태1/26/2020341오류 유형: 591. The code execution cannot proceed because mfc100.dll was not found. Reinstalling the program may fix this problem.
12127정성태1/28/2020388.NET Framework: 881. C# DLL에서 제공하는 Win32 export 함수의 내부 동작 방식(VT Fix up Table)파일 다운로드1
12126정성태1/25/2020352.NET Framework: 880. C# - PE 파일로부터 IMAGE_COR20_HEADER 및 VTableFixups 테이블 분석파일 다운로드1
12125정성태1/24/2020268VS.NET IDE: 141. IDE0019 - Use pattern matching
12124정성태1/24/2020639VS.NET IDE: 140. IDE1006 - Naming rule violation: These words must begin with upper case characters: ...
12123정성태1/23/2020385웹: 39. Google Analytics - gtag 함수를 이용해 페이지 URL 수정 및 별도의 이벤트 생성 방법
12122정성태1/22/2020427.NET Framework: 879. C/C++의 UNREFERENCED_PARAMETER 매크로를 C#에서 우회하는 방법(IDE0060 - Remove unused parameter '...')파일 다운로드1
12121정성태1/24/2020272VS.NET IDE: 139. Visual Studio - Error List: "Could not find schema information for the ..."파일 다운로드1
12120정성태1/20/2020412.NET Framework: 878. C# DLL에서 Win32 C/C++처럼 dllexport 함수를 제공하는 방법 - 네 번째 이야기(IL 코드로 직접 구현)파일 다운로드1
12119정성태1/17/2020484디버깅 기술: 160. Windbg 확장 DLL 만들기 (3) - C#으로 만드는 방법
1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...