首先,我们来看看对于softmax的推导过程:
我们可以对softmax算法进行数学上的推导,在推导的过程我们可以发现其过程类似于之前我们所熟悉的logitic算法,softmax相当于是logitic的一个范化。当我们推导到最后一步的时候,为了在已知输出模型的基础上找到最优的参数sigma,我们需要了解一下似然函数了。
似然函数的概念:似然函数就是我们已知输出结果的情况下,求其参数的值。它与条件概率有些相反,条件概率就是在已知一些参数的情况下得到其输出的概率。
用抛硬币的例子能够很好解释清楚似然函数的意义,已知投出的硬币正面朝上和反面朝上的概率各自是PH = 0.5,便可以知道投掷若干次后出现各种结果的可能性。比如说,投两次都是正面朝上的概率是0.25。用条件概率表示,就是:P(HH|PH = 0.5) = 0.25,其中H表示正面朝上。我们可以得到P(HH|PH = a) = a^2,为了使得似然值最大,我们会认为a = 1,因为当前我们的输出模型是两次输出都为正面向上。就是说这是在已知输出结果的情况下得到的参数,其会受到输出值的大小影响。例如 P(HHT|PH = a) = a^2(1-a),这时候就变成了Ph=0.6,在正正反的情况下得到该概率。
所以,最大似然函数的思想是,我们已知模型输出的情况下,使得参数最为合理,即可能性最大的值。
为了求得合适的参数,我们需要引进用梯度上升的方法更新参数,所以我们代码就是要得到最后一行需要更新的目标函数。
求梯度上升伪代码如下,大家可以结合推导看看:
def softmaxGradientAscent(self): for l in range(迭代次数(经验值或可以测试得到)): for i in range(数据的大小): error = exp(self.dataMat[i]*self.权重) rowsum = -error.sum(axis=1) rowsum = rowsum.repeat(self.K, axis=1) error = error/rowsum error[0,self.labelMat[i,0]] += 1#求到这里已经把目标函数转化 self.weights = self.weights + self.alpha * self.dataMat[i].transpose()* error print self.weights