机器学习---聚类算法

Posted 轩轩馒头铺

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习---聚类算法相关的知识,希望对你有一定的参考价值。

目录

【写在前面】

  • sklearn和scikit-learn:
    scikit-learn是下载下来的工具, sklearn是在python调用包时候的缩写。
  • 聚类的定义:
    是在特征空间的输入数据中发现自然组的无监督问题。
  • 聚类算法的选择
    事实上,没有一个固定的聚类算法可以解决所有的问题,现实操作中,我们往往需要根据数据集的特征进行选择,而且由于函数本身的参数众多,所以找到合适的算法需要不断地调试。
  • scikit-learn提供的聚类算法:

1、亲和力传播
2、聚合聚类
3、BIRCH
4、DBSCAN
5、K-均值
6、高斯混合


其他:
1、Mini-Batch K-均值是K-均值的修改版本,它使用小批量的样本而不是整个数据集对群集质心进行更新,这可以使大数据集的更新速度更快,并且可能对统计噪声更健壮。
2、均值漂移聚类涉及到根据特征空间中的实例密度来寻找和调整质心。
3、OPTICS 聚类( OPTICS 短于订购点数以标识聚类结构)是上述 DBSCAN 的修改版本。
4、光谱聚类是一类通用的聚类方法,取自线性线性代数,使用从点之间的距离导出的矩阵的顶部特征向量。

1、确认安装有scikit-learn库

import sklearn
print(sklearn.__version__)

2、使用 make _ classification ()建立数据集

使用 make _ classification ()函数创建分类数据集,函数的官方介绍如下:


关键参数:

  • n_samples:int,默认值=100
    样本数量。
  • n_features:int,默认值=20
    功能的总数。其中包括n_informational信息性特征、n_冗余冗余特征,n_repeated重复的功能和n_features-n_informative-n_redundant-n_repeated无用的功能随机绘制。
  • n_classes:int,默认值=2
    分类问题的类(或标签)的数量。
  • n_redundant:int,默认值=2
    冗余功能的数量。这些特征生成为信息特征的随机线性组合。
  • n_clusters_per_class:int,默认值=2
    每个类的簇数。
  • random_state:int,RandomState实例或None,默认值=None
    确定数据集创建的随机数生成。传递一个int用于跨多个函数调用的可再现输出。
from numpy import where
from sklearn.datasets import make_classification
from matplotlib import pyplot
# 定义数据集
X, y= make_classification(n_samples=1000, n_features=2, n_classes=4, n_redundant=0, n_clusters_per_class=1,random_state=4)
# 为每个类的样本创建散点图
for class_value in range(4):
# 获取此类的示例的行索引
    row_ix = where(y == class_value)
    # 创建这些样本的散布
    pyplot.scatter(X[row_ix, 0], X[row_ix, 1])
# 绘制散点图
pyplot.show()


可以清楚地看到4个不同的数据组在4个维度,我们希望可以找到一个自动的聚类算法很好地检测这些分组。

3、使用模型进行分类

头文件汇总

# 亲和力传播
from sklearn.cluster import AffinityPropagation
# 聚合聚类
from sklearn.cluster import AgglomerativeClustering
# BIRCH 聚类
from sklearn.cluster import Birch
# 高斯混合模型
from sklearn.mixture import GaussianMixture
# DBSCAN模型
from sklearn.cluster import DBSCAN
# KMeans模型
from sklearn.cluster import KMeans

亲和力传播

对数据执行亲和传播聚类。它作为两对数据点之间相似度的输入度量。在数据点之间交换实值消息,直到一组高质量的范例和相应的群集逐渐出现。

可以看到,效果并不理想。

聚合聚类

聚合聚类涉及合并示例,直到达到所需的群集数量为止。

这个分类结果就很不错。

BIRCH 聚类

Birch聚类算法有三个主要特性:聚类数据高效地进行分析,聚类结果可以保持稳定,而且能够处理大量数据

这个分类结果也很不错。

DBSCAN【本人的毕业设计系统中有用到】

优点:【来自百度百科】

  1. 与K-means方法相比,DBSCAN不需要事先知道要形成的簇类的数量。
  2. 与K-means方法相比,DBSCAN可以发现任意形状的簇类。
  3. 同时,DBSCAN能够识别出噪声点。
  4. DBSCAN对于数据库中样本的顺序不敏感,即Pattern的输入顺序对结果的影响不大。但是,对于处于簇类之间边界样本,可能会根据哪个簇类优先被探测到而其归属有所摆动。

