今天,我也这么问我。多处理模块提供了一个线程池,它为您生成一些线程,从而并行运行作业。首先实例化函数,然后创建池,然后在要迭代的范围内 map它。
在我的例子中,我计算了不同中心数的WSSSE数(超参数调整),以得到一个“好的”k均值聚类…就像MLSPARK文档中概述的那样。无需进一步 explain,以下是我的IPython job表中的一些单元格:
from pyspark.mllib.clustering import KMeans
import numpy as np
C_点是12维阵列:
>>> c_points.cache()
>>> c_points.take(3)
[array([ 1, -1, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]),
array([-2, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0]),
array([ 7, -1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0])]
在下面的内容中,对于每一个我正在计算这个wssse值并将其作为元组返回:
def error(point, clusters):
center = clusters.centers[clusters.predict(point)]
return np.linalg.norm(point - center)
def calc_wssse(i):
clusters = KMeans.train(c_points, i, maxIterations=20,
runs=20, initializationMode="random")
WSSSE = c_points
.map(lambda point: error(point, clusters))
.reduce(lambda x, y: x + y)
return (i, WSSSE)
以下是有趣的部分:
from multiprocessing.pool import ThreadPool
tpool = ThreadPool(processes=4)
运行它:
wssse_points = tpool.map(calc_wssse, range(1, 30))
wssse_points
给予:
[(1, 195318509740785.66),
(2, 77539612257334.33),
(3, 78254073754531.1),
...
]