顯示的錯誤:org.apache.commons.math3.exception.NoBracketingException: function values at endpoints do not have different signs, endpoints: [0, 1], values: [-0.694, 0.306]
原因:beta分佈的參數爲負數,導致採樣時出現上述錯誤。
算法中需要對beta分佈進行採樣,採樣時會用到Inverse transform sampling。
解決時間:3h
定位問題:
1. 通過log確定出錯的代碼:beta分佈採樣
2. 搜索這個error,並沒有發現與beta分佈採樣有關的資料,現有的資料都是說在解方程時沒有解造成的錯誤。
3. 由於代碼沒動過,懷疑和beta參數有關,於是打印beta分佈的參數。期間犯了新手的錯誤,沒有collect(),導致在executer上打印了參數
4. 期間查看org.apache.commons.math3.distribution.BetaDistribution,發現sample方法會用到inversion method,這方法會解方程
5. collect()之後發現參數有負值(參數alpha),這個值表示的是獎勵,在不繼地累加,而類型是int,最終超過了上限變成了負值。
定位策略優化:
1. 定位到是beta分佈採樣時出錯,首先要做的是檢查beta分佈的參數是否異常,應該要先打印參數檢查下。
2. 搜索 BetaDistribution sample org.apache.commons.math3.exception.NoBracketingException沒結果時,要學會分別搜索BetaDistribution sample及org.apache.commons.math3.exception.NoBracketingException