我试图验证我在Matlab中实现的Logistic回归是否良好。我通过比较我通过实现得到的结果和内置函数mnrfit
给出的结果来做到这一点。
我拥有的数据集D
,Y
是D
的每一行都是R ^ 2中的一个观察点,Y
中的标签是0或者1.因此,D
是一个大小为(n,2)
的矩阵,Y
是一个大小为(n,1)
以下是我的实施方式: 我首先规范化我的数据并将其扩充到包括偏移量:
d = 2; %dimension of data
M = mean(D) ;
centered = D-repmat(M,n,1) ;
devs = sqrt(sum(centered.^2)) ;
normalized = centered./repmat(devs,n,1) ;
X = [normalized,ones(n,1)];
我将在X
上进行计算。
其次,我定义了Y | X的可能性的梯度和粗糙:
function grad = gradient(w)
grad = zeros(1,d+1) ;
for i=1:n
grad = grad + (Y(i)-sigma(w'*X(i,:)'))*X(i,:) ;
end
end
function hess = hessian(w)
hess = zeros(d+1,d+1) ;
for i=1:n
hess = hess - sigma(w'*X(i,:)')*sigma(-w'*X(i,:)')*X(i,:)'*X(i,:) ;
end
end
sigma
是编码sigmoid函数z的matlab函数 - > 1 /(1 + exp(-z))。
第三,我在gradient
上运行牛顿算法来找到可能性梯度的根。我自己实现了它。它的行为与预期的一致,因为迭代之间的差异的范数变为0.我基于this script编写了它。
我验证了牛顿实现返回的wOPT的渐变为null:
gradient(wOP)
ans =
1.0e-15 *
0.0139 -0.0021 0.2290
并且粗麻布具有严格的负特征值
eig(hessian(wOPT))
ans =
-7.5459
-0.0027
-0.0194
这是我实施的wOPT:
wOPT =
-110.8873
28.9114
1.3706
偏移是最后一个元素。为了绘制决策线,我应该使用wOPT(1:2)
和M
转换斜率devs
。所以我设置:
my_offset = wOPT(end);
my_slope = wOPT(1:d)'.*devs + M ;
我得到了:
my_slope =
1.0e+03 *
-7.2109 0.8166
my_offset =
1.3706
现在,当我运行B=mnrfit(D,Y+1)
时,我得到了
B =
-1.3496
1.7052
-1.0238
偏移量存储在B(1)
中。
我的价值观非常不同。我想知道我做错了什么。我对规范化和非规范化有一些疑问。处理。但我不确定,可能是我做错了什么。
其他信息
当我录音时:
B=mnrfit(normalized,Y+1)
我得到了
-1.3706
110.8873
-28.9114
这是我wOPT
反面的重新排列版本。它包含完全相同的元素。
似乎我缩减学习参数是错误的。否则,它将与B=mnrfit(D,Y+1)