用法:
skimage.measure.ransac(data, model_class, min_samples, residual_threshold, is_data_valid=None, is_model_valid=None, max_trials=100, stop_sample_num=inf, stop_residuals_sum=0, stop_probability=1, random_state=None, initial_inliers=None)
使用 RANSAC(隨機樣本一致性)算法將模型擬合到數據中。
RANSAC 是一種迭代算法,用於對來自完整數據集的內點子集的參數進行穩健估計。每次迭代執行以下任務:
從原始數據中選擇min_samples隨機樣本,檢查這組數據是否有效(見is_data_valid)。
將模型估計到隨機子集 (model_cls.estimate(*data[random_subset]) 並檢查估計的模型是否有效(參見is_model_valid)。
通過計算估計模型的殘差 (model_cls.residuals(*data)) 將所有數據分類為內點或異常點 - 所有殘差小於 residual_threshold 的數據樣本都被視為內點。
如果內部樣本數最大,則將估計模型保存為最佳模型。如果當前估計的模型具有相同數量的內點,則僅當殘差之和較少時才將其視為最佳模型。
這些步驟將執行最大次數或直到滿足特殊停止標準之一。使用先前確定的最佳模型的所有內部樣本來估計最終模型。
- data:[list, tuple of] (N, ...) 數組
模型適合的數據集,其中 N 是數據點的數量,其餘維度取決於模型要求。如果模型類需要多個輸入數據數組(例如
skimage.transform.AffineTransform
的源坐標和目標坐標),則可以選擇將它們作為元組或列表傳遞。請注意,在這種情況下,函數estimate(*data)
、residuals(*data)
、is_model_valid(model, *random_data)
和is_data_valid(*random_data)
都必須將每個數據數組作為單獨的參數。- model_class:對象
具有以下對象方法的對象:
success = estimate(*data)
residuals(*data)
其中success表示模型估計是否成功(True或None表示成功,False表示失敗)。
- min_samples:int 在 (0, N) 範圍內
適合模型的最小數據點數。
- residual_threshold:浮點數大於 0
數據點被分類為內點的最大距離。
- is_data_valid:函數,可選
在模型擬合之前使用隨機選擇的數據調用此函數:is_data_valid(*random_data)。
- is_model_valid:函數,可選
使用估計的模型和隨機選擇的數據調用此函數:is_model_valid(model, *random_data), 。
- max_trials:int 可選
隨機樣本選擇的最大迭代次數。
- stop_sample_num:int 可選
如果至少找到此數量的內點,則停止迭代。
- stop_residuals_sum:浮點數,可選
如果殘差之和小於或等於此閾值,則停止迭代。
- stop_probability:在 [0, 1] 範圍內浮點數,可選
如果使用
probability >= stop_probability
對至少一組 outlier-free 訓練數據進行采樣,則 RANSAC 迭代停止,具體取決於當前最佳模型的內點比率和試驗次數。這需要生成至少 N 個樣本(試驗):N >= log(1 - 概率) /log(1 - e**m)
其中概率(置信度)通常設置為較高的值,例如 0.99,e 是當前的 inliers w.r.t 分數。樣本總數,m為min_samples值。
- random_state:{無,int
numpy.random.Generator
如果random_state是沒有的
numpy.random.Generator
使用單例。如果random_state是一個int 一個新的Generator
使用實例,播種random_state.如果random_state已經是一個Generator
實例然後使用該實例。- initial_inliers:array-like of bool, shape (N,), optional
模型估計的初始樣本選擇
- model:對象
具有最大共識集的最佳模型。
- inliers:(N, ) 數組
分類為
True
的內點的布爾掩碼。
參數:
返回:
參考:
- 1
“RANSAC”, Wikipedia, https://en.wikipedia.org/wiki/RANSAC
例子:
生成沒有傾斜的橢圓數據並添加噪聲:
>>> t = np.linspace(0, 2 * np.pi, 50) >>> xc, yc = 20, 30 >>> a, b = 5, 10 >>> x = xc + a * np.cos(t) >>> y = yc + b * np.sin(t) >>> data = np.column_stack([x, y]) >>> rng = np.random.default_rng(203560) # do not copy this value >>> data += rng.normal(size=data.shape)
添加一些錯誤數據:
>>> data[0] = (100, 100) >>> data[1] = (110, 120) >>> data[2] = (120, 130) >>> data[3] = (140, 130)
使用所有可用數據估計橢圓模型:
>>> model = EllipseModel() >>> model.estimate(data) True >>> np.round(model.params) array([ 72., 75., 77., 14., 1.])
使用 RANSAC 估計橢圓模型:
>>> ransac_model, inliers = ransac(data, EllipseModel, 20, 3, max_trials=50) >>> abs(np.round(ransac_model.params)) array([20., 30., 10., 6., 2.]) >>> inliers array([False, False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True], dtype=bool) >>> sum(inliers) > 40 True
RANSAC 可用於穩健地估計幾何變換。在本節中,我們還將展示如何使用總樣本的比例,而不是絕對數量。
>>> from skimage.transform import SimilarityTransform >>> rng = np.random.default_rng() >>> src = 100 * rng.random((50, 2)) >>> model0 = SimilarityTransform(scale=0.5, rotation=1, ... translation=(10, 20)) >>> dst = model0(src) >>> dst[0] = (10000, 10000) >>> dst[1] = (-100, 100) >>> dst[2] = (50, 50) >>> ratio = 0.5 # use half of the samples >>> min_samples = int(ratio * len(src)) >>> model, inliers = ransac((src, dst), SimilarityTransform, min_samples, ... 10, ... initial_inliers=np.ones(len(src), dtype=bool)) >>> inliers array([False, False, False, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True, True])
相關用法
- Python skimage.measure.regionprops用法及代碼示例
- Python skimage.measure.regionprops_table用法及代碼示例
- Python skimage.measure.profile_line用法及代碼示例
- Python skimage.measure.perimeter_crofton用法及代碼示例
- Python skimage.measure.moments_hu用法及代碼示例
- Python skimage.measure.moments_coords_central用法及代碼示例
- Python skimage.measure.LineModelND用法及代碼示例
- Python skimage.measure.block_reduce用法及代碼示例
- Python skimage.measure.moments用法及代碼示例
- Python skimage.measure.shannon_entropy用法及代碼示例
- Python skimage.measure.moments_normalized用法及代碼示例
- Python skimage.measure.euler_number用法及代碼示例
- Python skimage.measure.perimeter用法及代碼示例
- Python skimage.measure.moments_central用法及代碼示例
- Python skimage.measure.EllipseModel用法及代碼示例
- Python skimage.measure.find_contours用法及代碼示例
- Python skimage.measure.CircleModel用法及代碼示例
- Python skimage.measure.label用法及代碼示例
- Python skimage.measure.moments_coords用法及代碼示例
- Python skimage.metrics.hausdorff_distance用法及代碼示例
注:本文由純淨天空篩選整理自scikit-image.org大神的英文原創作品 skimage.measure.ransac。非經特殊聲明,原始代碼版權歸原作者所有,本譯文未經允許或授權,請勿轉載或複製。