From fc272b1fb4d3e706b5aec037d8a19469762822bb Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 15 Sep 2017 17:03:11 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=20pegasos=20=E7=AE=97?= =?UTF-8?q?=E6=B3=95=E4=BB=A3=E7=A0=81=E9=83=A8=E5=88=86?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- docs/15.大数据与MapReduce.md | 41 ++++++++++++++++++++-- src/python/15.BigData_MapReduce/pegasos.py | 6 ++-- 2 files changed, 41 insertions(+), 6 deletions(-) diff --git a/docs/15.大数据与MapReduce.md b/docs/15.大数据与MapReduce.md index 08afb24e..cda13be6 100644 --- a/docs/15.大数据与MapReduce.md +++ b/docs/15.大数据与MapReduce.md @@ -143,11 +143,46 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver) > 训练算法 +```python +def batchPegasos(dataSet, labels, lam, T, k): + """batchPegasos() + + Args: + dataMat 特征集合 + labels 分类结果集合 + lam 固定值,微调的空间 + T 迭代次数 + k 待处理列表大小 + Returns: + w 权重向量 + """ + m, n = shape(dataSet) + w = zeros(n) + dataIndex = range(m) + for t in range(1, T+1): + wDelta = mat(zeros(n)) # 重置 wDelta + + # 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长) + # 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta + eta = 1.0/(lam*t) + random.shuffle(dataIndex) + for j in range(k): # 全部的训练集 内循环中执行批处理,将分类错误的值全部做累加后更新权重向量 + i = dataIndex[j] + p = predict(w, dataSet[i, :]) # mapper 代码 + + # 如果预测正确,并且预测结果的绝对值>=1, 认为没问题。 + # 否则算是预测错误, 通过预测错误的结果,来累计更新w. + if labels[i]*p < 1: # mapper 代码 + wDelta += labels[i]*dataSet[i, :].A # 累积变化 + # w通过不断的随机梯度的方式来优化 + w = (1.0 - 1/t)*w + (eta/k)*wDelta # 在每个 T上应用更改 + # print '-----', w + # print '++++++', w + return w +``` + [完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py): - -我们继续看 Python 版本的代码实现。 - * * * * **作者:[片刻](http://cwiki.apachecn.org/display/~jiangzhonglian) [小瑶](http://cwiki.apachecn.org/display/~chenyao)** diff --git a/src/python/15.BigData_MapReduce/pegasos.py b/src/python/15.BigData_MapReduce/pegasos.py index 495707b0..eaa05d49 100644 --- a/src/python/15.BigData_MapReduce/pegasos.py +++ b/src/python/15.BigData_MapReduce/pegasos.py @@ -58,7 +58,7 @@ def batchPegasos(dataSet, labels, lam, T, k): for t in range(1, T+1): wDelta = mat(zeros(n)) # 重置 wDelta - # 它是学习率,代表了权重调整幅度的大小。 + # 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长) # 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta eta = 1.0/(lam*t) random.shuffle(dataIndex) @@ -72,8 +72,8 @@ def batchPegasos(dataSet, labels, lam, T, k): wDelta += labels[i]*dataSet[i, :].A # 累积变化 # w通过不断的随机梯度的方式来优化 w = (1.0 - 1/t)*w + (eta/k)*wDelta # 在每个 T上应用更改 - print '-----', w - print '++++++', w + # print '-----', w + # print '++++++', w return w