显然这个结果并不是很符合预期效果。

K-均值

给定一个数据点集合和需要的聚类数目k,k由用户指定,k均值算法根据某个距离函数反复把数据分入k个聚类中。

高斯混合模型

高斯混合模型总结了一个多变量概率密度函数,顾名思义就是混合了高斯概率分布。在这种情况下,可以看到群集被完美地识别,因为数据集是作为 Gaussian 的混合生成的。

【写在最后】

  • 本文档旨在帮助准备复试面试内容,代码来自网络,侵删,谢谢。
  • 代码运行所使用的编辑器为:VS Code,运行结果均为本人实际动手操作【①】。
  • 聚类分析是一个迭代过程,在该过程中,对所识别的群集的主观评估被反馈回算法配置的改变中,直到达到期望的或适当的结果。所以一开始在我们并不知道数据集到底应该如何被划分的时候,单凭一张分类结果图很难知道我们的结果是否符合了最终的结论。

spark机器学习-聚类

spark机器学习-聚类 聚类算法是一种无监督学习任务,用于将对象分到具有高度相似性的聚类中,聚类算法的思想简单的说就是物以类聚的思想,

参考技术A spark机器学习-聚类
聚类算法是一种无监督学习任务,用于将对象分到具有高度相似性的聚类中,聚类算法的思想简单的说就是物以类聚的思想,相同性质的点在空间中表现的较为紧密和接近,主要用于数据探索与异常检测,最常用的一种聚类算法是K均值(K-means)聚类算法

算法原理
kmeans的计算方法如下:
1 选取k个中心点
2 遍历所有数据,将每个数据划分到最近的中心点中
3 计算每个聚类的平均值,并作为新的中心点
4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代
算法的时间复杂度上界为O(n*k*t), 其中k为输入的聚类个数,n为数据量,t为迭代次数。一般t,k,n均可认为是常量,时间和空间复杂度可以简化为O(n),即线性的
spark ml编码实践
可在spark-shell环境下修改参数调试以下代码,可以用实际的业务数据做测试评估,业务数据一般是多列,可以把维度列用VectorAssembler组装成向量列做为Kmeans算法的输入列,考虑现实的应用场景,比如做异常数据检测,正常数据分为一类,异常数据分为几类,分别统计正常数据与异常数据的数据量,求百分比等
<span style="font-size:18px;">import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors

val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")

// Trains a k-means model
val kmeans = new KMeans().setK(3).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
val model = kmeans.fit(dataset)

// Shows the result
println("Final Centers: ")
model.clusterCenters.foreach(println)
model.clusterCenters.zipWithIndex.foreach(println)

val myres = model.transform(dataset).select("features","prediction")
myres.show()</span>
聚类算法是一类无监督式机器学习算法,聚类效果怎么评估,模型训练参数怎么调优,是否能用管道来训练模型来比较各种不同组合的参数的效果,即网格搜索法(gridsearch),先设置好待测试的参数,MLLib就会自动完成这些参数的不同组合,管道搭建了一条工作流,一次性完成了整个模型的调优,而不是独立对每个参数进行调优,这个还要再确认一下,查看SPARK-14516好像目前还没有一个聚类效果通用的自动的度量方法
像这种代码(不过现在这个代码有问题):
<span style="font-size:18px;">import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.tuning. ParamGridBuilder, CrossValidator
import org.apache.spark.ml. Pipeline, PipelineStage

val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")

val kmeans = new KMeans().setK(2).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
//主要问题在这里,没有可用的评估器与label列设置
val evaluator = new BinaryClassificationEvaluator().setLabelCol("prediction")
val paramGrid = new ParamGridBuilder().addGrid(kmeans.initMode, Array("random")).addGrid(kmeans.k, Array(3, 4)).addGrid(kmeans.maxIter, Array(20, 60)).addGrid(kmeans.seed, Array(1L, 2L)).build()
val steps: Array[PipelineStage] = Array(kmeans)
val pipeline = new Pipeline().setStages(steps)

val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(evaluator).setEstimatorParamMaps(paramGrid).setNumFolds(10)
// Trains a model
val pipelineFittedModel = cv.fit(dataset)</span>

以上是关于机器学习---聚类算法的主要内容,如果未能解决你的问题,请参考以下文章

机器学习:聚类算法简介

机器学习——聚类算法

spark机器学习-聚类

机器学习聚类算法

机器学习聚类算法

机器学习算法聚类分析-2 聚类算法的分类,层次聚类算法的选择