用法:
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。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。