和之前讲的两个算法不一样
非监督型类型
检测所有数据的中心来,为源来聚合。但没有一个结果,结果不固定
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))
}
}