SVM的Map-Reduce数据挖掘算法

数据库 算法
SVM支持向量机,最近十五年机器学习界的明星算法,学术界也是各种研究,现今已经达到一个瓶颈,屋漏偏逢连夜雨,随着深度学习的雄起,SVM弄的一个人走茶凉的境遇(也许正是90年代神经网络的感受吧,呵呵),现在讲一讲关于SVM的并行。

由于原算法较难应用并行策略,而它的另一个算法变种-pegasos 适合并行,下面是该算法的过程。

初始化W=0(向量形式)

for i in t:

     随机选择K个样本

     for j in K:

          if 第j个样本分错

              利用该样本更新权重

     累加W的更新

end for   

下面是基于mrjob的map-reduce版   

  1. class MRsvm(MRJob): 
  2.  
  3.     DEFAULT_INPUT_PROTOCOL = 'json_value' 
  4.  
  5.     #一些参数的设置 
  6.  
  7.     def __init__(self, *args, **kwargs): 
  8.  
  9.         super(MRsvm, self).__init__(*args, **kwargs) 
  10.  
  11.         self.data = pickle.load(open('data_path')) 
  12.  
  13.         self.w = 0 
  14.  
  15.         self.eta = 0.69 #学习率 
  16.  
  17.         self.dataList = [] #用于收集样本的列表 
  18.  
  19.         self.k = self.options.batchsize 
  20.  
  21.         self.numMappers = 1  
  22.  
  23.         self.t = 1 # 迭代次数 
  24.  
  25.  
  26.     def map(self, mapperId, inVals):  
  27.  
  28.         #<key,value> 对应着 <机器mapperID,W值或者样本特征跟标签> 
  29.  
  30.         if False: yield 
  31.  
  32.         #判断value是属于W还是样本ID 
  33.  
  34.         if inVals[0]=='w':  
  35.  
  36.             self.w = inVals[1] 
  37.  
  38.         elif inVals[0]=='x'
  39.  
  40.             self.dataList.append(inVals[1]) 
  41.  
  42.         elif inVals[0]=='t': self.t = inVals[1]  
  43.  
  44.  
  45.     def map_fin(self): 
  46.  
  47.         labels = self.data[:,-1]; X=self.data[:,0:-1]#解析样本数据 
  48.  
  49.         if self.w == 0: self.w = [0.001]*shape(X)[1] #初始化W 
  50.  
  51.         for index in self.dataList: 
  52.  
  53.             p = mat(self.w)*X[index,:].T #分类该样本  
  54.  
  55.             if labels[index]*p < 1.0: 
  56.  
  57.                 yield (1, ['u', index])#这是错分样本id,记录该样本的id  
  58.  
  59.         yield (1, ['w', self.w]) #map输出该worker的w 
  60.  
  61.         yield (1, ['t', self.t]) 
  62.  
  63.  
  64.     def reduce(self, _, packedVals): 
  65.  
  66.         for valArr in packedVals: #解析数据,错分样本ID,W,迭代次数 
  67.  
  68.             if valArr[0]=='u': self.dataList.append(valArr[1]) 
  69.  
  70.             elif valArr[0]=='w': self.w = valArr[1] 
  71.  
  72.             elif valArr[0]=='t': self.t = valArr[1]  
  73.  
  74.         labels = self.data[:,-1]; X=self.data[:,0:-1] 
  75.  
  76.         wMat = mat(self.w); wDelta = mat(zeros(len(self.w))) 
  77.  
  78.         for index in self.dataList: 
  79.  
  80.             wDelta += float(labels[index])*X[index,:] #更新W 
  81.  
  82.         eta = 1.0/(2.0*self.t) #更新学习速率 
  83.  
  84.         #累加对W的更新 
  85.  
  86.         wMat = (1.0 - 1.0/self.t)*wMat + (eta/self.k)*wDelta 
  87.  
  88.         for mapperNum in range(1,self.numMappers+1): 
  89.  
  90.             yield (mapperNum, ['w', wMat.tolist()[0] ]) 
  91.  
  92.             if self.t < self.options.iterations: 
  93.  
  94.                 yield (mapperNum, ['t', self.t+1]) 
  95.  
  96.                 for j in range(self.k/self.numMappers): 
  97.  
  98.                     yield (mapperNum, ['x', random.randint(shape(self.data)[0]) ]) 
  99.  
  100.          
  101.     def steps(self): 
  102.  
  103.         return ([self.mr(mapper=self.map, reducer=self.reduce,  
  104.  
  105.                          mapper_final=self.map_fin)]*self.options.iterations) 
责任编辑:彭凡 来源: YYGamer
相关推荐

2010-06-03 16:46:23

Hadoop Map-

2015-01-08 14:52:29

google云计算分布式计算框架

2024-01-10 08:47:48

Python函数Map()

2023-01-03 13:30:14

C++代码map

2009-07-03 19:58:51

SQL Server2

2014-03-17 15:28:48

MapReduce

2012-08-09 09:57:54

K-means

2017-05-26 08:53:27

数据挖掘算法

2011-01-26 09:14:43

数据挖掘

2009-08-05 10:00:04

数据挖掘算法SQL Server

2015-09-21 09:20:55

2021-03-22 06:28:44

reducemap函数

2016-01-29 11:00:55

数据挖掘算法大数据

2014-07-16 16:54:38

2009-04-13 10:15:24

SQLServer 2005数据挖掘

2012-08-28 09:15:33

Hadoop海量数据挖掘算法

2020-06-03 15:35:10

数据挖掘算法大数据

2013-02-25 09:46:35

数据挖掘算法ICDM

2016-08-18 01:26:22

数据挖掘

2021-03-05 07:45:59

JSreducemap
点赞
收藏

51CTO技术栈公众号