SparkMllib之K-Means聚类算法案例

SparkMllib之K-Means聚类算法案例

一、SparkMLlib实现K-Means


MLlib的KMeans聚类模型采用KMeans算法来计算聚类中心点。MLlib实现KMeans聚类算法:首先随机生成聚类中心点,支持随机选择样本点当作初始中心点,还支持k-means++方法选择最优的聚类中心点。然后迭代计算样本的中心点,迭代计算中心点的分布式实现是:首先计算每个样本属于哪个中心点,之后采用聚合函数统计属于每个中心点的样本值之和以及样本数量,最后求得最新中心点,并且判断中心点是否发生改变。
MLlib的KMeans聚类模型的runs参数可以设置并行计算聚类中心的数量,runs代表同时计算多组聚类中心点,最后取计算结果最好的那一组中心点作为聚类中心点。

二、案例实现


  1. 测试数据格式
    在这里插入图片描述
  2. 测试数据下载:测试数据下载
  3. 具体代码如下:
    package com.spark.ml
    
    import org.apache.log4j.{Level, Logger}
    import org.apache.spark.mllib.clustering._
    import org.apache.spark.mllib.linalg.Vectors
    import org.apache.spark.{SparkConf, SparkContext}
    
    
    object KMeansDemo {
      def main(args: Array[String]) {
        //1 构建Spark对象
        val conf = new SparkConf().setAppName("KMeans").setMaster("local[2]")
        val sc = new SparkContext(conf)
        Logger.getRootLogger.setLevel(Level.WARN)
    
        // 读取样本数据1,格式为LIBSVM format
        val data = sc.textFile("testdatas/sample_kmeans_data.data")
        //预测处理 RDD[Vector[Double]]
        val parsedData = data.map(s => Vectors.dense(s.split('\t').map(_.toDouble))).cache()
    
        // 新建KMeans聚类模型,并训练
        val initMode = "k-means||"
        val numClusters = 4
        val numIterations = 100
    
        val model = new KMeans().
          setInitializationMode(initMode).
          setK(numClusters).
          setMaxIterations(numIterations).
          run(parsedData)
    
        val centers = model.clusterCenters
        println("centers")
    
        for (i <- 0 to centers.length - 1) {
          println(centers(i)(0) + "\t" + centers(i)(1))
        }
    
        // 误差计算
        val WSSSE = model.computeCost(parsedData)
        println("Within Set Sum of Squared Errors = " + WSSSE)
    
        //保存模型
        val ModelPath = "trans-model/KMeans_Model3"
        model.save(sc, ModelPath)
        val sameModel = KMeansModel.load(sc, ModelPath)
        println(sameModel.clusterCenters)
      }
    }
    
    
  • 1
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
K-means 算法是一种无监督学习算法,用于将数据集分成 K 个簇。Spark MLlib 实现K-means 算法,可以用于大规模数据的聚类。 以下是 Spark MLlib 实现 K-means 算法的基本步骤: 1. 加载数据集,将数据集转换为特征向量 2. 初始化 K 个簇的质心 3. 对每个样本,将其分配到距离最近的簇 4. 根据分配结果,重新计算每个簇的质心 5. 重复步骤 3 和 4,直到达到最大迭代次数或收敛 以下是一个简单的代码示例: ```python from pyspark.ml.clustering import KMeans from pyspark.ml.evaluation import ClusteringEvaluator from pyspark.ml.feature import VectorAssembler # 加载数据集 data = spark.read.format("csv").load("path/to/data.csv", header=True, inferSchema=True) # 转换数据集为特征向量 assembler = VectorAssembler(inputCols=data.columns, outputCol="features") dataset = assembler.transform(data) # 初始化 KMeans 模型 kmeans = KMeans().setK(2).setSeed(1) # 训练模型 model = kmeans.fit(dataset) # 输出簇心点 centers = model.clusterCenters() for center in centers: print(center) # 预测数据集每个样本所属的簇 predictions = model.transform(dataset) # 评估模型 evaluator = ClusteringEvaluator() silhouette = evaluator.evaluate(predictions) print("Silhouette with squared euclidean distance = " + str(silhouette)) ``` 这里假设数据集已经被加载并且包含两个特征。首先,使用 VectorAssembler 将数据集转换为特征向量。然后,初始化 KMeans 模型并训练它。最后,输出每个簇的心点和模型评估结果。需要注意的是,这里使用了默认的欧几里得距离作为距离度量。如果需要使用其他距离度量,可以通过设置 distanceMeasure 参数来实现

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

若兰幽竹

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值