我想實現Logistic迴歸算法而不調用任何matlab支持的函數和後綴我稱之爲logistic迴歸的matlab函數mnrfit
因此我可以交叉確認我的算法運行良好。通過使用sigmoid函數組合線性迴歸的方式進行邏輯迴歸
我正在執行的過程如下。我首先創建一個具有輸入數據的向量x和一個向量y [0,1],該向量對於每個數據x都具有相應的類。我使用梯度下降法對這些數據進行線性迴歸,一旦我提取係數,我將通過S形函數傳遞該線。稍後,我對x = 10進行預測,以找出此輸入的第1類的可能性。簡單,因爲..
之後,我打電話給matlab函數mnrfit
並提取邏輯迴歸的係數。爲了做出同樣的預測,我將函數mnrval
的參數設爲10,因爲我想像以前一樣預測輸入x = 10。我的結果是不同的,我不知道爲什麼..
這兩個繪圖顯示了每種情況下的概率密度函數顯示在最後。
我也附上了實施的代碼。
% x is the continues input and y is the category of every output [1 or 0]
x = (1:100)'; % independent variables x(s)
y(1:10) = 0; % Dependent variables y(s) -- class 0
y(11:100) = 1; % Dependent variables y(s) -- class 1
y=y';
y = y(randperm(length(y))); % Random order of y array
x=[ones(length(x),1) x]; % This is done for vectorized code
%% Initialize Linear regression parameters
m = length(y); % number of training examples
% initialize fitting parameters - all zeros
Alpha = 0; % gradient
Beta = 0; % offset
% Some gradient descent settings
% iterations must be a big number because we are taking very small steps .
iterations = 100000;
% Learning step must be small because the line must fit the data between
% [0 and 1]
Learning_step_a = 0.0005; % step parameter
%% Run Gradient descent
fprintf('Running Gradient Descent ...\n')
for iter = 1:iterations
% In every iteration calculate objective function
h= Alpha.*x(:,2)+ Beta.*x(:,1);
% Update line variables
Alpha=Alpha - Learning_step_a * (1/m)* sum((h-y).* x(:,2));
Beta=Beta - Learning_step_a * (1/m) * sum((h-y).*x(:,1));
end
% This is my linear Model
LinearModel=Alpha.*x(:,2)+ Beta.*x(:,1);
% I pass it through a sigmoid !
LogisticRegressionPDF = 1 ./ (1 + exp(-LinearModel));
% Make a prediction for p(y==1|x==10)
Prediction1=LogisticRegressionPDF(10);
%% Confirmation with matlab function mnrfit
B=mnrfit(x(:,2),y+1); % Find Logistic Regression Coefficients
mnrvalPDF = mnrval(B,x(:,2));
% Make a prediction .. p(y==1|x==10)
Prediction2=mnrvalPDF(10,2);
%% Plotting Results
% Plot Logistic Regression Results ...
figure;
plot(x(:,2),y,'g*');
hold on
plot(x(:,2),LogisticRegressionPDF,'k--');
hold off
title('My Logistic Regression PDF')
xlabel('continues input');
ylabel('propability density function');
% Plot Logistic Regression Results (mnrfit) ...
figure,plot(x(:,2),y,'g*');
hold on
plot(x(:,2),mnrvalPDF(:,2),'--k')
hold off
title('mnrval Logistic Regression PDF')
xlabel('continues input');
ylabel('propability density function')
爲什麼我的圖(只要預測)針對每種情況是不一樣的?
- 您可能會提取的輸出在每次執行時會有所不同,因爲y向量中的1和0的順序是隨機的。
有什麼建議嗎? – 2015-02-15 00:01:03
您的評論沒有通知任何人。你可以評論我的答案,讓我知道你編輯了這個問題;因爲直到現在我還不知道編輯。你問爲什麼情節是不同的。但邏輯迴歸與用sigmoid組成的線性迴歸不同。在數學上,沒有理由期望這兩個過程有相同的結果。 – 2015-02-17 23:23:28
是的,我看到我的評論沒有通知任何人,我很驚訝,因爲這是一個簡單的問題。如果我在我的問題上錯了,那麼有人必須告訴我,我在問一些不可理解的事情。無論如何,你能向我解釋爲什麼它不一樣嗎(Logistic迴歸vs直線通過S形)?從互聯網上的例子,我明白了。我如何通過非矢量化的matlab代碼正確地實現邏輯迴歸? – 2015-02-18 17:51:17