如何在python中计算多变量非线性回归?

Posted

技术标签:

【中文标题】如何在python中计算多变量非线性回归?【英文标题】:How to calculate multi-variable nonlinear regression in python? 【发布时间】:2021-11-11 04:09:43 【问题描述】:

我正在尝试创建一个关于非线性回归的程序。我有三个参数 [R,G,B],我想获得图像上任何像素相对于我的参考颜色代码的温度。例如:

参考文件 R,G,B,Temperature = [(157,158,19,300),(146,55,18,320),(136,57,22,340),(133,88,25,460),(141,105,27,500), (210,195,3,580),(203,186,10,580),(214,195,4,600),(193,176,10,580)]

您可以在上面看到,所有 RGB 值都是非线性变化的。现在,我使用“最小误差算法”来获得温度 w.r.t。 RGB颜色代码,但我想获得参考文件中不存在的值(即如果我有(155,200,40)并且参考文件中不存在,我必须获得这三个代码等于哪个温度)。

这是在给定 RGB 值的情况下选择最接近参考温度的代码:

from math import sqrt

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]


referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

def closest_color(rgb):
    r, g, b = rgb
    color_diffs = []
    counter = 0
    for color in referenceColoursRGB:
        cr, cg, cb = color
        color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
        color_diffs.append((color_diff, color))
        minErrorIndex =color_diffs.index(min(color_diffs))
    return minErrorIndex

temperatureLocation = closest_color((149, 60, 25))
print("Temperature : ", referenceTemperatures[temperatureLocation])
# => Temperature :  320

temperatureLocation = closest_color((220, 145, 4))
print("Temperature : ", referenceTemperatures[temperatureLocation])

# => Temperature :  580

我真的很想计算参考列表中没有出现的温度值,但是我在使用所有 RGB 值以及从中计算/预测合理/准确的温度时遇到问题。

我尝试在使用 polyfit 之后获得 1 个参数,但存在一些问题,因为每个变量对这个参数都有相同的影响。因此我无法意识到哪个颜色代码最高(即 "oneParameter = 1000 *R + 100 *G + 10 *B" ,在这种情况下,如果我有一个颜色代码为 (2,20,50) 的参数和另一个颜色代码是 (2,5,200)。因此它们在“oneParameter”方程中是相等的)

我希望我能清楚地解释我的问题。我正在等待您的帮助!

谢谢。

【问题讨论】:

这对您有帮助吗? ***.com/questions/13552907/…。例如:def func(parameter): r,g,b = parameterparam = (2,20,50)func(param)。您不需要计算“1 个参数”来传递给函数,如果您需要一次传递所有内容,请将它们放入元组或列表中。 不看代码我们很难说你的代码有什么问题。 我使用了这个“***.com/questions/54242194/…”。在这个例子中我用温度改变了颜色名称,当发送 RGB 代码到这个函数时,它在参考文件中返回温度。但是我想用类似插值的方法获取参考文件中没有的参数。 您没有提供我们需要的最少代码或数学运算,以便我们了解您如何做您尝试过的各种事情或您想要什么。从 RGB 值中获取温度的“最小误差算法”是什么? oneParameter 看起来像 3 个 RGB 变量的线性函数,但您说您使用了仅处理 1 个变量的函数的多项式拟合。只是根本没有解释清楚。 我提交了我的代码,你可以在下面看到它。它工作正常,但对我来说还不够。我想获得更敏感的温度 w.r.t. RGB 代码。您在代码中看到,我无法获得“315.25 摄氏度”,因为它不存在于“referenceTemperatures”列表中。但是如果我能从这些数据中写出一个方程,我就能得到“300-600摄氏度”的任何温度。该方程的输入将是 RGB,输出是特定温度 【参考方案1】:
from math import sqrt

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]


referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

def closest_color(rgb):
    r, g, b = rgb
    color_diffs = []
    counter = 0
    for color in referenceColoursRGB:
        cr, cg, cb = color
        color_diff = sqrt(abs(r - cr)**2 + abs(g - cg)**2 + abs(b - cb)**2)
        color_diffs.append((color_diff, color))
        minErrorIndex =color_diffs.index(min(color_diffs))
    return minErrorIndex

temperatureLocation = closest_color((149, 60, 25))
print("Temperature : ", referenceTemperatures[temperatureLocation])
# => Temperature :  320

temperatureLocation = closest_color((220, 145, 4))
print("Temperature : ", referenceTemperatures[temperatureLocation])

# => Temperature :  580

【讨论】:

您的答案可以通过额外的支持信息得到改进。请edit 添加更多详细信息,例如引用或文档,以便其他人可以确认您的答案是正确的。你可以找到更多关于如何写好答案的信息in the help center。 我认为您想将此“答案”添加为您的问题的编辑。即,这是您当前从参考中选择最接近的颜色/温度的方法。如果我理解您的问题,您正在寻找一个采用任意 RGB 颜色并计算温度的函数,是吗? 绝对@rickhg12hs @NeoAerospace 您会编辑原始问题以包含您的代码,还是希望我编辑它?【参考方案2】:

