Spark ML算法简单了解 Kmeans

官网
http://spark.apache.org/docs/latest/mllib-clustering.html#k-means

Kmeans原理介绍

聚类介绍

聚类kmeans 算法是一个无监督学习过程。一般是用来对数据对象按照其特征属性进行分组。经常被应用在客户分群、欺诈检测、图像分析领域。K-means是最有名并且最经常使用的聚类算法

算法介绍:

KMeans算法的基本思想是初始随机给定K个簇中心,按照最邻近原则把待分类样本点分到各个簇,然后按照平均法重新计算各个簇的质心,从而确定簇心,一直迭代,直到簇心的移动距离小于某个给定的值。
K-means 算法是一个迭代式的算法,其运算过程如下:
1、 选择k个点作为初始聚类中心。(k需要我们程序自己设置)
2、 计算其余所有点到聚类中心的距离,并把每个点划分到离它最近的聚类中心所在的聚类中。最常用的衡量距离的函数式欧几里得距离,叫做欧式距离。
3、 重新计算每个聚类中所有点的平均值,并将其作为新的聚类中心点。
4、 重复2,3步的过程,直至聚类中心不再发生变化,或者算法达到预定的迭代次数(程序自己设置),又或者聚类中心的改变小于预定设定的阀值。
举个例子介绍:
Spark ML算法简单了解 Kmeans_第1张图片
从上图中,我们可以看到,A,B,C,D,E是五个在图中点。而灰色的点是我们的种子点,也就是我们用来找点群的点。有两个种子点,所以K=2。
K-Means的算法如下:
1、随机在图中取K(这里K=2)个种子点。
2、然后对图中的所有点求到这K个种子点的距离,假如点Pi离种子点Si最近,那么Pi属于Si点群。(上图中,我们可以看到A,B属于上面的种子点,C,D,E属于下面中部的种子点)
3、接下来,我们要移动种子点到属于他的“点群”的中心。(见图上的第三步)
4、然后重复第2)和第3)步,直到,种子点没有移动(我们可以看到图中的第四步上面的种子点聚合了A, B,C,下面的种子点聚合了D,E)。

KMeans 两个重要问题

1、 选择K值
K 的选择是 K-means 算法的关键,Spark MLlib 在 KMeansModel 类里提供了 computeCost 方法,该方法通过计算所有数据点到其最近的中心点的平方和来评估聚类的效果。一般来说,同样的迭代次数和算法跑的次数,这个值越小代表聚类的效果越好。但是在实际情况下,我们还要考虑到聚类结果的可解释性,不能一味的选择使 computeCost 结果值最小的那个 K。

2、 初始聚类中心点的选择
对于初始化聚类中心点,我们可以在输入的数据集中随机地选择K个点作为中心点,但是随机选择初始中心点可能会造成聚类的结果和数据的实际分布相差很大。所以我们一般选择k-means++算法去初始化中心点。
k-means++算法选择初始中心点的基本思想就是:初始的聚类中心之间的相互距离要尽可能远。
1、 从输入的数据点集合中随机选择一个点作为第一个初始点。
2、 计算数据集中所有点与最新选择的中心点的距离D(x).
3、 选择下一个中心点,使得 最大。
4、 重复2,3步过程,直到K个初始点选择完成。

数据源 dataFrametext

131648,东华工程塑料有限公司,1,沙特 基础  pc fxe183889  美国  ge
131648,东华工程钢厂有限公司,1,阳江 基础  pc fxe183889  美国  ge
131345,西单工程塑料有限公司,1,伊朗 fuck  pe fxe183889  日本  ne
5658841,大中华区销售手机公司,1,以色列 who ci jfdkfj88  东欧   ji
4232341,abc区杀人如芒公司,1,墨西哥 why ci jfdkfj88  荷兰   ja
5634341,dfd区破风一波,1,大朗 why ci 3jjfjslf  加拿大   j3
131666,上海上坡佳园有限公司,1,泉州 进口 进口 2a12 无缝 铝管
131667,上海上坡佳园有限公司,1,浙江 进口 进口 3a12 光亮 特价
131668,上海上坡佳园有限公司,1,东莞 进口 进口 2a10 光亮 特价
package com.scala.sparkML
import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.ml.feature.{HashingTF, IDF, Tokenizer}
import org.apache.spark.sql.SparkSession
object KmeansTest {
    case class  Product(id:String,companyName:String,direction:String,productInfo:String)
    def main(args: Array[String]): Unit = {
        val spark = SparkSession
            .builder()
            .appName("TFIDF@2")
            .master("local")
            //.config("spark.sql.warehouse.dir", "C:\\Users\\Administrator\\Desktop\\spark-warehouse")
            .getOrCreate()

        // 导入spark的隐式转换
        import spark.implicits._
        val products = spark.sparkContext.textFile("dataFrametext").map { x =>
            val data = x.split(",")
            Product(data(0),data(1),data(2),data(3))
        }.toDS().cache()
        //将productinfo数据  去掉空格分开存储
        val productData = new Tokenizer().setInputCol("productInfo").setOutputCol("productWords").transform(products)
        //计算hashingtf
        val tfData = new HashingTF().setNumFeatures(20).setInputCol("productWords").setOutputCol("productFeatures").transform(productData)
        //idfModel计算
        val idfModel = new IDF().setInputCol("productFeatures").setOutputCol("features").fit(tfData)
        val idfData = idfModel.transform(tfData)
        val trainingData = idfData.select("id","companyname","features")

        val kmeans=new KMeans()
            .setK(4)
            .setMaxIter(5)//最大迭代次数
            .setFeaturesCol("features")
            .setPredictionCol("prediction")
        val kmeansModel = kmeans.fit(trainingData)
        //save操作
        val kmeansData = kmeansModel.transform(trainingData)
        kmeansData.show()
    }

}

Spark ML算法简单了解 Kmeans_第2张图片

你可能感兴趣的:(spark)