여기서부터 어디로 가야할 지 모르는 최적화 문제가 있습니다. 가장 예측 된 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);
}
r^2 값을 최대화하려는 경우, 먼저 할 수있는 한 가지 방법은 전체 r 제곱을 먼저 계산하는 것입니다. 다음으로 예측값과 실제 값의 차이를 계산합니다. 이제 15 개의 가장 작은 잔차만을 사용하십시오. r^2를 한번 더 다시 계산하면 실제 r^2를 얻을 수 있습니다. 최고의 r^2 무력을 계산하려고하면 영원히 걸릴 것입니다. 정상적인 배열을 사용한다면 이론적 인 알고리즘이 O (n^3)의 복잡성을 가질 것이라고 생각합니다. 나무 나 다른 데이터 구조를 사용하면 복잡성을 줄일 수 있습니다. –
@ BennettYeo 내가 현재하고있는 일은 현재의 콤보에서 모든 입력에 대해 전체적으로 rsquared를 얻고 결국에는 가장 좋은 rsquared를 가진 콤보를 출력하기 때문에 더 많은 의사 코드를 표시하도록 내 질문을 편집했습니다. 다행히도 이것이 내가 당신이 제안하는 것을 오해하지 않는 한 좀 더 나은 것을 설명하는 데 도움이됩니다. 당신이 제안하는 것에 대한 의사 코드를 보여줄 수 있습니까? – user3610374
@Rufus oops 방금 고정했습니다. – user3610374