我有像这样的图像:

在这张图片中,红线是我想从图像中得到的.原始图像没有那条红线,只有那条绿色的道路.
我想要的是以等式的系数来估计图像中的曲线:A x ^ 2 + B x + C = 0.在图像中可能存在噪声(如上所示,边缘上有黑洞).
我试图通过使用最小二乘法(LSM)来解决这个问题,但这种方法存在两个问题:
即使在PC上,该方法也太慢,因为点数量很高.
在下列情况下,道路太宽:
左图像上的曲线被正确识别,但右侧不正确.我想,原因是道路太宽太短.

作为两种情况的解决方案,我想缩小道路.在理想情况下,它是上图中的红线.或者我想使用LSM进行线路检测(A x + B = 0)以优化处理时间.
我试过侵蚀图像 - 这是错误的方法.骷髅也不是正确的解决方案.
关于如何实现预期结果的任何想法(缩小道路)?或者针对这个问题的另一种方法的想法?
OpenCV cvSolve可以解决这样的线性最小二乘问题:
// model: y = a1*x1 + a2*x2 + a3
CvMat *y = cvCreateMat(N, 1, CV_64FC1);
CvMat *X = cvCreateMat(N, 3, CV_64FC1);
CvMat *coeff = cvCreateMat(3, 1, CV_64FC1);
// fill vector y and matrix X
for (int i=0; i<N; ++i)
{
cvmSet(y, i, 0, my_y_value(i) );
cvmSet(X, i, 0, my_x1_value(i) );
cvmSet(X, i, 1, my_x2_value(i) );
cvmSet(X, i, 2, 1 );
}
cvSolve(X, y, coeff, CV_SVD);
// now coeff contains a1, a2, a3
Run Code Online (Sandbox Code Playgroud)
但是,我想对我的数据点应用不同的权重.我如何应用权重?
我使用逻辑模型拟合数据点.由于我有时会有ydata错误的数据,我首先使用curve_fit及其sigma参数来包含我在拟合中的各个标准偏差.
现在我切换到了最小化,因为我还需要一些曲率拟合无法提供的拟合优度估计.一切都运作良好,但现在我错过了权衡最小平方的可能性,因为"sigma"与curve_fit有关.
有人一些代码示例关于我如何在最小方格中加权最小二乘?
谢谢,Woodpicker
我一直在使用我的Matlab,但我的愿景是最终切换到用Python完成所有分析,因为它是一种实际的编程语言和其他一些原因.
我一直试图解决的最近问题是对复杂数据进行最小二乘最小化.我是一名工程师,我们经常处理复杂的阻抗,我正在尝试使用曲线拟合将简单的电路模型拟合到测量数据中.
阻抗方程如下:
Z(w)= 1 /(1/R + j*w*C)+ j*w*L.
然后我试图找到R,C和L的值,以便找到最小二乘曲线.
我已经尝试使用优化包,例如optimize.curve_fit或optimize.leastsq,但它们不适用于复数.
然后我尝试使我的残差函数返回复杂数据的大小,但这也不起作用.
我将拟合与 optimize.curve_fit 和 optimize.least_squares 进行比较。使用曲线拟合,我将协方差矩阵 pcov 作为输出,我可以通过以下方式计算拟合变量的标准偏差误差:
perr = np.sqrt(np.diag(pcov))
Run Code Online (Sandbox Code Playgroud)
如果我使用least_squares 进行拟合,则不会得到任何协方差矩阵输出,并且无法计算变量的标准偏差误差。
这是我的例子:
#import modules
import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit
from scipy.optimize import least_squares
noise = 0.5
N = 100
t = np.linspace(0, 4*np.pi, N)
# generate data
def generate_data(t, freq, amplitude, phase, offset, noise=0, n_outliers=0, random_state=0):
#formula for data generation with noise and outliers
y = np.sin(t * freq + phase) * amplitude + offset
rnd = np.random.RandomState(random_state)
error = …Run Code Online (Sandbox Code Playgroud) 亲爱的 stackoverflow 用户,
我正在尝试计算由一组 3D 点定义的任意(但光滑)表面上的法线向量。为此,我使用平面拟合算法,该算法根据计算法向量的点的 10 个最近邻点找到局部最小二乘平面。
然而,它并不总能找到看起来最好的飞机。因此,我想知道我的实现或算法是否存在缺陷。我正在使用奇异值分解,正如我在有关平面拟合主题的几个链接中发现的推荐的那样。这是在我的机器上重现该行为的代码:
#library imports
import numpy as np
import math
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
#values used for best plane fit
xyz = np.array([[-1.04194694, -1.17965867, 1.09517722],
[-0.39947906, -1.37104542, 1.36019265],
[-1.0634807 , -1.35020616, 0.46773962],
[-0.48640524, -1.64476106, 0.2726187 ],
[-0.05720509, -1.6791781 , 0.76964551],
[-1.27522669, -1.10240358, 0.33761405],
[-0.61274031, -1.52709874, -0.09945502],
[-1.402693 , -0.86807757, 0.88866091],
[-0.72520241, -0.86800727, 1.69729388]])
''' best plane fit'''
#1.calculate centroid of points and make points relative to it
centroid = …Run Code Online (Sandbox Code Playgroud) 我想实现以下最小二乘圆拟合这纸(抱歉,我不能发布).通过计算几何误差作为特定点(Xi)与圆上对应点(Xi')之间的欧氏距离(Xi''),本文指出我们可以拟合一个圆.我们有三个参数:Xc(坐标为圆心的矢量)和R(半径).

我提出了以下MATLAB代码(注意我正在尝试拟合圆圈,而不是图像上显示的球体):
function [ circle ] = fit_circle( X )
% Kör paraméterstruktúra inicializálása
% R - kör sugara
% Xc - kör középpontja
circle.R = NaN;
circle.Xc = [ NaN; NaN ];
% Kezdeti illesztés
% A köz középpontja legyen a súlypont
% A sugara legyen az átlagos négyzetes távolság a középponttól
circle.Xc = mean( X );
d = bsxfun(@minus, X, circle.Xc);
circle.R = mean(bsxfun(@hypot, d(:,1), d(:,2)));
circle.Xc = circle.Xc(1:2)+random('norm', 0, 1, size(circle.Xc));
% Optimalizáció
options = …Run Code Online (Sandbox Code Playgroud) 考虑R中的非线性最小二乘模型,例如以下形式:
y ~ theta / ( 1 + exp( -( alpha + beta * x) ) )
Run Code Online (Sandbox Code Playgroud)
(我的真正的问题有几个变量,外部函数不是逻辑但更多涉及;这个更简单,但我想如果我能做到这一点,我的情况应该几乎立即跟随)
我想用(例如)自然三次样条替换术语"alpha + beta*x".
这里有一些代码用于在逻辑内部创建一些非线性函数的示例数据:
set.seed(438572L)
x <- seq(1,10,by=.25)
y <- 8.6/(1+exp( -(-3+x/4.4+sqrt(x*1.1)*(1.-sin(1.+x/2.9))) )) + rnorm(x, s=0.2 )
Run Code Online (Sandbox Code Playgroud)
如果我在lm中不需要逻辑,我可以轻松地用样条项替换线性项; 所以线性模型是这样的:
lm( y ~ x )
Run Code Online (Sandbox Code Playgroud)
然后成为
library("splines")
lm( y ~ ns( x, df = 5 ) )
Run Code Online (Sandbox Code Playgroud)
生成拟合值很简单,并借助于(例如)rms包得到预测值似乎很简单.
实际上,将原始数据与基于lm的样条拟合拟合并不是太糟糕,但我有理由在逻辑函数中需要它(或者更确切地说,在我的问题中等效).
nls的问题是我需要为所有参数提供名称(我很高兴他们称之为(b1,...,b5)为一个样条拟合(并说c1,...,c6为另一个变量) - 我需要能够制作其中的几个).
是否有一种合理的方法来生成nls的相应公式,以便我可以用样条函数替换非线性函数内的线性项?
我能想到的唯一方法就是可以做到这一点有点尴尬和笨重,如果不编写一大堆代码就不能很好地概括.
(编辑以供澄清)对于这个小问题,我当然可以手工完成 - 写出由ns生成的矩阵中每个变量的内积的表达式,乘以参数的向量.但是,我必须为每个其他变量中的每个样条再次逐个编写整个项目,并且每次我更改任何样条曲线中的df时再次,并且如果我想使用cs而不是ns,则再次.然后,当我想尝试做一些预测(/插值)时,我们会得到一系列新的问题需要处理.我需要一遍又一遍地继续这样做,并且可能需要大量的结和几个变量,以便在分析后进行分析 - 我想知道是否有一种比写出每个单独术语更简洁,更简单的方法,无需编写大量代码.我可以看到一个相当牛逼的方式,这将涉及到相当多的代码,但是作为R,我怀疑有更简洁的方式(或更可能是3或4个更简洁的方式)只是躲避我.因此问题.
我以为我曾经看到有人在过去以相当不错的方式做过这样的事情,但对于我的生活,我现在找不到它; 我已经尝试了很多次来找到它.
[更具体地说,我通常希望能够尝试适合每个变量中的几个不同样条曲线 - 尝试几种可能性 - 以便看看我是否能找到一个简单的模型,但仍然适合这个目的是足够的(噪音真的非常低;合适的偏差可以达到很好的平滑效果,但只能达到一定程度).它更像是"找到一个漂亮的,可解释的,但足够的拟合函数",而不是任何接近推理和数据挖掘的东西都不是这个问题的真正问题.
或者,如果这比gnm或ASSIST或其他包装更容易,那将是有用的知识,但是关于如何继续上述玩具问题的一些指示将有所帮助.
我正在对人口普查数据进行回归,其中我的因变量是预期寿命,我有八个自变量.数据汇总为城市,因此我有数千个观测值.
我的模型虽然有些异方差.我想运行加权最小二乘法,其中每个观测值都按城市人口加权.在这种情况下,这意味着我想通过人口平方根的倒数来加权观察.然而,我不清楚什么是最好的语法.目前,我有:
Model=lm(…,weights=(1/population))
Run Code Online (Sandbox Code Playgroud)
那是对的吗?或者应该是:
Model=lm(…,weights=(1/sqrt(population)))
Run Code Online (Sandbox Code Playgroud)
(我在这里发现了这个问题:加权最小二乘 - R但它没有说明R如何解释权重参数.)
我有两个数据列表,一个是x值,另一个是y值.我怎样才能找到最合适的?我试过搞乱,scipy.optimize.leastsq但我似乎无法做到正确.
任何帮助是极大的赞赏
least-squares ×10
python ×4
scipy ×4
numpy ×2
r ×2
algorithm ×1
bsxfun ×1
c ×1
estimation ×1
math ×1
matlab ×1
opencv ×1
plane ×1
python-2.7 ×1
regression ×1
spline ×1