您的位置:首页 > 编程语言 > Python开发

softmax的简单推导和python实现

2017-03-12 22:16 253 查看
首先,我们来看看对于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
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: