元のアルゴリズムに並列戦略を適用するのは難しいため、他のアルゴリズムのバリアントである pegasos が並列化に適しています。以下は、アルゴリズムのプロセスです。 W=0 に初期化(ベクトル形式) i が t の場合: K個のサンプルをランダムに選択する Kのjの場合: j番目のサンプルが誤分類された場合 このサンプルを使用して重みを更新します Wのアップデートを蓄積する 終了 以下はmrjobに基づくマップ削減バージョンです。 - クラスMRsvm(MRJob):
-
- DEFAULT_INPUT_PROTOCOL = 'json_value'
-
- #パラメータの設定
-
- def __init__(self, *args, **kwargs):
-
- super(MRsvm, self).__init__(*args, **kwargs)
-
- self.data = pickle.load(open( 'data_path' ))を実行します。
-
- 自己.w = 0
-
- self.eta = 0.69 #学習率
-
- self.dataList = [] # サンプル収集に使用するリスト
-
- self.k = self.options.batchsize
-
- 自己.numMappers = 1
-
- self.t = 1 # 反復回数
-
-
- def map(self, mapperId, inVals):
-
- #<キー、値> は <マシン マッパー ID、W 値、またはサンプル機能とラベル> に対応します。
-
- Falseの場合: 譲歩
-
- #値がWに属するかサンプルIDに属するかを判断する
-
- inVals[0]== 'w'の場合:
-
- 自己.w = inVals[1]
-
- inVals[0]== 'x'の場合:
-
- 自己.データリスト.追加(inVals[1])
-
- inVals[0]== 't'の場合: self.t = inVals[1]
-
-
- def map_fin(self):
-
- labels = self.data[:,-1]; X=self.data[:,0:-1]#サンプルデータの分析
-
- self.w == 0の場合: self.w = [0.001]*shape(X)[1] # Wを初期化
-
- self.dataListのインデックス:
-
- p = mat(self.w)*X[index,:].T #サンプルを分類する
-
- ラベル[インデックス]*p < 1.0の場合:
-
- yield (1, [ 'u' , index])#これは誤分類されたサンプルIDです。サンプルIDを記録します。
-
- yield (1, [ 'w' , self.w]) #map はワーカーのwを出力する
-
- 結果 (1, [ 't' , self.t])
-
-
- def Reduce(self, _, パックされた値):
-
- valArr in packedVals : #parse データ、誤分類されたサンプル ID、W、反復回数
-
- valArr[0]== 'u'の場合: self.dataList.append(valArr[1])
-
- elif valArr[0]== 'w' の場合: self.w = valArr[1]
-
- elif valArr[0]== 't' : self.t = valArr[1]
-
- ラベル = self.data[:,-1]; X=self.data[:,0:-1]
-
- wMat = mat(self.w); wDelta = mat(zeros(len(self.w)))
-
- self.dataListのインデックス:
-
- wDelta += float (labels[index])*X[index,:] #Wを更新
-
- eta = 1.0/(2.0*self.t) #学習率を更新
-
- #Wへのアップデートを蓄積する
-
- wMat = (1.0 - 1.0/self.t)*wMat + (eta/self.k)*wDelta
-
- mapperNumが範囲(1、self.numMappers+1)の場合:
-
- 生成(mapperNum、[ 'w' 、wMat.tolist()[0]])
-
- self.t < self.options.iterationsの場合:
-
- 生成(mapperNum, [ 't' , self.t+1])
-
- jが範囲内(self.k/self.numMappers)の場合:
-
- 生成(mapperNum、[ 'x' 、random.randint(shape(self.data)[0])])
-
-
- defステップ(self):
-
- 戻り値([self.mr(マッパー=self.map, リデューサー=self.reduce,
-
- mapper_final = self.map_fin)] * self.options.iterations)
|