如何在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 = parameter
param = (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
来拟合线性模型。您可以阅读sklearn
的linear_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中计算多变量非线性回归?的主要内容,如果未能解决你的问题,请参考以下文章