概率密度函数的最小二乘回归,但我得到不正确的维度错误
Least Squares Regression for Probability Density function but I get incorrect dimensions error
我正在尝试对此概率密度函数执行最小二乘回归,但系统提示我在 matlab 中执行 .*
操作,而不是评估 [=13= 时的标准 *
操作].当我这样做时,我的情节底部出现奇怪的扁平线。
代码:
N = 10000;
mu = 5; sigma = 2;
r = randn(N,1);
x = mu+sigma*r;
bin=mu-6*sigma:0.5:mu+6*sigma;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;
xlabel('bin');
ylabel('f');
y_ = f;
x_ = bin;
H = [ones(length(y_),1),x_'];
Astar = inv(H'*H)*H'.*y_; % Line in Question
% Astar = inv(H'*H)*H'*y_; % Initial form, but Matlab prompts to perform .* instead
Ytilde = H*Astar;
plot(x_,Ytilde, 'r-','LineWidth',1)
结果图:
可能是什么原因?
无论好坏,MATLAB 的一些命令 return 行向量和一些 return 列向量。通常(或者可能几乎总是)统计是用作为列向量的观察向量完成的。据我所知,这只是使用某些命令时必须注意的事情。
您的问题来自于 y_
是一个行向量,而普通统计公式假设它是一个列向量。在 'line in question' 中,如果您使用 *y_'
而不是 .*y_
(即 Astar = inv(H'*H)*H'*y_';
),那么您会得到预期的行为。
MATLAB中的冒号运算符生成一个行向量,hist
做同样的事情。这些才是问题的根源。这些可以通过几种方式解决。
一种方法是在代码的第一部分生成它们时转置它们。另一种方法是在实例化 x_
和 y_
时转置它们(在下面完成)。另一种方法(也可能是最糟糕的方法)是将它们保留为行向量并在每次使用它们时转置它们。总的来说,解决方案将取决于您的其余代码,最好保持一致。
===
N = 10000;
mu = 5; sigma = 2;
r = randn(N,1);
x = mu+sigma*r;
bin=mu-6*sigma:0.5:mu+6*sigma;
f=hist(x,bin);
figure;
scatter(bin,f); hold on;
xlabel('bin');
ylabel('f');
y_ = f';
x_ = bin';
H = [ones(length(y_),1),x_];
Astar = inv(H'*H)*H'*y_; % Line in Question
Ytilde = H*Astar;
plot(x_,Ytilde, 'r-','LineWidth',1)
===
[另请注意,您仍然得到一条水平线,但 y ~= 200。鉴于曲线是对称的,这是预期的,这也与 MATLAB 的内置 polyfit
和 polyval
函数一致.]
[另请注意,不再推荐 hist
。]
我正在尝试对此概率密度函数执行最小二乘回归,但系统提示我在 matlab 中执行 .*
操作,而不是评估 [=13= 时的标准 *
操作].当我这样做时,我的情节底部出现奇怪的扁平线。
代码:
N = 10000;
mu = 5; sigma = 2;
r = randn(N,1);
x = mu+sigma*r;
bin=mu-6*sigma:0.5:mu+6*sigma;
f=hist(x,bin);
plot(bin,f,'bo'); hold on;
xlabel('bin');
ylabel('f');
y_ = f;
x_ = bin;
H = [ones(length(y_),1),x_'];
Astar = inv(H'*H)*H'.*y_; % Line in Question
% Astar = inv(H'*H)*H'*y_; % Initial form, but Matlab prompts to perform .* instead
Ytilde = H*Astar;
plot(x_,Ytilde, 'r-','LineWidth',1)
结果图:
可能是什么原因?
无论好坏,MATLAB 的一些命令 return 行向量和一些 return 列向量。通常(或者可能几乎总是)统计是用作为列向量的观察向量完成的。据我所知,这只是使用某些命令时必须注意的事情。
您的问题来自于 y_
是一个行向量,而普通统计公式假设它是一个列向量。在 'line in question' 中,如果您使用 *y_'
而不是 .*y_
(即 Astar = inv(H'*H)*H'*y_';
),那么您会得到预期的行为。
MATLAB中的冒号运算符生成一个行向量,hist
做同样的事情。这些才是问题的根源。这些可以通过几种方式解决。
一种方法是在代码的第一部分生成它们时转置它们。另一种方法是在实例化 x_
和 y_
时转置它们(在下面完成)。另一种方法(也可能是最糟糕的方法)是将它们保留为行向量并在每次使用它们时转置它们。总的来说,解决方案将取决于您的其余代码,最好保持一致。
===
N = 10000;
mu = 5; sigma = 2;
r = randn(N,1);
x = mu+sigma*r;
bin=mu-6*sigma:0.5:mu+6*sigma;
f=hist(x,bin);
figure;
scatter(bin,f); hold on;
xlabel('bin');
ylabel('f');
y_ = f';
x_ = bin';
H = [ones(length(y_),1),x_];
Astar = inv(H'*H)*H'*y_; % Line in Question
Ytilde = H*Astar;
plot(x_,Ytilde, 'r-','LineWidth',1)
===
[另请注意,您仍然得到一条水平线,但 y ~= 200。鉴于曲线是对称的,这是预期的,这也与 MATLAB 的内置 polyfit
和 polyval
函数一致.]
[另请注意,不再推荐 hist
。]