注:我无法保证此预测的物理准确性,但这可能与您正在寻找的内容相符。即,这使得预测与您的参考数据完全匹配,但我不知道温度预测对于非参考 RGB 颜色可能有多准确。如果我知道从 RGB 到温度的映射的确切物理原理,我会使用它。

错误模型 1

进行非线性回归的一种简单方法是对数据进行预处理,以便为回归提供非线性项。 sklearn 有一个内置的预处理函数,通过生成原始输入数据的幂和交互来实现这一点。

referenceColoursRGB =[(157,158,19),
(146,55,18),
(136,57,22),
(133,88,25),
(141,105,27),
(203,186,10),
(214,195,4)]

referenceTemperatures = [
300,
320,
340,
460,
500,
580,
600]

from sklearn import linear_model
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(degree=2)
poly_RGB = poly.fit_transform(referenceColoursRGB)

ols = linear_model.LinearRegression()
ols.fit(poly_RGB, referenceTemperatures)

ols.predict(poly_RGB)
# array([300., 320., 340., 460., 500., 580., 600.])

要进行非参考 RGB 预测,您可以执行以下操作:

ols.predict(poly.transform([(149, 60, 25)]))
# array([369.68980598])

ols.predict(poly.transform([(220, 145, 4)]))
# array([949.34548347])

编辑:坏模型 2

所以,在我选择简单的方法来使用PolynomialFeatures 实现非线性拟合之前,无需考虑 RGB 传感器上可能发生的任何真实物理现象。您可以决定它是否适合您的需求。嗯,这是另一个使用 RGB ratio 的模型,而不考虑正在发生的任何物理现象。同样,您可以决定此模型是否合适。

rat_RGB = [(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in referenceColoursRGB]
rat_ols = linear_model.LinearRegression()
rat_ols.fit(rat_RGB, referenceTemperatures)
rat_ols.predict(rat_RGB)
# array([300., 320., 340., 460., 500., 580., 600.])

您可以看到,该模型也可以完美地拟合参考数据。值得注意的是,其他示例预测使用此模型会产生不同的温度,这很有趣,而且可能很重要。

rat_ols.predict([(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in [(149, 60, 25)]])
# array([481.79424789])

rat_ols.predict([(r, g, b, r/g, r/b, g/r, g/b, b/r, b/g) for r,g,b in [(220, 145, 4)]])
# array([653.06116368])

我希望您能找到/开发基于物理的 RGB/温度模型。我想知道您的 RGB 传感器的制造商是否有一些规格和/或工程说明可能会有所帮助。

【讨论】:

感谢您的回答。您在回答中表示您不确定其准确性。但是准确性成为一个非常重要的因素。如何检查此代码的正确性?我不知道如何从 RGB 切换到温度,我正在寻找一种方法。我希望你的回答会奏效。最后,在你写的代码中,sklearn是不是同时使用RGB代码(3个不同参数)进行曲线拟合? @NeoAerospace 该代码使用所有referenceColoursRGB(以及它们的正方形,因为PolynomialFeatures(degree=2))和所有referenceTemperatures 来拟合线性模型。您可以阅读sklearnlinear_model.LinearRegression() 了解它是如何完成的。您还可以查看ols.coef_ 以查看拟合系数。您可以使用更多参考 RGB/临时对来检查准确性,或者可能只使用一些当前参考对进行拟合,然后使用剩余对检查准确性。要对 RGB/temp 模型有很高的信心,最好有更多的参考资料。 @NeoAerospace 编辑我上面的评论...“代码使用所有referenceColoursRGB(以及它们的正方形_和交互_,因为PolynomialFeatures(degree=2))和所有referenceTemperatures。 .." 即输入(R,G,B) 转换为(1,R,G,B,R*R,R*B,R*G,G*G,G*B,B*B) @NeoAerospace 我添加了另一个可以精确拟合参考数据的模型。由于参数多于参考,可能有无限数量的模型可以完全拟合参考数据。我认为我随意的数据处理可能不利于您项目的成功。请寻求基于物理的模型,以便您的温度预测基于有价值且令人信服的内容。 干得好!你的结果似乎比我更合适:)。我正在搜索 RGB/temp 关系,但它没有标准的进展,尤其是在我的情况下。我已经获得了一些关于“波长”的信息。在这种方法中,我们使用 HSV 代码而不是 RGB 代码。之后,将 H 代码切换到波长(因为每种颜色都有不同的波长)。但是有一个重要的问题:我的颜色 H 码一般是一样的,有时只改变 S 或 V 值。结果我不能用这个方法。

以上是关于如何在python中计算多变量非线性回归?的主要内容,如果未能解决你的问题,请参考以下文章

多元线性回归的计算公式是怎样的?

如何用Python进行线性回归以及误差分析

Python构建简单线性回归模型教程

Python应用实战线性回归(附Python代码)

python机器学习回归算法-线性回归

Python线性回归组合问题