给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归

Posted

技术标签:

【中文标题】给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归【英文标题】:Scikit-learn regression on two variables given a 2D matrix of reference values 【发布时间】:2021-11-21 18:27:48 【问题描述】:

我有一个参考值矩阵,想了解如何使用 Scikit-learn 为其生成回归模型。我过去做过几种类型的单变量回归,但我不清楚如何在 sklearn 中使用两个变量。

我有两个特征(A 和 B)和一个用于某些输入 A/B 值的输出值表。请参见下面的表格和 3D 表面。我想看看如何将其转换为将 A/B 输入与单值输出相关联的两个变量方程,如表中所示。这种关系看起来是非线性的,它也可能是二次的、对数的等等......

如何使用 sklearn 对此表格数据执行非线性回归?

A/B 1000    1100    1200    1300    1400    1500    1600    1700    1800    1900    2000
0   8.78    8.21    7.64    7.07    6.50    5.92    5.35    4.78    4.21    3.63    3.06
5   8.06    7.56    7.07    6.58    6.08    5.59    5.10    4.60    4.11    3.62    3.12
10  7.33    6.91    6.50    6.09    5.67    5.26    4.84    4.43    4.01    3.60    3.19
15  6.60    6.27    5.93    5.59    5.26    4.92    4.59    4.25    3.92    3.58    3.25
20  5.87    5.62    5.36    5.10    4.85    4.59    4.33    4.08    3.82    3.57    3.31
25  5.14    4.97    4.79    4.61    4.44    4.26    4.08    3.90    3.73    3.55    3.37
30  4.42    4.32    4.22    4.12    4.02    3.93    3.83    3.73    3.63    3.53    3.43
35  3.80    3.78    3.75    3.72    3.70    3.67    3.64    3.62    3.59    3.56    3.54
40  2.86    2.93    2.99    3.05    3.12    3.18    3.24    3.31    3.37    3.43    3.50
45  2.08    2.24    2.39    2.54    2.70    2.85    3.00    3.16    3.31    3.46    3.62
50  1.64    1.84    2.05    2.26    2.46    2.67    2.88    3.08    3.29    3.50    3.70
55  1.55    1.77    1.98    2.19    2.41    2.62    2.83    3.05    3.26    3.47    3.69
60  2.09    2.22    2.35    2.48    2.61    2.74    2.87    3.00    3.13    3.26    3.39
65  3.12    3.08    3.05    3.02    2.98    2.95    2.92    2.88    2.85    2.82    2.78
70  3.50    3.39    3.28    3.17    3.06    2.95    2.84    2.73    2.62    2.51    2.40
75  3.42    3.32    3.21    3.10    3.00    2.89    2.78    2.68    2.57    2.46    2.36
80  3.68    3.55    3.43    3.31    3.18    3.06    2.94    2.81    2.69    2.57    2.44
85  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
90  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
95  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
100 3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69

【问题讨论】:

