sparkml和mllib分别实现KMeans算法

本文提供了使用 Spark ML 和 MLLib 实现 KMeans 聚类算法的示例代码,展示了如何加载数据、预处理数据并进行聚类分析。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

正如大家所知道的MLLib这个算法包apache已经宣布只维护不更新了,所以大家如果做算法本人推荐使用ML的算法包。
原理的话本人就不在讲了,因为很多资料都写的比较清晰明白,这里我只写代码
本人在这里写了一些sparkml和mllib的示例入门程序

SparkML


import org.apache.spark.ml.clustering.{KMeans, KMeansModel}
import org.apache.spark.ml.feature.{ VectorAssembler}
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.{DoubleType,StructField, StructType}
import org.apache.spark.sql.{Row, SparkSession}
/**
  * Created by LiuWenSheng on 2017/10/11.
  */
object MyKMeans {
  def main(args: Array[String]) {

    val sparkSession = SparkSession.builder().appName("mykmeans").master("local[2]").getOrCreate()
    //本例使用的数据集为鸢尾花数据集,大家可以自行网上下载。
    val rawData: RDD[String] = sparkSession.sparkContext.textFile("D:/testData/fun.txt")
    //转换数据格式
    val data = rawData.map(_.split(",")).map(x=>
      Row(x(0).toDouble,x(1).toDouble,x(2).toDouble,x(3).toDouble)
    )
      //创建StructType格式
    val struct: StructType = StructType(
        StructField("f1",DoubleType,false)::
        StructField("f2",DoubleType,false)::
        StructField("f3",DoubleType,false)::
        StructField("f4",DoubleType,false)::Nil)
    //创建DataFrame
    val df = sparkSession.createDataFrame(data,struct)

    //把f1~f4转化为向量集合
    val vectorAssembler = new VectorAssembler()
      .setInputCols(Array("f1","f2","f3","f4"))
      .setOutputCol("features")



    val kms = new KMeans()
      .setPredictionCol("predictionCol")
      .setFeaturesCol("features")
      .setMaxIter(66)
      .setK(4)


    val a = vectorAssembler.transform(df)
    val model: KMeansModel = kms.fit(a)

    model.transform(a).show(100)
    val wssse = model.computeCost(a)
    println("wssse is :"+wssse)
    //计算聚类的中心点
    model.clusterCenters.foreach(println)


/**                    如果想要使用pipeline的话代码如下            **/
//    val pipeLine: Pipeline = new Pipeline().setStages(Array(vectorAssembler,model))
//    val res: PipelineModel = pipeLine.fit(df)
//    val b: DataFrame = res.transform(df)
//    b.show(130)

  }
}

结果如下所示:

+---+---+---+---+-----------------+-------------+
| f1| f2| f3| f4|         features|predictionCol|
+---+---+---+---+-----------------+-------------+
|5.1|3.5|1.4|0.2|[5.1,3.5,1.4,0.2]|            3|
|4.9|3.0|1.4|0.2|[4.9,3.0,1.4,0.2]|            0|
|4.7|3.2|1.3|0.2|[4.7,3.2,1.3,0.2]|            0|
|4.6|3.1|1.5|0.2|[4.6,3.1,1.5,0.2]|            0|
|5.0|3.6|1.4|0.2|[5.0,3.6,1.4,0.2]|            3|
|5.4|3.9|1.7|0.4|[5.4,3.9,1.7,0.4]|            3|
|4.6|3.4|1.4|0.3|[4.6,3.4,1.4,0.3]|            0|
|5.0|3.4|1.5|0.2|[5.0,3.4,1.5,0.2]|            0|
|4.4|2.9|1.4|0.2|[4.4,2.9,1.4,0.2]|            0|
|4.9|3.1|1.5|0.1|[4.9,3.1,1.5,0.1]|            0|
+---+---+---+---+-----------------+-------------+
only showing top 10 rows


wssse is :71.34822351828443
[4.725,3.1333333333333333,1.4208333333333334,0.19166666666666676]
[5.883606557377049,2.740983606557377,4.388524590163936,1.4344262295081964]
[6.8538461538461535,3.076923076923076,5.715384615384614,2.053846153846153]
[5.265384615384616,3.6807692307692306,1.503846153846154,0.2923076923076923]

SparkMLLib实现KMeans

