Softmax回归是Logistic回归的多分类推广。
对于
k
分类,第
当给定一个样本
x
,对于
p(c=k|x;θ)=eθTkxe∑kθTkx
当
k
=2,公式如下,即为Logistic回归
同Logistic回归计算方法,得到随机梯度:
∂J(θ)∂θk=(yk−p(yk|x;θ))⋅x
代码实现
def soft_max(data, k, alpha, lamda):
n = len(data[0]) - 1 #样本维度
w = np.zeros((k, n)) #权值初始化
wNew = np.zeros((k, n)) #临时权值
for times in range(1000):
for d in date:
x = d[:-1] # 输入向量
for k in range(k): # k类别
y = 0 #期望输出标量
if int(d[-1] + 0.5) == k:
y = 1
p = predict(w, x, k)
g = (y - p)*x #梯度 n维列向量
wNew[k] = w[k] + (alpha * g + lamda * w[k])
w = wNew.copy()
return w
附录
import numpy as np
import matplotlib.pyplot as plt
fig = plt.figure()
plt.figure(figsize=(1, 1))
u = np.linspace(0,4,500)
x,y = np.meshgrid(u,u)
ax1 = fig.add_subplot(1,2,1) # softmax
z = np.log(np.exp(x) + np.exp(y))
ax1.contour(x,y,z,20)
ax2 = fig.add_subplot(1,2,2) # max
z = [0 for i in range(len(u))]
for i in range(len(u)):
z[i] = [0 for k in range(len(u))]
for j in range(len(u)):
z[i][j] = max(x[i][j] ,y[i][j])
ax2.contour(x,y,z,20)
plt.show()