[英]Optimization Algorithm in C#
我有一個優化問題,我不確定從這里出發。 我有一個程序試圖找到返回最高預測r平方值的輸入的最佳組合。 問題是我總共有21個輸入(列表),並且需要一組15個輸入。 總組合的公式為:
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);
}
54,264對於一台計算機而言並不是很大-值得安排一些調用來計算R ^ 2並相乘以了解這將花費多長時間。
對於此類問題,存在分支定界算法,它依賴於以下事實:R ^ 2(A,B,C)> = R ^ 2(A,B)-僅當您刪除一個變量。 遞歸搜索所有大小至少為15的變量集的空間。在為一組變量計算R ^ 2之后,對通過從集合中刪除單個變量而產生的集合進行遞歸調用,其中任何這樣的丟棄都必須降到保留現有間隙的權利(因此A.CDE會產生A..DE,ACE和A.CD,但不會產生..CDE,這將由.BCDE產生)。 當您降低到所需的集合大小時,或者當您發現R ^ 2並不比目前的最佳答案更好時,您可以終止遞歸。
如果碰巧您經常發現R ^ 2值並不比目前的最佳答案更好,這將節省時間-但這不能保證。 您可以嘗試通過選擇首先調查具有最高R ^ 2的集合來提高效率,希望您找到一個新的最佳答案,足以在遇到它們之前排除它們的同胞,並使用一個過程來計算A.CDE的R ^ 2利用您已經對ABCDE進行的計算。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.