import org.apache.spark.mllib.clustering.KMeans
import org.apache.spark.mllib.linalg.{Vector, Vectors}
import org.apache.spark.rdd.RDD
import org.apache.spark.{SparkConf, SparkContext}

/**
  * Created by LiuWenSheng on 2017/10/16.
  */
object MLLib_KMeans {
  def main(args: Array[String]) {
    val conf = new SparkConf().setMaster("local[2]").setAppName("mllibKMeans")
    val sc = new SparkContext(conf)
    val data = sc.textFile("D:/testData/fun.txt")
    //制作vetors向量的RDD用于计算
    val parseTrainData: RDD[Vector] = data.map { line =>
      Vectors.dense(line.split(",").take(4).map(_.toDouble))
    }

    val numIterators = 66//迭代次数
    val numClusters = 3 //聚的的类的种树
    val runs = 3 //运行次数选出最优解
    //开始训练
    val model = KMeans.train(parseTrainData,numClusters,numIterators,runs)

    parseTrainData.map(x=>(x.toString+"is belongs to")+model.predict(x)).collect().foreach(println(_))
    //计算cost (点到最近的中心平方之和)
    val wssse = model.computeCost(parseTrainData)
    println("wssse is:" + wssse)
    //计算中心点

    model.clusterCenters.foreach(println(_))
    println(model.predict(Vectors.dense(6.6,2.9,4.5,1.2)))
   }
}

结果如下所示:

[5.1,3.5,1.4,0.2]is belongs to0
[4.9,3.0,1.4,0.2]is belongs to0
[4.7,3.2,1.3,0.2]is belongs to0
[4.6,3.1,1.5,0.2]is belongs to0
[5.0,3.6,1.4,0.2]is belongs to0
[5.4,3.9,1.7,0.4]is belongs to0
[4.6,3.4,1.4,0.3]is belongs to0
[5.0,3.4,1.5,0.2]is belongs to0
[4.4,2.9,1.4,0.2]is belongs to0
[4.9,3.1,1.5,0.1]is belongs to0
[5.4,3.7,1.5,0.2]is belongs to0
[4.8,3.4,1.6,0.2]is belongs to0
[4.8,3.0,1.4,0.1]is belongs to0
[4.3,3.0,1.1,0.1]is belongs to0
[5.8,4.0,1.2,0.2]is belongs to0
[5.7,4.4,1.5,0.4]is belongs to0
[5.4,3.9,1.3,0.4]is belongs to0

only show a few

wssse is:78.94506582597703
[5.005999999999999,3.4180000000000006,1.4640000000000002,0.2439999999999999]
[6.8538461538461535,3.076923076923076,5.715384615384614,2.053846153846153]
[5.883606557377049,2.740983606557377,4.388524590163936,1.4344262295081964]
2
Spark MLlibApache Spark的机器学习库,提供了许多常见的机器学习算法实现。其中,KMeans聚类是一种常见的无监督机器学习算法,可以用于将数据点分成不同的簇。 下面是使用Spark MLlib实现KMeans聚类的代码示例: ```python from pyspark.ml.clustering import KMeans from pyspark.ml.evaluation import ClusteringEvaluator # 加载数据集,这里假设数据集已经被读取为一个DataFrame对象,其中特征向量存储在一个名为“features”的列中 dataset = ... # 设置KMeans算法的超参数 k = 2 # 簇的个数 maxIter = 10 # 最大迭代次数 # 定义KMeans算法模型 kmeans = KMeans().setK(k).setMaxIter(maxIter) # 训练模型 model = kmeans.fit(dataset) # 使用模型对数据进行预测 predictions = model.transform(dataset) # 评估聚类效果 evaluator = ClusteringEvaluator() silhouette = evaluator.evaluate(predictions) print("Silhouette with squared euclidean distance = " + str(silhouette)) # 输出每个簇的中心点 centers = model.clusterCenters() for center in centers: print(center) ``` 在上面的代码中,我们首先加载了一个数据集,然后设置了KMeans算法的超参数,接着定义了KMeans算法模型并训练了模型。最后,我们使用模型对数据进行了预测,并使用评估器计算了聚类效果。在输出中,我们还打印了每个簇的中心点。 需要注意的是,上面的代码中使用的是PySpark API,如果你使用的是Scala或Java,代码会略有不同,但基本思路是一样的。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

偷偷放晴的天空

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

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

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

打赏作者

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

抵扣说明:

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

余额充值