第三章 逻辑(Logistic)回归(4)

接着上一节的内容,仔细的在来看一看最后用来计算的公式,看看如何通过编程的形式,把它表达出来。

$$\theta_j := \theta_j - \alpha \frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_i^j$$

可能经过长时间的公式推导以后,得到了最终的这个公式,已经忘了为何需要这个公式了,不明白这个公式的用处了。

所以需要再来思考下,公式的意义。

一开始需要通过逻辑回归对数据进行分类,逻辑回归的过程如下:

构造函数:

$$f(x,\theta) = \theta ^Tx$$

寻找一个函数$h_\theta(x) = g(\theta^T x)$,使得它的取值在0到1之间, 如果$h_\theta(x)\ge 0.5$,则预测y=1,既y属于正例; 如果$h_\theta(x)\lt 0.5$,则预测y=0,既y属于负例;

在Logistic回归中取得函数为Sigmoid 函数

$$h_\theta(x)=g(\theta^Tx)$$

要对未来的数据进行分类关键点还是怎么求的$\theta$,通过上一节的推导,已经得到了答案了。

$$\theta_j := \theta_j - \alpha \frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)x_i^j$$

$\theta$ 是通过不断的迭代过程,慢慢的得到了$\theta$的值,这也是机器学习中进程使用的一种方法。

具体的看下这个公式里各个参数的意义。

$\theta _j$ 为迭代过程中$\theta$ 的值,开始迭代之前可以给一个默认值,$\alpha$ 为学习因子在机器学习之前会先进行设定。

$ \frac{1}{m}\sum_{i=1}^m(h_\theta(x_i)-y_i)$ 可以看成是误差,也就是真实值和计算值之间的差值。$x_i$和$y_i$ 是我们观察到的数据,也就是用来训练的数据。

$$h_\theta(x)=g(\theta^Tx) = \frac{1}{1+e^{-\theta^Tx}}$$

这些公式的意义弄清楚了以后,用代码进行描述就不是什么难事了。

def sigmoid(thetaX):
    return 1.0/(1+exp(-thetaX))

按照公式计算$\theta$,迭代过程如下:

def gradAscent(dataMatIn, classLabels):
    dataMatrix = mat(dataMatIn)             
    labelMat = mat(classLabels).transpose() 
    m,n = shape(dataMatrix)
    alpha = 0.001
    maxCycles = 500
    weights = ones((n,1))
    for k in range(maxCycles):              
        h = sigmoid(dataMatrix*weights)     
        error = (labelMat - h)              
        weights = weights + alpha * dataMatrix.transpose()* error 
    return weights

dataMatIn 为输入值, classLabels 输入值的分类标签,输出的结果 weights 就是我们求解的 $\theta$。

有了 $\theta$ 以后,预测一些数据可以使用$h_\theta(x)\ge 0.5$ 来进行分类:

def classifyVector(inX, weights):
    prob = sigmoid(sum(inX*weights))
    if prob > 0.5: return 1.0
    else: return 0.0

如果大于0.5,结果为1,其他的为0。这样就可以把数据进行分类了。

转载请标明来之:http://www.bugingcode.com/

更多教程:阿猫学编程


来自您的鼓励

如果您感觉这一系列的教程,读后有点收获,并对知识有点了解,不妨小额捐助我一下,让我有动力继续写出更多好文章;或者在评论区留下你的意见。

所有评论

写了这么多年博客,收到的优秀评论少之又少。在这个属于 SNS 的时代也并不缺少向作者反馈的渠道。

还没有评论

撰写评论