以下只是我个人的简要理解和简单总结,所有内容来自大神的博客,附上链接了,哈哈哈哈
Logistic回归
1.工作原理
2. Logistic回归的优缺点
优点:
- 实现简单,易于理解和实现;计算代价不高,速度很快,存储资源低。
缺点:
- 容易欠拟合,分类精度可能不高。
3. Logistic回归的一般流程
收集数据:采用任意方法收集数据。
准备数据:由于需要进行距离计算,因此要求数据类型为数值型。另外,结构化数据格式则最佳。
分析数据:采用任意方法对数据进行分析。
训练算法:大部分时间将用于训练,训练的目的是为了找到最佳的分类回归系数。
测试算法:一旦训练步骤完成,分类将会很快。
使用算法:首先,我们需要输入一些数据,并将其转换成对应的结构化数值;接着,基于训练好的回归系数,就可以对这些数值进行简单的回归计算,判定它们属于哪个类别;在这之后,我们就可以在输出的类别上做一些其他分析工作。
3.1 算法改进——随机梯度上升算法
之前的梯度上升算法在每一次更新回归系数时,都需要用到整个训练集,要进行矩阵乘法运算
,如下图所示
代码实现为
def gradAscent(dataMatIn, classLabels):
dataMatrix = np.mat(dataMatIn) #转换成numpy的mat
labelMat = np.mat(classLabels).transpose() #转换成numpy的mat,并进行转置
m, n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
alpha = 0.01 #移动步长,也就是学习速率,控制更新的幅度。
maxCycles = 500 #最大迭代次数
weights = np.ones((n,1))
for k in range(maxCycles):
h = sigmoid(dataMatrix * weights) #梯度上升矢量化公式
error = labelMat - h
weights = weights + alpha * dataMatrix.transpose() * error
return weights.getA(),weights_array #将矩阵转换为数组,返回权重数组
这种算法在 maxCycles 次循环中,每一次循环都要根据所有样本的情况,更新系数向量weights.
3.1.1 改进:随机梯度上升算法
def stocGradAscent1(dataMatrix, classLabels, numIter=150):
m,n = np.shape(dataMatrix) #返回dataMatrix的大小。m为行数,n为列数。
weights = np.ones(n) #参数初始化
for j in range(numIter):
dataIndex = list(range(m))
for i in range(m):
alpha = 4/(1.0+j+i)+0.01 #降低alpha的大小,每次减小1/(j+i)。
randIndex = int(random.uniform(0,len(dataIndex))) #随机选取样本
h = sigmoid(sum(dataMatrix[dataIndex[randIndex]]*weights)) #选择随机选取的一个样本,计算h
error = classLabels[dataIndex[randIndex]] - h #计算误差
weights = weights + alpha * error * dataMatrix[dataIndex[randIndex]] #更新回归系数
del(dataIndex[randIndex]) #删除已经使用的样本
return weights
代码中有两个for 循环, j 是迭代次数,i 是指样本点下标。、
- 改进一:alpha在每次迭代的时候都会调整,并且,虽然alpha会随着迭代次数不断减小,但永远不会减小到0,因为这里还存在一个常数项。必须这样做的原因是为了保证在多次迭代之后新数据仍然具有一定的影响。如果需要处理的问题是动态变化的,那么可以适当加大上述常数项,来确保新的值获得更大的回归系数。另一点值得注意的是,在降低alpha的函数中,alpha每次减少1/(j+i),其中j是迭代次数,i是样本点的下标。
- 改进二:更新回归系数(最优参数)时,只使用一个样本点,并且选择的样本点是随机的,每次迭代不使用已经用过的样本点。这样的方法,就有效地减少了计算量,并保证了回归效果。
3.1.2 问题总结
问题一:原算法和随机梯度算法的,迭代次数、运算时间之间的PK
看完这个算法之后,我还有一点小疑虑,但看了评论之后,我发现有一为读者和我的问题相同
问题二:用过的样本不用了???
for 迭代次数:
for 样本个数:
一共迭代 numIter 次, 在每一次迭代中,随机挑选一个样本点用于更新系数,该样本点使用后就不再使用;在下一次迭代中,再重新使用。
- 一次迭代共随机挑选 m 次样本,挑选一次后,该样本在此次迭代中不再使用