和之前讲的两个算法不一样
非监督型类型
检测所有数据的中心来,为源来聚合。但没有一个结果,结果不固定
package com.mllib import org.apache.spark.mllib.clustering.KMeans import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.sql.SparkSession /*** * 共享单车记录数据 */ object ClusteringDemo { def main(args: Array[String]): Unit = { //读取数据 val spark = SparkSession.builder() .appName("happiness") .master("local") .getOrCreate() spark.sparkContext.setLogLevel("ERROR")//减少日志信息 val data = spark.read.option("header","true") .csv("data/sharing _bicycles.csv") .rdd //通过经度纬度计算 当前共享单车停放位置 //获取特征 val addressFeature = data.map( line => { //转换成向量 //通过数组转换成向量的 Vectors.dense(Array[Double](line.getString(5).toDouble,line.getString(6).toDouble)) } ) //划分训练集和测试集 val Array(tranData,testData) = addressFeature.randomSplit(Array(0.8,0.2)) //获取模型 val kmean = new KMeans() .setK(10)//分成10堆 .setMaxIterations(40)//设置最大迭代次数 .setEpsilon(1.0e-6)//每个元素的最大距离 //开始训练 val model = kmean.run(tranData) //开始使用 val result = testData.map( line => { //预测 val cluster = model.predict(line) val centers = model.clusterCenters(cluster) (line,centers,cluster) } ) result.take(10).foreach(println) //检测测模型 WCSS 簇内方差和 最小越好 println(model.computeCost(testData)) } }