你的问题对我来说毫无意义。您有两个自变量 A 和 B,以及一个我称之为 Z 的因变量。如果是 3D 图,您将有 Z = f(A, B)。我可以看到您如何将其视为一系列一维图,其中您保持 A 或 B 不变并适合另一个。这是你要求的吗? 是的,它在 3d 图上绘制为平面,该图可以用一个方程来描述吗?我已将图像添加到顶帖。谢谢。 有什么尝试解决这个问题的? “不知道如何解决这个问题”是什么意思?您是否尝试过学习如何做到这一点? 显示您的代码,即使是部分问题/解决方案/错误/等,将大大吸引其他人考虑您的问题。 您可以使用包含交互项的高阶多项式进行线性回归。那应该很简单。你为什么不试试看呢? f(x, y) = sum(cij(x^i)(y^j) for i,j = 0 to 5 应该很容易做到。 【参考方案1】:

您的 AB 和表值之间可能存在简洁的非线性关系,但在没有对该系统的一些了解或任何复杂的非线性建模的情况下,这里有一个 荒谬 模型一个体面的score

the_table = """1000    1100    1200    1300    1400    1500    1600    1700    1800    1900    2000
0   8.78    8.21    7.64    7.07    6.50    5.92    5.35    4.78    4.21    3.63    3.06
5   8.06    7.56    7.07    6.58    6.08    5.59    5.10    4.60    4.11    3.62    3.12
10  7.33    6.91    6.50    6.09    5.67    5.26    4.84    4.43    4.01    3.60    3.19
15  6.60    6.27    5.93    5.59    5.26    4.92    4.59    4.25    3.92    3.58    3.25
20  5.87    5.62    5.36    5.10    4.85    4.59    4.33    4.08    3.82    3.57    3.31
25  5.14    4.97    4.79    4.61    4.44    4.26    4.08    3.90    3.73    3.55    3.37
30  4.42    4.32    4.22    4.12    4.02    3.93    3.83    3.73    3.63    3.53    3.43
35  3.80    3.78    3.75    3.72    3.70    3.67    3.64    3.62    3.59    3.56    3.54
40  2.86    2.93    2.99    3.05    3.12    3.18    3.24    3.31    3.37    3.43    3.50
45  2.08    2.24    2.39    2.54    2.70    2.85    3.00    3.16    3.31    3.46    3.62
50  1.64    1.84    2.05    2.26    2.46    2.67    2.88    3.08    3.29    3.50    3.70
55  1.55    1.77    1.98    2.19    2.41    2.62    2.83    3.05    3.26    3.47    3.69
60  2.09    2.22    2.35    2.48    2.61    2.74    2.87    3.00    3.13    3.26    3.39
65  3.12    3.08    3.05    3.02    2.98    2.95    2.92    2.88    2.85    2.82    2.78
70  3.50    3.39    3.28    3.17    3.06    2.95    2.84    2.73    2.62    2.51    2.40
75  3.42    3.32    3.21    3.10    3.00    2.89    2.78    2.68    2.57    2.46    2.36
80  3.68    3.55    3.43    3.31    3.18    3.06    2.94    2.81    2.69    2.57    2.44
85  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
90  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
95  3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69
100 3.43    3.35    3.28    3.21    3.13    3.06    2.99    2.91    2.84    2.77    2.69"""

import numpy as np
import pandas as pd
import io

df = pd.read_csv(io.StringIO(initial_value=the_table), sep="\s+")
df.columns = df.columns.astype(np.uint64)

df_unstacked = df.unstack()

X = df_unstacked.index.tolist()
y = df_unstacked.to_list()

from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(6)
poly_X = poly.fit_transform(X)

from sklearn.linear_model import LinearRegression

model = LinearRegression()
model.fit(poly_X,y)
print(model.score(poly_X,y))
# 0.9762180339233807

要使用此模型给定 ABpredict 值,您需要像创建模型一样转换输入。比如,

model.predict(poly.transform([(1534,56)]))
# array([2.75275659])

荒谬得离谱 ...

more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in X]
poly = PolynomialFeatures(5)
poly_X = poly.fit_transform(more_X)
model.fit(poly_X,y)
print(model.score(poly_X,y))
# 0.9982994398684035

... 和predict:

more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in [(1534,56)]]
model.predict(poly.transform(more_X))
# array([2.74577017])

注:可能有更好的方法来以 Python 方式 对这些荒谬的模型进行编程。

【讨论】:

我如何才能对这个模型进行预测?我试过 model.predict((1534,56)) 它要求我运行 .reshape 但然后告诉我元组没有名为“reshape”的属性 @ortunoa 输入需要像模型一样进行转换。例如,对于第一个模型:model.predict(poly.transform([(1534,56)])) -> array([2.75275659]) @ortunoa ... 对于第二个模型:more_X = [(a,b,np.log1p(a),np.log1p(b),np.cos(np.pi*b/100)) for a,b in [(1534,56)]];model.predict(poly.transform(more_X)) -> array([2.74577017]) @ortunoa 如果您要进行疯狂(或不疯狂)的输入转换,最好使用sklearn Pipelines 组织它们。

以上是关于给定参考值的二维矩阵,对两个变量进行 Scikit-learn 回归的主要内容,如果未能解决你的问题,请参考以下文章

给定一个 n × n 的二维矩阵表示一个图像, 将图像顺时针旋转 90 度js实现

在 Scikit-Learn 中连接多维降维算法

从混淆矩阵中提取 y_true 和 y_pred

Scikit 学习如何打印混淆矩阵的标签?

对两个矩阵 (R) 之间的每个列组合进行高效的复杂运算

MATLAB中如何定义多维矩阵