通过K-means对iris数据集进行处理 Kmeans聚类算法实例

Python

from sklearn import datasets
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans

# 加载数据集,是一个字典类似Java中的map
lris_df = datasets.load_iris()

# 挑选出前两个维度作为x轴和y轴,你也可以选择其他维度
x_axis = lris_df.data[:, 0]
y_axis = lris_df.data[:, 2]

# 这里已经知道了分3类,其他分类这里的参数需要调试
model = KMeans(n_clusters=3)

# 训练模型
model.fit(lris_df.data)

# 选取行标为100的那条数据,进行预测
# prddicted_label = model.predict([[6.3, 3.3, 6, 2.5]])

# 预测全部150条数据
all_predictions = model.predict(lris_df.data)

# 打印出来对150条数据的聚类散点图
plt.scatter(x_axis, y_axis, c=all_predictions)
plt.show()
Spark-Mlib
package com.kami.demo01

import org.apache.spark.SparkContext
import org.apache.spark.ml.clustering.{KMeans, KMeansModel}
import org.apache.spark.ml.feature.{MinMaxScaler, MinMaxScalerModel}
import org.apache.spark.sql.{DataFrame, SparkSession}


object rua01 {

  /**
   * 安德森鸢尾花卉数据集
   * https://download.csdn.net/download/qq_33887096/12573555
   * 其数据集包含了150个样本,都属于鸢尾属下的三个亚属,分别是山鸢尾、变色鸢尾和维吉尼亚鸢尾。四个特征被用作样本的定量分析,它们分别是花萼和花瓣的长度和宽度。基于这四个特征的集合,费雪发展了一个线性判别分析以确定其属种。
   * IRIS数据集由Fisher在1936年整理的一个经典数据集,在统计学习和机器学习领域都经常被用作示例。
   * 数据集内包含 3 类共 150 条记录,每类各 50 个数据,每条数据包含4个特征,都是浮点数,单位为厘米。
   * Sepal.Length(花萼长度)
   * Sepal.Width(花萼宽度)
   * Petal.Length(花瓣长度)
   * Petal.Width(花瓣宽度))
   *
   * 目标值为鸢尾花的分类:
   * Iris Setosa(山鸢尾)
   * Iris Versicolour(杂色鸢尾)
   * Iris Virginica(维吉尼亚鸢尾)
   *
   *
   * K-Means 使用的数据格式libSVM
   * libsvm数据格式
   * libsvm使用的训练数据和检验数据文件格式如下:
   * 1. [label] [index1]:[value1] [index2]:[value2] …
   * 2. [label] [index1]:[value1] [index2]:[value2] …
   * label  目标值,就是class(属于哪一类), 要分类的种类,通常是一些整数。
   * index 是有顺序的索引,通常是连续的整数。就是指特征编号,必须按照升序排列
   * value 就是特征值,用来train的数据,通常是一堆实数组成。
   * 样例数据
   * 1 1:5.1 2:3.5 3:1.4 4:0.2
   * 1 1:4.9 2:3.0 3:1.4 4:0.2
   * 1 1:4.7 2:3.2 3:1.3 4:0.2
   * 1 1:4.6 2:3.1 3:1.5 4:0.2
   *
   * @param args
   */

