softmax的简单推导和python实现

博客详细介绍了softmax算法的数学推导,将其与logistic回归对比,并通过似然函数的概念解释了寻找最优参数的过程。文章以抛硬币为例,阐述了最大似然函数的思想,并提出使用梯度上升法来更新参数。最后,提供了求梯度上升的伪代码。

首先,我们来看看对于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


评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值