2017-11-17 5 views
0

여기서부터 어디로 가야할 지 모르는 최적화 문제가 있습니다. 가장 예측 된 r 제곱 값을 리턴하는 입력의 최상의 조합을 찾으려는 프로그램이 있습니다. 문제는 내가 총 21 개의 입력 (List)을 가지고 있으며 15 개의 입력 집합에 그것들이 필요하다는 것입니다. 총 조합 수식은 다음과 같습니다.C#의 최적화 알고리즘

n!/r! (n-r)! = 21!/15! (21-15)! = 54,264 가능한 조합

분명히 각 조합을 통해 실행하고 예측 된 rsquared를 계산하는 것은 이상적인 솔루션이 아니므로 더 나은 방법/알고리즘/방법을 사용하여 건너 뛰거나 나쁜 조합을 좁히려 고 시도 할 수 있습니다. 가장 적은 양의 조합 만 처리하고 있습니까? 다음은이 문제에 대한 내 현재 사이비 코드 :

public BestCombo GetBestCombo(List<List<MultipleRegressionInfo>> combosList) 
{ 
    BestCombo bestCombo = new BestCombo(); 

    foreach (var combo in combosList) 
    { 
     var predRsquared = CalculatePredictedRSquared(combo); 

     if (predRsquared > bestCombo.predRSquared) 
     { 
     bestCombo.predRSquared = predRsquared; 
     bestCombo.BestRSquaredCombo = combo; 
     } 
    } 

    return bestCombo; 
} 

public class BestCombo 
    { 
     public double predRSquared { get; set; } 
     public IEnumerable<MultipleRegressionInfo> BestRSquaredCombo { get; set; } 
    } 

public class MultipleRegressionInfo 
{ 
    public List<double> input { get; set; } 
    public List<double> output { get; set; } 
} 

public double CalculatePredictedRSquared(List<MultipleRegressionInfo> combo) 
{ 
    Matrix<double> matrix = BuildMatrix(combo.Select(i => i.input).ToArray()); 
    Vector<double> vector = BuildVector(combo.ElementAt(0).output); 
    var coefficients = CalculateWithQR(matrix, vector); 
    var y = CalculateYIntercept(coefficients, input, output); 
    var estimateList = CalculateEstimates(coefficients, y, input, output); 
    return GetPredRsquared(estimateList, output); 
} 
+0

r^2 값을 최대화하려는 경우, 먼저 할 수있는 한 가지 방법은 전체 r 제곱을 먼저 계산하는 것입니다. 다음으로 예측값과 실제 값의 차이를 계산합니다. 이제 15 개의 가장 작은 잔차만을 사용하십시오. r^2를 한번 더 다시 계산하면 실제 r^2를 얻을 수 있습니다. 최고의 r^2 무력을 계산하려고하면 영원히 걸릴 것입니다. 정상적인 배열을 사용한다면 이론적 인 알고리즘이 O (n^3)의 복잡성을 가질 것이라고 생각합니다. 나무 나 다른 데이터 구조를 사용하면 복잡성을 줄일 수 있습니다. –

+0

@ BennettYeo 내가 현재하고있는 일은 현재의 콤보에서 모든 입력에 대해 전체적으로 rsquared를 얻고 결국에는 가장 좋은 rsquared를 가진 콤보를 출력하기 때문에 더 많은 의사 코드를 표시하도록 내 질문을 편집했습니다. 다행히도 이것이 내가 당신이 제안하는 것을 오해하지 않는 한 좀 더 나은 것을 설명하는 데 도움이됩니다. 당신이 제안하는 것에 대한 의사 코드를 보여줄 수 있습니까? – user3610374

+0

@Rufus oops 방금 고정했습니다. – user3610374

답변

1

54264 컴퓨터에 대한 엄청난되지는 - 그것은 R^2을 계산하는 전화를 몇 통 타이밍이 걸릴 것입니다 얼마나 오래 볼까지 곱 가치가있을 수도 있습니다.

R^2 (A, B, C)> = R^2 (A, B)라는 사실에 의존하는 이러한 종류의 문제에 대한 분기 및 바운드 알고리즘이 있습니다. 변수를 삭제할 때만 감소합니다. 반복적으로 크기의 모든 변수 세트의 공간을 검색합니다. 변수 세트에 대해 R^2를 계산 한 후 세트에서 단일 변수를 삭제하여 생성 된 세트로 재귀 호출을 작성하십시오. 기존 간격의 오른쪽 (A.CDE는 A..DE, ACE 및 A.CD를 생성하지만 .CDE는 .BCDE가 생성하지 않습니다). 원하는 크기의 집합으로 내려 갔을 때 또는 지금까지 가장 좋은 답보다 우수하지 않은 R^2를 찾은 경우 재귀를 종료 할 수 있습니다.

지금까지 R^2 값이 가장 좋은 대답보다 좋지 않은 경우가 발생하면 시간이 절약되지만 이는 보장 할 수 없습니다. R^2가 가장 높은 집합을 조사하기 위해 chrying을 시도 할 수 있습니다. 가장 좋은 최상의 답을 찾고 나면 형제를 배제하기에 충분할 것으로 기대하고, 프로 시저를 사용하여 계산합니다 ABCDE에 대해 이미 수행 한 계산을 사용하는 A.CDE에 대한 R^2.

+0

더 나은 지정하지 않은 것에 대해 사과드립니다.하지만 제 질문을 수정했지만 정기적 인 rsquared가 입력을 추가 할 때 계속 올라갈 것이기 때문에 예측 된 rsquared를 계산합니다. 그러나 rsquared가 데이터가 미래의 예측에 좋은지 확인하는 데 훨씬 더 좋습니다. – user3610374

+0

FWIW 표준 R^2는 항상 조정 된 R^2보다 높기 때문에 A, B, C에 대한 표준 R^2 값은 여전히 ​​A, B에 대한 조정 값의 상한값입니다. 표준 A, B, C > = 표준 A, B> = 조정 된 A, B. 물론이 바인딩은 너무 실용적인 것으로 느슨 할 수 있습니다. – mcdowella

+0

답변에 몇 가지 문제가 있습니다. 예측 된 rsquared 및 rsquared가 조정되지 않았습니다. 예측 된 rsquared는 한 번에 하나의 데이터 포인트를 추출하고 누락 된 데이터 포인트에 대한 추정치를 얻기 위해 최적의 라인에 대해 나머지 데이터 포인트를 다시 계산 한 다음 모든 데이터 포인트에 대한 모든 나머지를 합산합니다. 예를 들어 입력 데이터에 대해 4000 데이터 포인트가있는 경우 4000 * 54,264 = 217,056,000이므로이 과정을 최적화해야합니다. 내가 추천하는 것을 얻지 만 예측 된 rsquared와는 작동하지 않을 것입니다. – user3610374