  def main(args: Array[String]): Unit = {
    // 屏蔽日志
    //    Logger.getLogger("org.apache.spark").setLevel(Level.WARN)
    //    Logger.getLogger("org.apache.jetty.server").setLevel(Level.OFF)

    // 设置运行环境
    val sparkSession: SparkSession = SparkSession.builder().master("local[*]").appName("K-Means").getOrCreate()
    val sparkContext: SparkContext = sparkSession.sparkContext
    sparkContext.setLogLevel("warn")

    val irisLibSvmDF = sparkSession.read.format("libsvm").load("data\\iris_kmeans.txt")
    //    irisLibSvmDF.show(false)

    /**
     * 数据归一化(将数据归一到0-1之间,计算速度快)
     * 把数据映射到0~1范围之内处理,更加便捷快速
     * MinMaxScaler  把有量纲表达式变成无量纲表达式,便于不同单位或量级的指标能够进行比较和加权。
     * x = (x - X_min) / (X_max - X_min)
     */

    val scalerDatas: MinMaxScalerModel = new MinMaxScaler()
      .setInputCol("features") //设置需要归一化的列
      .setOutputCol("featuresOut") //归一化后的数据的列名字
      .fit(irisLibSvmDF) //设置数据

    val scalerDF: DataFrame = scalerDatas.transform(irisLibSvmDF)
    //    scalerDF.show(false)

    //使用kmeans进行计算
    val prediction: KMeansModel = new KMeans()
      .setK(3) //设置需要划分类别的数量/个数
      .setMaxIter(10) //设置最大计算次数
      .setFeaturesCol("featuresOut") //设置特征的列    归一化后的列
      .setPredictionCol("predictionValue") //设置最终预测后的结果列名
      .setSeed(20) //设置随机种子    在运行多次时结果相同
      .fit(scalerDF)


    val predictionDF: DataFrame = prediction.transform(scalerDF)
    //    predictionDF.show(false)

    predictionDF.groupBy("label", "predictionValue").count().show()

    sparkContext.stop()
    sparkSession.stop()
  }
}
Spark-ML
package com.kami.demo01

import org.apache.spark.SparkContext
import org.apache.spark.ml.feature.StringIndexerModel
import org.apache.spark.rdd.RDD
import org.apache.spark.sql.types.StructType
import org.apache.spark.sql.{DataFrame, Row, SparkSession}

/**
 * http://spark.apache.org/docs/latest/mllib-clustering.html#k-means
 * 聚类分析是一个无监督学习 (Unsupervised Learning) 过程, 一般是用来对数据对象按照其特征属性进行分组,经常被应用在客户分群,欺诈检测,图像分析等领域。K-means 应该是最有名并且最经常使用的聚类算法了,其原理比较容易理解,并且聚类效果良好,有着广泛的使用。
 * K-means是聚类算法重较为简单的一种,其属于无监督学习,所以训练样本中没有没有类别标签,只有特征。
 */

/**
 * 安德森鸢尾花卉数据集(英文:Anderson's Iris data set),也称鸢尾花卉数据集(英文:Iris flower data set)或费雪鸢尾花卉数据集(英文:Fisher's Iris data set),是一类多重变量分析的数据集。它最初是埃德加·安德森从加拿大加斯帕半岛上的鸢尾属花朵中提取的形态学变异数据[1],后由罗纳德·费雪作为判别分析的一个例子[2],运用到统计学中。
 * http://archive.ics.uci.edu/ml/datasets/Iris
 * 费雪鸢尾花卉数据集
 * 花萼长度	花萼宽度	花瓣长度	花瓣宽度	属种
 */

object rua02 {
  def main(args: Array[String]): Unit = {
    val sparkSession: SparkSession = SparkSession.builder().master("local[*]").appName("wula").getOrCreate()
    val sparkContext: SparkContext = sparkSession.sparkContext
    sparkContext.setLogLevel("warn")
    val structType: StructType = new StructType().add("Sepal.Length", "double").add("Sepal.Width", "double").add("Petal.Length", "double").add("Petal.Width", "double").add("Species", "string")
    val fileRdd: RDD[String] = sparkContext.textFile("file:///C:\\tool\\dev\\JAVA\\2020.06\\day0624_work01\\data\\iris.data")
    //    fileRdd.foreach(x=>println(x))
    val fileRddC: RDD[Row] = fileRdd.filter(x => !x.equals("")).map(_.split(",")).map(x => Row(x(0).toDouble, x(1).toDouble, x(2).toDouble, x(3).toDouble, x(4)))
    val df: DataFrame = sparkSession.createDataFrame(fileRddC, structType)
    //    df.show(false)

    //特征索引转化
    import org.apache.spark.ml.feature.StringIndexer
    val indexer: StringIndexer = new StringIndexer().setInputCol("Species").setOutputCol("categoryIndex")
    val model: StringIndexerModel = indexer.fit(df)
    val indexed: DataFrame = model.transform(df)
    indexed.show()

    sparkContext.stop()
    sparkSession.stop()
  }
}
  • 1
    点赞
  • 58
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值