Python中如何实现多变量非线性回归以通过RGB值预测温度
RGB色值温度预测实现方案
方案1:k近邻回归(KNN Regression,推荐小数据集使用)
你当前用的是最近邻(k=1)的匹配逻辑,直接改成k近邻回归即可实现未知RGB的温度预测:
- 无需将三维RGB压缩为单特征,天然避免特征冲突问题
- 可通过调整k值控制平滑度,小数据集建议k取2~3
- 支持对近邻点按距离加权,距离越近权重越高,预测精度更高
代码实现示例
from math import sqrt import numpy as np # 完整参考数据集 reference = np.array([ [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_train = reference[:, :3] temp_train = reference[:, 3] def knn_predict(rgb, k=3, use_weight=True): r, g, b = rgb # 计算所有参考点的RGB欧氏距离 diffs = np.sqrt(np.sum((rgb_train - [r,g,b])**2, axis=1)) # 取距离最近的k个点 topk_idx = np.argsort(diffs)[:k] topk_dists = diffs[topk_idx] topk_temps = temp_train[topk_idx] # 加权平均:权重为距离的倒数,距离越近权重越高 if use_weight: # 避免除0,加极小值 weights = 1 / (topk_dists + 1e-6) pred_temp = np.sum(weights * topk_temps) / np.sum(weights) else: pred_temp = np.mean(topk_temps) return round(pred_temp, 2) # 测试未知RGB print(knn_predict((155,200,40))) # 输出示例:492.37 print(knn_predict((149, 60, 25))) # 输出示例:321.18
方案2:多变量多项式回归(需要显式计算公式时使用)
无需压缩为单特征,直接对R、G、B三个特征做高阶多项式拟合:
- 选择2~3阶多项式即可适配你的非线性关联场景
- 拟合后可得到直接计算温度的显式公式,不需要每次调用参考数据集
核心实现逻辑
from sklearn.preprocessing import PolynomialFeatures from sklearn.linear_model import LinearRegression # 生成2阶多项式特征 poly = PolynomialFeatures(degree=2, include_bias=False) rgb_poly = poly.fit_transform(rgb_train) # 拟合模型 model = LinearRegression() model.fit(rgb_poly, temp_train) def poly_predict(rgb): rgb_poly_input = poly.transform([rgb]) pred_temp = model.predict(rgb_poly_input)[0] return round(pred_temp, 2) # 测试 print(poly_predict((155,200,40)))
精度优化建议
如果需要更高的预测精度,可以先将RGB颜色空间转换为LAB颜色空间,LAB空间的欧氏距离更贴合实际颜色差异,能进一步降低预测误差。
内容的提问来源于stack exchange,提问作者Neo Aerospace
相关产品推荐
相关产品推荐

