K-均值聚类(k-means)算法

1、准备数据

0.0 0.0 0.0
0.1 0.1 0.1
0.2 0.2 0.2
9.0 9.0 9.0
9.1 9.1 9.1
9.2 9.2 9.2

2、python算法

import numpy as np    
import matplotlib.pyplot as plt  
from sklearn.cluster import KMeans
from sklearn import metrics  #导入sklearn效果评估模块

raw_data=np.loadtxt("../../data.txt")

X_test=raw_data[5:6,:]
X=raw_data[:,:] 

#训练聚类模型
n_clusters=2  #设置聚类数量
model_kmeans=KMeans(n_clusters=n_clusters,random_state=0)  #建立聚类模型对象
model_kmeans.fit(X)            #训练聚类模型
y_pre=model_kmeans.predict(X_test)  #预测聚类模型
y_true=y_pre #此处应给出真实值,因为数据样本未提供,先给出预测值为真实值

#模型效果评估
n_samples,n_features=X.shape     #总样本量,总特征数
inertias=model_kmeans.inertia_   #样本距离最近的聚类中心的总和
adjusted_rand_s=metrics.adjusted_rand_score(y_true, y_pre)     #调整后的兰德指数、此处第一个值应为
homogeneity_s=metrics.homogeneity_score(y_true,y_pre)               #同质化得分



#模型效果可视化
centers=model_kmeans.cluster_centers_  #各类别中心
colors=['#4EACC5','#FF9C34','#4E9A06']   #设置不同类别的颜色
plt.figure()    #建立画布
for i in range(n_clusters):    #循环读取类别
    index_sets=np.where(y_pre==i)  #找到相同类的索引集合、
    cluster=X[index_sets]   #将相同类的数据划分为一个聚类子集
    plt.scatter(cluster[:,0],cluster[:,1],c=colors[i],marker='.')   #展示聚类子集内的样本点
    plt.plot(centers[i][0],centers[i][1],'o',markerfacecolor=colors[i],markeredgecolor='k',markersize=4) #展示各聚类子集的中心
plt.show()

3、spark算法

package com.sunbin


import org.apache.spark.{SparkConf, SparkContext}
import org.apache.spark.mllib.clustering.{KMeans, KMeansModel}
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.sql.SparkSession
import org.apache.log4j.{ Level, Logger }


/**
  * 聚合算法kmeans
  *
  */
object KMeansdemo {

  def main(args: Array[String]): Unit = {
  Logger.getRootLogger.setLevel(Level.WARN)

    //创建SparkContext
    val conf = new SparkConf().setMaster("local[4]").setAppName("KMeans")
    val sc = new SparkContext(conf)

    //加载数据
    val path = "data.txt"
    val data = sc.textFile(path)
    val parsedData = data.map(s => Vectors.dense(s.split(' ').map(_.toDouble))).cache()

    //通过KMeans将数据分成两个阵营
    val numClusters = 2
    val numIterations = 20
    val clusters = KMeans.train(parsedData, numClusters, numIterations)

    //输出当前的聚类中心
    clusters.clusterCenters.foreach(println _)

    val index = clusters.predict(Vectors.dense(Array(8.9,7.2,9.0)))
    println(s"Vector[8.9, 7.2, 9.0] 属于聚类索引为:${index} 中心坐标为:${clusters.clusterCenters(index)} 的簇")

    //计算误差平方和
    val WSSSE = clusters.computeCost(parsedData)
    println("误差平方和 = " + WSSSE)

    
    // 保存模型
//    clusters.save(sc, "target/KMeansModel")
//    val sameModel = KMeansModel.load(sc, "target/KMeansModel")

    sc.stop()

  }
}

相关推荐