我正在嘗試對此概率密度函式執行最小二乘回歸,但系統提示我.*在 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)
結果圖:

可能是什么原因?
uj5u.com熱心網友回復:
無論好壞,MATLAB 的一些命令回傳行向量,一些回傳列向量。通常(或幾乎總是)統計是用觀察向量作為列向量來完成的。據我所知,這只是使用某些命令時必須注意的事情。
您的問題來自y_行向量這一事實,而正常的統計公式假設它是列向量。在“有問題的行”中,如果您使用*y_'而不是.*y_(ie 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://www.uj5u.com/shujuku/486172.html
