线性模型的代码和R ^ 2的答案每次改变输入,但非线性模型给我相同的R ^ 2答案即使改变我的输入。

8 visualizaciones(上月的30二叠纪)
线性模型的代码和R ^ 2的答案每次改变输入,但非线性模型给我相同的R ^ 2答案即使改变我的输入。我跟着所有的课堂讲稿,但不知道我的错误。谁能发现我的错误。下面是我的代码,我已经通过演讲告诉是正确的但现在是周末,我无法获得他。我不确定如果我需要重新训练模型为非线性模型作为它在线性模型已经完成。
%从Excel文件加载数据
数据= readmatrix (“Concrete_Data.xlsx”);
%计算平均值和标准偏差为每一列的数据
M =意味着(数据);
S =性病(数据);
%为每个变量创建标签
文本= [“水泥(kgm ^ 3)”,“高炉矿渣(kgm ^ 3)”,“粉煤灰(kgm ^ 3)”,“水(kgm ^ 3)”,“强塑剂(kgm ^ 3)”,“粗骨料(kgm ^ 3)”,“细骨料(kgm ^ 3)”,“年龄(天)”];
%绘制散点图,计算每个变量的平方值
r_squared = 0 (1,8);%预先分配数组来存储平方值
图;
i = 1:8
次要情节(2、4、我);
散射(数据(:,我),数据(:,9),“填充”);
标题(sprintf (的平均= % 5.2 f \ n标准差= % 5.2 f ',M (i),(我)));
包含(文本(i));
ylabel (“混凝土抗压强度(MPa)”);
盒子;网格;
持有;
x =数据(:,我);
:y =数据(9);
p = polyfit (x, y, 1);
yfit = polyval (p (x);
yresid = y - yfit;
SSresid =总和(yresid。^ 2);
SStotal =(长度(y) 1) * var (y);
r_squared (i) = 1 - SSresid / SStotal;
rsq = r_squared(我);
流(对% s的平方:% 5.2 f \ n”、文本(i) rsq);
持有;
结束
input_threshold =输入(的输入平方阈值:);
variable_names = [];
t = 0;
i = 1:8
如果r_squared (i) > input_threshold
t = t + 1;
significant_data (:, t) =数据(:,我);
variable_names = [variable_names;文本(我)];
结束
结束
流(“上面变量与平方值:\ n”);
disp (variable_names);
significant_data (:, t + 1) =数据(:,9);
rng (1);
简历= cvpartition(长度(significant_data),“坚持”,0.3);
training_DATA = significant_data (cv.training:);
testing_DATA = significant_data (cv.test:);
模型= fitlm (training_DATA (: 1: end-1), training_DATA(:,结束)
预测=预测(模型、testing_DATA (: 1: end-1));
nlm = @ (b, x) b (1) + (2)。* x (: 1)。(3) ^ 2 + b。* x (: 1);
Non_linear_model = fitnlm (training_DATA (: 1: end-1), training_DATA(:,结束),nlm, (1 1 1))
Non_linear_predictions =预测(Non_linear_model testing_DATA (: 1: end-1));
5 comentarios
山姆
山姆 el 29日上。2023
我的matlab知识很差所以我发布在这个论坛。我用fitnlm的唯一原因是因为这是我们被教导的讲座

Iniciar对话对位comentar。

Respuestas (1)

骑自行车的人
骑自行车的人 el 29日上。2023
这就是为什么你总是为你的“非线性”模型相同的结果。
注意,你的第一个变量(水泥)是最高的R ^ 2。因此,任何足够低的阈值包括任何变量包括水泥,它将是你的第一列。
你的“非线性”模型只看第一列的输入数据,因为这样您指定:
nlm = @ (b, x) b (1) + (2)。* x (: 1)。(3) ^ 2 + b。* x (: 1);
注意到你只使用 x (: 1)
因此,模型估计使用fitnlm将只使用水泥变量,你总是会得到相同的结果。
4 comentarios
骑自行车的人
骑自行车的人 el 30 de Abr。2023
我认为有两个棘手的方面回答# 4。一个是概念上的,一个是技术。
概念问题是非常不清楚非线性模型尝试。看着你漂亮的次要情节,似乎几乎没有依赖任何变量的抗压强度,除了轻微的相关性与水泥。我不能提供任何建议。
技术挑战是如果你不知道有多少解释变量进入模型,很难写模型公式。你写的
nlm = @ (b, x) b (1) + (2)。* x (: 1)。(3) ^ 2 + b。* x (: 1);
这是好如果只有一个变量。但是如果有两个变量,那么你可能想要的
nlm = @ (b, x) b (1) + (2)。* x (: 1)。(3)^ 2 + b。* x (: 1)
+ b (4)。* x (:, 2)。(5)^ 2 + b。* x (:, 2);
你可以和三个变量
nlm = @ (b, x) b (1) + (2)。* x (: 1)。(3)^ 2 + b。* x (: 1)
+ b (4)。* x (:, 2)。(5)^ 2 + b。* x (:, 2)
+ b (6)。* x (:, 3)。(7)^ 2 + b。* x (:, 3)
;
等等。所以,你需要一个if语句列表,选择正确的模型公式,根据选定的变量的数量。也许还有另一种方法,但是我想不出一个。

Iniciar对话对位comentar。

或含


版本

R2022b

社区寻宝

找到宝藏在MATLAB中央,发现社区如何帮助你!

开始狩猎!

翻译的