Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
44 changes: 37 additions & 7 deletions docs/15.大数据与MapReduce.md
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
上述算法伪代码如下:

```
w 初始化为0
回归系数w 初始化为0
对每次批处理
随机选择 k 个样本点(向量)
对每个向量
Expand All @@ -141,6 +141,36 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
使用算法:本例不会展示一个完整的应用,但会展示如何在大数据集上训练SVM。该算法其中一个应用场景就是本文分类,通常在文本分类里可能有大量的文档和成千上万的特征。
```

> 收集数据

文本文件数据格式如下:

```python
0.365032 2.465645 -1
-2.494175 -0.292380 -1
-3.039364 -0.123108 -1
1.348150 0.255696 1
2.768494 1.234954 1
1.232328 -0.601198 1
```

> 准备数据

```python
def loadDataSet(fileName):
dataMat = []
labelMat = []
fr = open(fileName)
for line in fr.readlines():
lineArr = line.strip().split('\t')
# dataMat.append([float(lineArr[0]), float(lineArr[1]), float(lineArr[2])])
dataMat.append([float(lineArr[0]), float(lineArr[1])])
labelMat.append(float(lineArr[2]))
return dataMat, labelMat
```

> 分析数据: 无

> 训练算法

```python
Expand All @@ -150,27 +180,27 @@ def batchPegasos(dataSet, labels, lam, T, k):
Args:
dataMat 特征集合
labels 分类结果集合
lam 固定值,微调的空间
lam 固定值
T 迭代次数
k 待处理列表大小
Returns:
w 权重向量
w 回归系数
"""
m, n = shape(dataSet)
w = zeros(n)
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, 认为没问题。
# 如果预测正确,并且预测结果的绝对值>=1,因为最大间隔为1, 认为没问题。
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
if labels[i]*p < 1: # mapper 代码
wDelta += labels[i]*dataSet[i, :].A # 累积变化
Expand All @@ -183,7 +213,7 @@ def batchPegasos(dataSet, labels, lam, T, k):

[完整代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/pegasos.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/pegasos.py>

[MR版本的代码位置](https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/mrSVM.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/mrSVM.py>
[MR版本的代码地址](https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/mrSVM.py): <https://github.com/apachecn/MachineLearning/blob/master/src/python/15.BigData_MapReduce/mrSVM.py>

* * *

Expand Down
10 changes: 5 additions & 5 deletions src/python/15.BigData_MapReduce/pegasos.py
Original file line number Diff line number Diff line change
Expand Up @@ -46,27 +46,27 @@ def batchPegasos(dataSet, labels, lam, T, k):
Args:
dataMat 特征集合
labels 分类结果集合
lam 固定值,微调的空间
lam 固定值
T 迭代次数
k 待处理列表大小
Returns:
w 权重向量
w 回归系数
"""
m, n = shape(dataSet)
w = zeros(n)
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, 认为没问题。
# 如果预测正确,并且预测结果的绝对值>=1,因为最大间隔为1, 认为没问题。
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
if labels[i]*p < 1: # mapper 代码
wDelta += labels[i]*dataSet[i, :].A # 累积变化
Expand Down