机器学习_kmeans算法

版权声明:该版权归博主个人所有,在非商用的前提下可自由使用,转载请注明出处. https://blog.csdn.net/qq_24696571/article/details/89009650
  • kmeans算法用于聚类,给事物打标签,例如音乐分为纯音乐,古典音乐,流行音乐…
  • 我们甚至可能不知道我们要怎么分类,分什么类, 通过数据训练模型自动得出,所以kmeans算法用于知识发现而不是预测.
  • 聚类是一种无监督(没有因变量)的机器学习任务.
  • 数据与数据划分之后的量化距离表示数据之间的相似度,数据与中心点的距离来划分分类.
  • 距离测度方式:
    • 欧式距离测度
    • 平方欧式距离测度
    • 曼哈顿距离测度
    • 余弦距离测度
    • 谷本距离测度
    • 加权距离测度
  • 选择适当的聚类数
    • 肘部法
  • 聚类的原则
    • 类的成员之间越相似越好
    • 类之间的成员差异越大越好
  • kmeans算法的思想:以空间中K个点为中心进行聚类,对最靠近他们的对象归类,通过迭代方法,逐渐更新各个聚类中心的值,来直到得到最好的聚类结果.
  • 缺陷: 1.聚类中心个数k要事先给定,但是k值的选定很难估计.大部分时候,在事先不知道数据应该分多少类才最合适. 2.kmeans需要认为确定初始时的聚类中心 , 不同的初始聚类中心可能会导致完全不同的聚类结果.

案例

1️⃣数据样式:
在这里插入图片描述
2️⃣代码:

package com.spark

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

object KMeans {

    def main(args: Array[String]) {
        //1 构建Spark对象
        val conf = new SparkConf().setAppName("KMeans").setMaster("local")
        val sc = new SparkContext(conf)

        // 读取样本数据1,格式为LIBSVM format
        val data = sc.textFile("F:\\code02\\sparkLearn\\src\\kmeans_data.txt")
        // 数据切分后向量化成三维数据
        val parsedData: RDD[linalg.Vector] = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()

        // 聚类个数
        val numClusters = 4
        // 迭代次数
        val numIterations = 100
        // 创建kmeans对象
        val model: KMeansModel = new KMeans().
            //设置聚类个数
            setK(numClusters).
            //设置最大迭代次数
            setMaxIterations(numIterations).
            //数据导入运行 , 无监督没有因变量, 也不必测试集
            run(parsedData)
        val centers: Array[linalg.Vector] = model.clusterCenters
        println("centers")
        for (i <- 0 to centers.length - 1) {
            //打印聚类中心
            println(centers(i)(0) + "\t" + centers(i)(1) + "\t" + centers(i)(2))
        }

        // 计算误差 并打印
        val WSSSE = model.computeCost(parsedData)
        println("Errors = " + WSSSE)

        //预测
        println(model.predict(Vectors.dense(10, 10, 10)))

        //保存模型
        //    val ModelPath = "KMeans_Model"
        //    model.save(sc, ModelPath)
        //    val sameModel = KMeansModel.load(sc, ModelPath)
    }
}

猜你喜欢

转载自blog.csdn.net/qq_24696571/article/details/89009650