利用Spark MLlib实现Kmeans算法实例(Python)

聚类 - spark.mllib

聚类是一种无监督的学习问题,我们的目标是根据一些相似的概念将实体的子集相互分组。聚类通常用于探索性分析和/或作为分层 监督学习管线(其中针对每个群集训练不同的分类器或回归模型)的组成部分。

该spark.mllib软件包支持以下模型:
K-means
Gaussian mixture
Power iteration clustering (PIC)
Latent Dirichlet allocation (LDA)
Bisecting k-means
Streaming k-means

K-means

K-means是最常用的聚类算法之一,可将数据点聚类到预定义数量的聚类中。该spark.mllib实现包含称为kmeans的k-means++方法的并行变体。
实现中有以下参数:spark.mllib
k是期望的簇的数量。
maxIterations是要运行的最大迭代次数。
initializationModel指定随机初始化或通过k-means 进行初始化。
runs是运行k-means算法的次数(k-means不能保证找到全局最优解,并且在给定数据集上运行多次时,算法返回最佳聚类结果)。
initializationSteps确定k-means算法中的步数。
epsilon决定了我们认为k-means已经收敛的距离阈值。
initialModel是用于初始化的一组可选集群中心。如果提供此参数,则只执行一次运行。

from __future__ import print_function

import sys

import numpy as np
from pyspark.sql import SparkSession


def parseVector(line):
    return np.array([float(x) for x in line.split(',')])


def closestPoint(p, centers):
    bestIndex = 0
    closest = float("+inf")
    for i in range(len(centers)):
        tempDist = np.sum((p - centers[i]) ** 2)
        if tempDist < closest:
            closest = tempDist
            bestIndex = i
    return bestIndex


if __name__ == "__main__":

#    if len(sys.argv) != 4:
#        print("Usage: kmeans <file> <k> <convergeDist>", file=sys.stderr)
#        exit(-1)

    print("""WARN: This is a naive implementation of KMeans Clustering and is given
       as an example! Please refer to examples/src/main/python/ml/kmeans_example.py for an
       example on how to use ML's KMeans implementation.""", file=sys.stderr)

    spark = SparkSession\
        .builder\
        .appName("PythonKMeans")\
        .getOrCreate()
    inputFile = "hdfs://node1:8020/mv_training/training_set.txt"

    lines = spark.read.text(inputFile).rdd
    #lines = spark.read.text(sys.argv[1]).rdd.map(lambda r: r[0])
    #data = lines.map(parseVector).cache()
    data = lines.map(lambda row: row.value.split(","))
    #temp = data
    K = int(sys.argv[2])
    convergeDist = float(sys.argv[3])

    kPoints = data.takeSample(False, K, 1)
    tempDist = 1.0

    while tempDist > convergeDist:
        closest = data.map(
            lambda p: (closestPoint(p, kPoints), (p, 1)))
        pointStats = closest.reduceByKey(
            lambda p1_c1, p2_c2: (p1_c1[0] + p2_c2[0], p1_c1[1] + p2_c2[1]))
        newPoints = pointStats.map(
            lambda st: (st[0], st[1][0] / st[1][1])).collect()

        tempDist = sum(np.sum((kPoints[iK] - p) ** 2) for (iK, p) in newPoints)

        for (iK, p) in newPoints:
            kPoints[iK] = p

    print("Final centers: " + str(kPoints))
    closest = data.map(lambda p: (p,closestPoint(np.array(p).astype(int) , np.array(kPoints).astype(int))))
    closest.repartition(1).saveAsTextFile("file:///root/kmeans_result")

最后得到的中心点是kPoints,closest为保存各行数据所属类别后的结果,并保存到文件中。
官网链接:Clustering - spark.mllib

  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值