2015-05-05 106 views
3

我一直在关注Andrew Ng CSC229机器学习课程,现在我已经介绍了逻辑回归。目标是最大化对数似然函数并找出theta的最优值来做到这一点。讲义的链接是:[http://cs229.stanford.edu/notes/cs229-notes1.ps][1]-页码16-19。现在,下面的代码显示在课程主页上(但在matlab中 - 我将它转换为python)。Logistic回归的批次梯度下降

我将它应用于一个包含100个培训示例的数据集(在Coursera主页上提供了一个介绍性机器学习课程的数据集)。这些数据有两个特点,两个考试分数是两个。如果学生收到录取通知书,则输出为1,而学生未收到录取通知书则为0。已经显示了下面的所有代码。以下代码使似然函数收敛到约-62的最大值。 theta的相应值是[-0.05560301 0.01081111 0.00088362]。当我测试一个训练样例,如[1,30.28671077,43.89499752]应该给出值0作为输出时,使用这些值,我得到0.576,这对我没有意义。如果我用输入[1,10,10]来检验假设函数,我得到0.515,这再次没有意义。这些值应该对应较低的概率。这让我很困惑。

import numpy as np 
import sig as s 

def batchlogreg(X, y): 
    max_iterations = 800 
    alpha = 0.00001 

    (m,n) = np.shape(X) 

    X = np.insert(X, 0, 1, 1) 
    theta = np.array([0] * (n+1), 'float') 
    ll = np.array([0] * max_iterations, 'float') 

    for i in range(max_iterations): 
     hx = s.sigmoid(np.dot(X, theta)) 
     d = y - hx 
     theta = theta + alpha*np.dot(np.transpose(X),d) 
     ll[i] = sum(y * np.log(hx) + (1-y) * np.log(1- hx)) 

    return (theta, ll) 
+0

链接不起作用。另外,你应该在你的问题中发布相关文本,而不是仅仅给它一个链接。 – Kmeixner

+0

道歉这里是一个工作版本http://cs229.stanford.edu/notes/cs229-notes1.ps – Aerole

+0

你试过更大的学习率('阿尔法')?它通常不会**那么小,所以你可能没有正确地训练你的模型。试试'0.1,0.001'等等。 – IVlad

回答

1

注意,双曲线函数有:

sig(0) = 0.5 
sig(x > 0) > 0.5 
sig(x < 0) < 0.5 

因为你得到上述0.5所有的概率,这表明你从来不X * theta负,或者说你做什么,而是你的学习速度过小,使之物。

for i in range(max_iterations): 
    hx = s.sigmoid(np.dot(X, theta)) # this will probably be > 0.5 initially 
    d = y - hx # then this will be "very" negative when y is 0 
    theta = theta + alpha*np.dot(np.transpose(X),d) # (1) 
    ll[i] = sum(y * np.log(hx) + (1-y) * np.log(1- hx)) 

问题很可能发生在(1)。点积将是非常负面的,但是你的alpha非常小,并且会否定它的效果。所以theta永远不会降低到足以正确处理正确分类0的标签。

正实例因此只能基于相同的原因正确分类:在迭代次数和学习速率下,您的算法没有发现合理的假设。

可能的解决方案:增加alpha和/或迭代次数,或使用momentum

+0

所以我实际上花了很多时间玩alpha和迭代次数。基本上在alpha = 0.1时,我获得了对数似然函数的所有nan值。在alpha = 0.01时,我得到了一些nan值,否则没有收敛到max。在阿尔法= 0.001几乎相同。在alpha = 0.0001时,似乎收敛到-784和-478,并且还产生了许多nan值。但仍然不稳定。降低显示值的α值最终不会产生nan值,并且会稳定收敛到-62。 – Aerole

+0

而且为更大的alpha生成的theta给了我真正糟糕的logistic函数输出。一切都是0.目前使用的alpha最终给了我一个稳定的输出,尽管数值在0.5到0.77之间。 – Aerole

+0

你可以尝试使用float64为你的数组吗?另外,不要接受,直到它的工作。 – IVlad

0

这听起来像你可能会混淆概率与作业。

概率将是0.0到1.0之间的实数。标签将是一个整数(0或1)。逻辑回归是一种模型,它给出输入特征的标签为1的概率。要获得标签值,您需要使用该概率做出决定。一个简单的决策规则是,如果概率小于0.5,则标签为0;如果概率大于或等于0.5,则为1。

因此,对于您给出的示例,这两个决定都是1(这意味着模型对于第一个示例应该为0的示例是错误的)。

+0

是的,我明白这个假设会输出一个概率,让学生在给定特定输入向量的情况下获得入学许可。虽然做出如下决定是合理的,例如概率小于0.6而不是0,否则它对应于1.然后这在大多数情况下是合理的。但不是那么直观,因为你会期望[1,95,96]等高分给出0.9的概率,而不是0.77,这正是我所得到的。 – Aerole

+0

更具体地说,我为任意输入获得的概率介于0.5到0.77之间。这是正常的还是一件奇怪的事情? – Aerole

+0

好的。所以,简短的答案是'我不知道'。漫长的答案是,你的概率不需要很好的校准,因为决策规则仍然很好。只要高分考试导致更高的录取概率(通常),即使差异不是那么大,您仍然可以在两件事之间做出决定。 –

0

我来到同一个问题,找到原因。

规格化X第一或设置鳞片可比截距等50.

否则成本函数的轮廓是太“窄”。一个大的阿尔法使得它超调,而一个小的阿尔法未能取得进展。