如何使用并行化加速感知器的内核化?

时间:2013-07-18 09:54:07

标签: python numpy parallel-processing

我正在处理某种庞大的数据集,我需要使用内核化的感知器进行二进制分类。我正在使用此源代码:https://gist.github.com/mblondel/656147

这里有3个可以进行并行化的事情,1)内核计算,2)更新规则3)投影部分。另外我做了一些其他的加速,如计算内核的三角形部分然后使其成为完全对称矩阵:

 K = np.zeros((n_samples, n_samples))
        for index in itertools.combinations_with_replacement(range(n_samples),2):
            K[index] = self.kernel(X[ index[0] ],X[ index[1] ],self.gamma)      
        #make the full KERNEL
        K = K + np.triu(K,1).T

我还将投影部分并列化:

   def parallel_project(self,X):
        """ Function to parallelizing prediction"""    
        y_predict=np.zeros(self.nOfWorkers,"object")

        pool=mp.Pool(processes=self.nOfWorkers)
        results=[pool.apply_async(prediction_worker,args=(self.alpha,self.sv_y,self.sv,self.kernel,(parts,))) for parts in np.array_split(X,self.nOfWorkers)]
        pool.close()
        pool.join()
        i=0

        for r in results:
            y_predict[i]=r.get()
            i+=1
        return np.hstack(y_predict) 

和工人:

def prediction_worker(alpha,sv_y,sv,kernel,samples):
    """ WORKER FOR PARALELIZING PREDICTION PART"""
    print "starting:" , mp.current_process().name
    X= samples[0]
    y_predict=np.zeros(len(X))
    for i in range(len(X)):
        s = 0
        for a1, sv_y1, sv1 in zip(alpha, sv_y, sv):
            s += a1 * sv_y1 * kernel(X[i], sv1)
        y_predict[i]=s  
    return y_predict.flatten()

但代码太慢了。所以你能否给我任何有关参数化或任何其他加速的提示?

备注: 请证明一般解决方案,我不是在处理定制内核函数。

谢谢

1 个答案:

答案 0 :(得分:1)

这里应该可以让你立即加速。 Mathieu示例代码中的内核采用单个样本,但随后使用它们计算完整的Gram矩阵:

K = np.zeros((n_samples, n_samples))
for i in range(n_samples):
    for j in range(n_samples):
        K[i,j] = self.kernel(X[i], X[j])

这很慢,可以通过向量化内核函数来避免:

def linear_kernel(X, Y):
    return np.dot(X, Y.T)
def polynomial_kernel(X, Y, p=3):
    return (1 + np.dot(X, Y.T)) ** p
# the Gaussian RBF kernel is a bit trickier

现在Gram矩阵可以计算为

K = kernel(X, X)

project函数应相应更改以加快速度。