Skip to content

Commit fc272b1

Browse files
更新 pegasos 算法代码部分
1 parent a104caa commit fc272b1

2 files changed

Lines changed: 41 additions & 6 deletions

File tree

docs/15.大数据与MapReduce.md

Lines changed: 38 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -143,10 +143,45 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
143143

144144
> 训练算法
145145
146-
[完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py>
147-
146+
```python
147+
def batchPegasos(dataSet, labels, lam, T, k):
148+
"""batchPegasos()
149+
150+
Args:
151+
dataMat 特征集合
152+
labels 分类结果集合
153+
lam 固定值,微调的空间
154+
T 迭代次数
155+
k 待处理列表大小
156+
Returns:
157+
w 权重向量
158+
"""
159+
m, n = shape(dataSet)
160+
w = zeros(n)
161+
dataIndex = range(m)
162+
for t in range(1, T+1):
163+
wDelta = mat(zeros(n)) # 重置 wDelta
164+
165+
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长)
166+
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
167+
eta = 1.0/(lam*t)
168+
random.shuffle(dataIndex)
169+
for j in range(k): # 全部的训练集 内循环中执行批处理,将分类错误的值全部做累加后更新权重向量
170+
i = dataIndex[j]
171+
p = predict(w, dataSet[i, :]) # mapper 代码
172+
173+
# 如果预测正确,并且预测结果的绝对值>=1, 认为没问题。
174+
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
175+
if labels[i]*p < 1: # mapper 代码
176+
wDelta += labels[i]*dataSet[i, :].A # 累积变化
177+
# w通过不断的随机梯度的方式来优化
178+
w = (1.0 - 1/t)*w + (eta/k)*wDelta # 在每个 T上应用更改
179+
# print '-----', w
180+
# print '++++++', w
181+
return w
182+
```
148183

149-
我们继续看 Python 版本的代码实现。
184+
[完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/2.KNN/kNN.py>
150185

151186
* * *
152187

src/python/15.BigData_MapReduce/pegasos.py

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ def batchPegasos(dataSet, labels, lam, T, k):
5858
for t in range(1, T+1):
5959
wDelta = mat(zeros(n)) # 重置 wDelta
6060

61-
# 它是学习率,代表了权重调整幅度的大小。
61+
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长)
6262
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
6363
eta = 1.0/(lam*t)
6464
random.shuffle(dataIndex)
@@ -72,8 +72,8 @@ def batchPegasos(dataSet, labels, lam, T, k):
7272
wDelta += labels[i]*dataSet[i, :].A # 累积变化
7373
# w通过不断的随机梯度的方式来优化
7474
w = (1.0 - 1/t)*w + (eta/k)*wDelta # 在每个 T上应用更改
75-
print '-----', w
76-
print '++++++', w
75+
# print '-----', w
76+
# print '++++++', w
7777
return w
7878

7979

0 commit comments

Comments
 (0)