代码之家  ›  专栏  ›  技术社区  ›  plalanne

创建到中心距离的柱

  •  1
  • plalanne  · 技术社区  · 7 年前

    我正在运行 Kmeans 具有的算法 pyspark 。输入为 Vector 长度为20(输出 word2vec 在文本上 verbatims )。然后转换输入 dataframe 获取与每个 verbatim

    from pyspark.ml.clustering import KMeans
    
    n_centres = 14
    kmeans = KMeans().setK(n_centres).setSeed(1)
    model = kmeans.fit(df)
    df_pred = model.transform(df)
    

    我有以下结果:

    df_pred.show()
    
    +--------------------+----------+
    |            features|prediction|
    +--------------------+----------+
    |[-0.1879145856946...|        13|
    |[-0.4428333640098...|         6|
    |[0.00466226078569...|         9|
    |[0.09467326601346...|        12|
    |[-0.0388545106080...|         5|
    |[-0.1805213503539...|        13|
    |[0.08455141757925...|         3|
    +--------------------+----------+
    

    我想在我的数据框中添加一列,其中包含要素阵列与其关联的中心之间的距离。我知道我可以得到中心的坐标,我知道如何计算向量和中心之间的距离:

    model.clusterCenters()[3] # to get the coordinates of cluster number 3
    v1.squared_distance(center_vect) # euclidean distance between v1 and the center center_vect
    

    但我不知道如何将计算结果添加为列。A. udf 或a map 这似乎是一个解决方案,但我不断遇到以下错误: PicklingError: Could not serialize object...

    1 回复  |  直到 7 年前
        1
  •  2
  •   bendl    7 年前

    假设需要使用UDF是正确的。下面是一个在类似环境下如何工作的示例:

    >>> import random
    >>> from pyspark.sql.functions import udf
    >>> centers = {1: 2, 2: 3, 3: 4, 4:5, 5:6}
    >>> choices = [1, 2, 3, 4,5]
    >>> l = [(random.random(), random.choice(choices)) for i in range(10)]
    >>> df = spark.createDataFrame(df, ['features', 'prediction'])
    >>> df.show()
    +-------------------+----------+
    |           features|prediction|
    +-------------------+----------+
    | 0.4836744206538728|         3|
    |0.38698675915124414|         4|
    |0.18612684714681604|         3|
    | 0.5056159922655895|         1|
    | 0.7825023909896331|         4|
    |0.49933715239708243|         5|
    | 0.6673811293962939|         4|
    | 0.7010166164833609|         3|
    | 0.6867109795526414|         5|
    |0.21975859257732422|         3|
    +-------------------+----------+
    >>> dist = udf(lambda features, prediction: features - centers[prediction])
    >>> df.withColumn('dist', dist(df.features, df.prediction)).show()
    +-------------------+----------+-------------------+
    |           features|prediction|               dist|
    +-------------------+----------+-------------------+
    | 0.4836744206538728|         3| -3.516325579346127|
    |0.38698675915124414|         4| -4.613013240848756|
    |0.18612684714681604|         3| -3.813873152853184|
    | 0.5056159922655895|         1|-1.4943840077344106|
    | 0.7825023909896331|         4| -4.217497609010367|
    |0.49933715239708243|         5| -5.500662847602918|
    | 0.6673811293962939|         4|-4.3326188706037065|
    | 0.7010166164833609|         3| -3.298983383516639|
    | 0.6867109795526414|         5| -5.313289020447359|
    |0.21975859257732422|         3| -3.780241407422676|
    +-------------------+----------+-------------------+
    

    您可以将我创建UDF的行更改为以下内容:

    dist = udf(lambda features, prediction: features.squared_distance(model.clusterCenters()[prediction]))
    

    由于我没有实际的数据来处理,我希望这是正确的!