机器学习笔记——logistics梯度上升算法的改进
参考书籍
参考书籍:人民邮电出版社——图灵程序设计丛书《机器学习实战》
在上一篇文章:机器学习笔记——logistics的python实现中涉及到了梯度上升算法,但是在上文的实现过程当中,在每一次迭代中都需要涉及到整个样本矩阵的计算,当样本和特征数量的极大时,就需要大量的复杂计算,下面介绍一个随机梯度上升算法:
随机梯度上升算法
随机梯度上升算法和原方法不同的地方在于,这种方法遍历每个样本,根据每个样本的计算误差来修正系数,多次遍历样本也可以达到目的。同时这种方法不需要每次进行矩阵运算,只需要进行数值计算,下面是这种方法的代码:
def stoc_grad_Acent(featureData,classLabel,num=200):
"""
随机梯度上升算法,一般而言,num设置的越大,精度越高
"""
featureData = np.mat(featureData)
classLabel = np.mat(classLabel)
m,n = featureData.shape
weights = np.ones((n,1))
alpha = 0.01
# 这里设置几个参数用于后面的参数敏感性分析
parameter0 = []
parameter1 = []
parameter2 = []
# 多次循环样本来进行参数修正
for jj in range(num):
for ii in range(m):
parameter0.append(weights[0,0])
parameter1.append(weights[1,0])
parameter2.append(weights[2,0])
# 随机梯度上升算法
test = sigmod(featureData[ii,:]*weights)
test_error = classLabel[0,ii] - test
weights = weights + alpha*test_error[0,0]*featureData[ii,:].transpose()
return weights,parameter0,parameter1,parameter2
得到的分类结果如下所示:
这里进行了20轮(num=20)的循环,从分类结果中肯并不理想,但是不能直接认定这种分类方式有误,这里对参数进行敏感性分析,观察在循环过程中参数的变化,代码如下:
def parameter_sensitive_test(parameter0,parameter1,parameter2,filename='parameter_analyze.png'):
"""
参数敏感性分析
"""
x = list(np.arange(0