我一直在尝试在Ruby中实现一个本地加权逻辑回归算法。据我所知,目前没有针对此算法的库可用,相关信息也非常有限,所以这项工作相当困难。
我的主要参考资料是Kan Deng博士的论文,他在其中对算法的描述我觉得相当简略。我目前在库上的工作进展在这里。
在尝试计算B
(beta)时遇到了麻烦。据我了解,B
是一个(1+d x 1)
的向量,表示特定点的本地加权。之后,该点的pi
(正输出概率)是基于该点B
的Sigmoid函数。为了得到B
,需要递归使用牛顿-拉弗森算法一定次数,可能不超过十次。
第66页的方程4-4,牛顿-拉弗森算法本身,对我来说并不清楚。根据我对X
和W
的理解,(x.transpose * w * x).inverse * x.transpose * w
应该是一个(1+d x N)
的矩阵,这与B
的(1+d x 1)
不匹配。那么,唯一可能成立的情况是e
是一个(N x 1)
的向量。
然而,在第67页顶部,图片下方,Deng博士只是说e
是一个比率,这对我来说并不合理。e
是欧拉常数吗?这个比率总是2.718:1,还是其他什么?无论如何,这个解释似乎并没有暗示它是一个向量,这让我感到困惑。
pi'
的使用也让我感到困惑。方程4-5,Sigmoid函数对B
的导数,给出了一个常数乘以一个向量,或者是一个向量。但据我所知,pi'
应该只是一个数字,用来乘以w
并形成权重算法W
的对角线。
所以,我这里的两个主要问题是,第67页上的e
是什么,是我需要的1xN
矩阵吗?以及方程4-5中的pi'
如何变成一个数字?
我意识到这是一个难以回答的问题,所以如果有好的答案,我会在几天后回来并给予五十点的奖励。我本想给Deng博士发邮件,但自1997年后我一直无法找到他的消息。
如果有人对这个算法有经验或知道其他资源,任何帮助都将不胜感激!
回答:
据我所见,这只是逻辑回归的一种版本,其中对数似然函数中的项根据它们与你试图分类的点的距离有一个乘法权重。我建议先熟悉逻辑回归的解释,比如http://czep.net/stat/mlelr.pdf。你提到的“e”似乎与欧拉常数完全无关——我认为他用e表示误差。
如果你能从Ruby中调用Java,你可能能够使用Weka中描述的逻辑分类器,详见http://weka.sourceforge.net/doc.stable/weka/classifiers/functions/Logistic.html – 该文档提到“虽然原始逻辑回归不处理实例权重,但我们对算法稍作修改以处理实例权重。”如果没有其他办法,你可以下载它并查看其源代码。如果你这样做,请注意这是一种相当复杂的方法——例如,他们会先检查所有点是否实际上大致位于输入空间的某个子空间中,如果是,他们会投影到几个维度上。