mirror of
https://github.com/apachecn/ailearning.git
synced 2026-06-14 22:36:30 +08:00
@@ -121,7 +121,7 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
|
|||||||
上述算法伪代码如下:
|
上述算法伪代码如下:
|
||||||
|
|
||||||
```
|
```
|
||||||
将 w 初始化为0
|
将 回归系数w 初始化为0
|
||||||
对每次批处理
|
对每次批处理
|
||||||
随机选择 k 个样本点(向量)
|
随机选择 k 个样本点(向量)
|
||||||
对每个向量
|
对每个向量
|
||||||
@@ -141,6 +141,36 @@ Pegasos是指原始估计梯度求解器(Peimal Estimated sub-GrAdient Solver)
|
|||||||
使用算法:本例不会展示一个完整的应用,但会展示如何在大数据集上训练SVM。该算法其中一个应用场景就是本文分类,通常在文本分类里可能有大量的文档和成千上万的特征。
|
使用算法:本例不会展示一个完整的应用,但会展示如何在大数据集上训练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
|
```python
|
||||||
@@ -150,19 +180,19 @@ def batchPegasos(dataSet, labels, lam, T, k):
|
|||||||
Args:
|
Args:
|
||||||
dataMat 特征集合
|
dataMat 特征集合
|
||||||
labels 分类结果集合
|
labels 分类结果集合
|
||||||
lam 固定值,微调的空间
|
lam 固定值
|
||||||
T 迭代次数
|
T 迭代次数
|
||||||
k 待处理列表大小
|
k 待处理列表大小
|
||||||
Returns:
|
Returns:
|
||||||
w 权重向量
|
w 回归系数
|
||||||
"""
|
"""
|
||||||
m, n = shape(dataSet)
|
m, n = shape(dataSet)
|
||||||
w = zeros(n)
|
w = zeros(n) # 回归系数
|
||||||
dataIndex = range(m)
|
dataIndex = range(m)
|
||||||
for t in range(1, T+1):
|
for t in range(1, T+1):
|
||||||
wDelta = mat(zeros(n)) # 重置 wDelta
|
wDelta = mat(zeros(n)) # 重置 wDelta
|
||||||
|
|
||||||
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长)
|
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长,使它不断减小,便于拟合)
|
||||||
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
|
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
|
||||||
eta = 1.0/(lam*t)
|
eta = 1.0/(lam*t)
|
||||||
random.shuffle(dataIndex)
|
random.shuffle(dataIndex)
|
||||||
@@ -170,7 +200,7 @@ def batchPegasos(dataSet, labels, lam, T, k):
|
|||||||
i = dataIndex[j]
|
i = dataIndex[j]
|
||||||
p = predict(w, dataSet[i, :]) # mapper 代码
|
p = predict(w, dataSet[i, :]) # mapper 代码
|
||||||
|
|
||||||
# 如果预测正确,并且预测结果的绝对值>=1, 认为没问题。
|
# 如果预测正确,并且预测结果的绝对值>=1,因为最大间隔为1, 认为没问题。
|
||||||
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
|
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
|
||||||
if labels[i]*p < 1: # mapper 代码
|
if labels[i]*p < 1: # mapper 代码
|
||||||
wDelta += labels[i]*dataSet[i, :].A # 累积变化
|
wDelta += labels[i]*dataSet[i, :].A # 累积变化
|
||||||
@@ -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>
|
[完整代码地址](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>
|
||||||
|
|
||||||
* * *
|
* * *
|
||||||
|
|
||||||
|
|||||||
@@ -46,19 +46,19 @@ def batchPegasos(dataSet, labels, lam, T, k):
|
|||||||
Args:
|
Args:
|
||||||
dataMat 特征集合
|
dataMat 特征集合
|
||||||
labels 分类结果集合
|
labels 分类结果集合
|
||||||
lam 固定值,微调的空间
|
lam 固定值
|
||||||
T 迭代次数
|
T 迭代次数
|
||||||
k 待处理列表大小
|
k 待处理列表大小
|
||||||
Returns:
|
Returns:
|
||||||
w 权重向量
|
w 回归系数
|
||||||
"""
|
"""
|
||||||
m, n = shape(dataSet)
|
m, n = shape(dataSet)
|
||||||
w = zeros(n)
|
w = zeros(n) # 回归系数
|
||||||
dataIndex = range(m)
|
dataIndex = range(m)
|
||||||
for t in range(1, T+1):
|
for t in range(1, T+1):
|
||||||
wDelta = mat(zeros(n)) # 重置 wDelta
|
wDelta = mat(zeros(n)) # 重置 wDelta
|
||||||
|
|
||||||
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长)
|
# 它是学习率,代表了权重调整幅度的大小。(也可以理解为随机梯度的步长,使它不断减小,便于拟合)
|
||||||
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
|
# 输入T和K分别设定了迭代次数和待处理列表的大小。在T次迭代过程中,每次需要重新计算eta
|
||||||
eta = 1.0/(lam*t)
|
eta = 1.0/(lam*t)
|
||||||
random.shuffle(dataIndex)
|
random.shuffle(dataIndex)
|
||||||
@@ -66,7 +66,7 @@ def batchPegasos(dataSet, labels, lam, T, k):
|
|||||||
i = dataIndex[j]
|
i = dataIndex[j]
|
||||||
p = predict(w, dataSet[i, :]) # mapper 代码
|
p = predict(w, dataSet[i, :]) # mapper 代码
|
||||||
|
|
||||||
# 如果预测正确,并且预测结果的绝对值>=1, 认为没问题。
|
# 如果预测正确,并且预测结果的绝对值>=1,因为最大间隔为1, 认为没问题。
|
||||||
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
|
# 否则算是预测错误, 通过预测错误的结果,来累计更新w.
|
||||||
if labels[i]*p < 1: # mapper 代码
|
if labels[i]*p < 1: # mapper 代码
|
||||||
wDelta += labels[i]*dataSet[i, :].A # 累积变化
|
wDelta += labels[i]*dataSet[i, :].A # 累积变化
|
||||||
|
|||||||
Reference in New Issue
Block a user