From a104caadb937666a16c84bc7bffd1be9cad76c1f Mon Sep 17 00:00:00 2001 From: jiangzhonglian Date: Fri, 15 Sep 2017 16:51:51 +0800 Subject: [PATCH] =?UTF-8?q?pagasos=20python=E7=89=88=E6=9C=AC=E7=9A=84?= =?UTF-8?q?=E6=B3=A8=E9=87=8A=E6=9B=B4=E6=96=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/python/15.BigData_MapReduce/pegasos.py | 32 ++++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/src/python/15.BigData_MapReduce/pegasos.py b/src/python/15.BigData_MapReduce/pegasos.py index 4a3b70f0..495707b0 100644 --- a/src/python/15.BigData_MapReduce/pegasos.py +++ b/src/python/15.BigData_MapReduce/pegasos.py @@ -37,23 +37,43 @@ def seqPegasos(dataSet, labels, lam, T): def predict(w, x): - return w*x.T + return w*x.T # 就是预测 y 的值 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): # 全部的训练集 + for j in range(k): # 全部的训练集 内循环中执行批处理,将分类错误的值全部做累加后更新权重向量 i = dataIndex[j] - p = predict(w, dataSet[i, :]) # mapper 代码 - if labels[i]*p < 1: # mapper 代码 - wDelta += labels[i]*dataSet[i, :].A # 累积变化 - w = (1.0 - 1/t)*w + (eta/k)*wDelta # 在每个 T上应用更改 + 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