我试图对这个概率密度函数进行最小二乘回归,但我被提示在matlab中执行.*操作,而不是在计算Astar时执行标准的*操作。当我这样做的时候,我会在我的情节的底部得到奇怪的平行线。
守则:
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)导致的阴谋:

可能是什么原因?
发布于 2022-06-04 07:21:56
无论好坏,MATLAB的一些命令返回行向量,还有一些返回列向量。通常(或者几乎总是)统计是以观测向量为列向量进行的。据我所知,这只是一个人在使用某些命令时必须注意的事情。
您的问题来自这样一个事实:y_是行向量,而普通的统计公式假设它是列向量。在“问题中的行”中,如果您使用*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。
https://stackoverflow.com/questions/72482449
复制相似问题