机器学习测试笔记(19)——聚类

本文涉及的产品
性能测试 PTS,5000VUM额度
简介: 机器学习测试笔记(19)——聚类

1.概念


在有监督学习中分组叫做分类。它是有标签的,比如苹果可以分为:国光苹果、红香蕉苹果、阿克苏苹果,而在无监督学习中分组叫做聚类,他是没有标签的,它把相同的元素分为一组。在聚类中,分类后的每一组叫做簇。


image.png

               

2.K均值聚类


2.1 概念

k均值聚类算法(k-means clustering algorithm)是一种迭代求解的聚类分析算法,其步骤是,预将数据分为K组,则随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。(K均值聚类是不是有点像K邻近算法?)。


k-means算法基本步骤:

从数据中选择k个对象作为初始聚类中心;

计算每个聚类对象到聚类中心的距离来划分;

再次计算每个聚类中心

计算标准测度函数,直到到达最大迭代次数,则停止,否则,继续操作。

我们可以简单通过下面代码了解K均值算法的过程。


# K均值聚类
def agglomerative_algorithm():
     mglearn.plots.plot_kmeans_algorithm()
    plt.show()

image.png


2.2 程序

通过sklearn.cluster.KMeans算法实现。我们通过下面代码来看一下K均值聚类的散点图分布


#K均值算法,Sklern  KMeans算法
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
import mglearn #pip3 install mglearn
import matplotlib.pyplot as plt
import numpy as np
def my_KMeans():
    blobs =  make_blobs(random_state=1,centers=1)
    X = blobs[0]
    y = blobs[1]
#设置簇个数为3
    Kmeans =  KMeans(n_clusters=3)
    Kmeans.fit(X)
    print("训练集数据集分配簇标签为:\n{}".format(Kmeans.labels_))
    print("对训练集数据集预测结果为:",Kmeans.predict(X))
#画出聚类后的数据集图像
     mglearn.discrete_scatter(X[:,0], X[:,1],Kmeans.labels_,markers='o')
     mglearn.discrete_scatter(Kmeans.cluster_centers_[:,0],  Kmeans.cluster_centers_[:,1],[0,1,2],markers='^',markeredgewidth=2)
    plt.show()


输出

训练集数据集分配簇标签为:
[2 2 0 1 1 1 2 2 0 1 2 1 2 0 2 1 1 2 0 0 1 0 2 2 2 2 1 2 2 2 0 0 2  2 1 0 1 0 2 0 1 2 0 0 1 1 1 2 0 2 0 2 1 0 1 1 0 1 1 2 1 0 1 2 0 1 0 0 2 1 1 2  1 1 1 2 1 2 2 0 1 0 1 1 0 2 1 2 0 0 1 2 0 0 1 1 2 1 1 2]
对训练集数据集预测结果为:
[2 2 0 1 1 1 2 2 0 1 2 1 2 0 2 1 1 2 0 0 1 0 2 2 2 2 1 2 2 2 0 0 2  2 1 0 1 0 2 0 1 2 0 0 1 1 1 2 0 2 0 2 1 0 1 1 0 1 1 2 1 0 1 2 0 1 0 0 2 1 1 2  1 1 1 2 1 2 2 0 1 0 1 1 0 2 1 2 0 0 1 2 0 0 1 1 2 1 1 2]


标签是一致的。

image.png


更详细些,我们把边界按照传统的方法画出来,蓝×表示数字中心。


X_blobs = blobs[0]
  X_min,X_max =  X_blobs[:,0].min()-0.5,X_blobs[:,0].max()+0.5
  y_min,y_max = X_blobs[:,1].min()-0.5,X_blobs[:,1].max()+0.5
  xx, yy =  np.meshgrid(np.arange(X_min, X_max, .02),np.arange(y_min, y_max, .02))
  Z =  Kmeans.predict(np.c_[xx.ravel(),yy.ravel()])
  Z = Z.reshape(xx.shape)
  plt.figure(1)
plt.imshow(Z,interpolation='nearest',extent=(xx.min(),xx.max(),yy.min(),yy.max()),cmap=plt.cm.summer,aspect='auto',origin='lower')
   plt.plot(X_blobs[:,0],X_blobs[:,1],'r,',markersize=5)
#用蓝色×代表聚类的中心
  centroids =  Kmeans.cluster_centers_
plt.scatter(centroids[:,0],centroids[:,1],marker='x',s=150,linewidths=3,color='b',zorder=10)
   plt.xlim(X_min,X_max)
   plt.ylim(y_min,y_max)
   plt.xticks(())
   plt.yticks(())
   plt.show()

image.png

其实我们可以用mglearn类更简单地画出类似效果。


image.png


我们用K均值聚类处理iris数据。

from sklearn import datasets
def KMeans_for_iris():
        X,y = datasets.load_iris().data,datasets.load_iris().target
        Kmeans =  KMeans(n_clusters=3)
        Kmeans.fit(X)
        result =  Kmeans.fit_predict(X)
        print("iris 原始数据集分配簇标签为:\n{}".format(y))
        print("iris  Kmeans训练簇标签为:\n{}".format(result))


输出

iris 原始数据集分配簇标签为:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1  1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2  2]
iris Kmeans训练簇标签为:
[0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0  0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 2 2 1 2 2 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2 2 2 2 2 2 2 2 1 2 2 2 2 2 2 2 2 2 2  2 2 2 2 2 2 2 2 2 2 2 2 1 2 1 1 1 1 2 1 1 1 1 1 1  2 2 1 1 1 1 2 1  2 1 2 1 1 2 2 1 1 1 1 1 2 1 1 1 1 2  1 1 1 2 1 1 1 2  1 1 2]


0分得比较精确,12都有偏差。


3 凝聚聚类


3.1 概念

凝聚聚类(agglomerative clustering)指的是许多基于相同原则构建的聚类算法,这一原则是:算法首先声明每个点是自己的簇,然后合并两个最相似的簇,直到满足某种停止准则为止。


我们可以通过以下代码来了解一下凝聚聚类算法。

#凝聚算法
from scipy.cluster.hierarchy import dendrogram,ward   
def agglomerative_algorithm():
     mglearn.plots.plot_agglomerative_algorithm()
    plt.show()
    blobs =  make_blobs(random_state=1,centers=1)
    x_blobs = blobs[0]
#使用连线方式进行可视化
    linkage =ward(x_blobs)
    dendrogram(linkage)
    ax = plt.gca() # gca:Get Current Axes
#设定横纵轴标签
    plt.xlabel("sample  index")
    plt.ylabel("Cluster  distance")
    plt.show()

image.png

image.png


注意:度量相似值,Sklearn有四种选项


linkage :{"ward", "complete", "average","single"}, optional (默认="ward")

  • ward链接:默认选项,挑选两个簇来合并,是的所有簇中的方差增加最小。这通常会得到大小差不多相等的簇。
  • average链接:也称为均链接,将簇中所有点之间“平均距离”最小的两个簇合并。
  • complete链接:也称为最大链接,将簇中点之间“最大距离”最小的两个簇合并。
  • single链接:也称单链接,将簇中所有点之间“最小距离”最小的两个簇合并。

ward适用于大多数数据集。如果簇中的成员个数非常不同(比如其中一个比其他所有都大得多),那么averagecomplete可能效果更好。

3.2 程序

通过sklearn.cluster.AgglomerativeClustering算法实现。


from sklearn.cluster import AgglomerativeClustering
def my_AgglomerativeClustering():
        blobs =  make_blobs(random_state=1,centers=1)
        X = blobs[0]
        y = blobs[1]
#设置簇个数为3
        AC =  AgglomerativeClustering(n_clusters=3)
        result =  AC.fit_predict(X)
        print("训练集数据集分配簇标签为:\n{}".format(AC.labels_))
        print("对训练集数据集预测结果为:\n{}".format(result))


输出


训练集数据集分配簇标签为:
[1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0  0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1  2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1]
对训练集数据集预测结果为:
[1 1 0 2 1 2 2 1 0 2 1 2 0 0 1 2 2 0 0 0 2 0 2 2 0 1 2 2 1 1 2 0 0  0 2 0 2 0 0 0 2 1 0 0 2 2 2 1 0 0 0 1 2 2 2 2 2 2 2 2 2 2 2 0 0 1 0 0 0 2 2 1  2 2 2 1 2 0 0 0 2 0 2 2 0 1 2 1 2 0 2 0 2 2 2 2 0 2 2 1]


最后我们还用凝聚聚类对iris数据进行聚类


def AgglomerativeClustering_for_iris():
    X,y =  datasets.load_iris().data,datasets.load_iris().target
    AC =  AgglomerativeClustering(n_clusters=3)
    AC.fit(X)
    result =  AC.fit_predict(X)
    print("iris原始数据集分配簇标签为:\n{}".format(y))
    print("iris AC训练簇标签为:\n{}".format(result))


4 DBSCAN


4.1 概念

DBSCAN(Density-basedspatial clustering of application with nose):基于密度的有噪音应用空间聚类。密度大的地方是一类,密度小的地方是分界线。不需要事先指明簇的个数。


DBSCAN的算法如下:

while(存在没有被访问过的点) :
    选择任意一个点
for (遍历该点<eps的所有点) :
if(点的个数<= min_sample):
            标记为噪音(noise),这个点不属于任何簇
else:
            这个点标记为核心样本(核心点),分配一个簇标签
for (该点在距离eps内的邻居)  &&(邻居存在核心样本):
if (没有分配一个簇):
                将刚才创建的簇分配给它
elif(核心样本) :
依次访问它的邻居


所以,DBSCAN中有三个关键参数:


  • 核心点;
  • 核心点距离eps内的点(边界点)
  • 噪音。
  • 程序
  • 基本概念


通过sklearn.cluster.DBSCAN算法实现。

照旧,我们首先来显示一下DBSCAN的散点图。


def my_dbscan():
    db = DBSCAN()
# 使用DBSCAN拟合
    blobs =  make_blobs(random_state=1,centers=1)
    x_blobs = blobs[0]
    clusters =  db.fit_predict(x_blobs)
#绘制散点图
     plt.scatter(x_blobs[:,0],x_blobs[:,1],c=clusters,cmap=plt.cm.cool,s=60,edgecolor='k')
    plt.xlabel('component  1')
    plt.ylabel('component  2')
    plt.show()


输出

[-1  0 -1  0 -1   0  0  0  0  0   0  0  0  0  -1  0   0  0  0   0  0  0   0  0
0 -1  0  0  -1  0   0  0  0   0  0  0   0  0  0   0  0  0   0  0  0   0  0 -1
0  0   0  0  0  0  0   0  0 -1  0   0  0  0   0  0 -1  0   0  0  0   0  0  0
0  0 -1 -1   0  0  0  0  -1  0   0 -1  0  0 -1   0  0  0   0  0  0   0  0 -1
0  0  0  -1]


里面0 簇:紫色区域,-1为噪音点:蓝色区域。


image.png


4.2.2 eps参数

eps指定划分为一簇样本的距离有多远,越大,聚类覆盖面越大(默认0.5)


# 设置eps=2(默认为0.5),加大eps,簇变大
db_1 = DBSCAN(eps=2)
# 使用DBSCAN拟合
    clusters_1 =  db_1.fit_predict(x_blobs)
#绘制散点图
     plt.scatter(x_blobs[:,0],x_blobs[:,1],c=clusters_1,cmap=plt.cm.cool,s=60,edgecolor='k')
    plt.xlabel('component  1')
    plt.ylabel('component  2')
    plt.show()  

image.png


所有点都变成了一簇。


4.2.3 min_sample参数

min_sample聚类核心点的个数,min_sample越大,核心点个数越小,噪音也就越大; min_sample越小,核心点个数越多,噪音也就越少。默认min_sample=2


# 设置min_samples  =20(min_samples=2),min_samples越大,核心点个数越小,噪音也就越大
db_2 =  DBSCAN(min_samples=20)
# 使用DBSCAN拟合
    clusters_2 =  db_2.fit_predict(x_blobs)
#绘制散点图
     plt.scatter(x_blobs[:,0],x_blobs[:,1],c=clusters_2,cmap=plt.cm.cool,s=60,edgecolor='k')
    plt.xlabel('component  1')
    plt.ylabel('component  2')
    plt.show()

image.png


我们通过以下代码进一步展示这两个参数的作用。


#绘制不同eps,min_sample下的DBSCAN分布
mglearn.plots.plot_dbscan()
plt.show()


输出

min_samples: 2 eps: 1.000000 cluster: [-1  0  0  -1  0 -1  1  1  0  1  -1 -1]
min_samples: 2 eps: 1.500000 cluster: [0 1 1 1 1 0 2 2 1 2 2 0]
min_samples: 2 eps: 2.000000 cluster: [0 1 1 1 1 0 0 0 1 0 0 0]
min_samples: 2 eps: 3.000000 cluster: [0 0 0 0 0 0 0 0 0 0 0 0]
min_samples: 3 eps: 1.000000 cluster: [-1  0  0  -1  0 -1  1  1  0  1  -1 -1]
min_samples: 3 eps: 1.500000 cluster: [0 1 1 1 1 0 2 2 1 2 2 0]
min_samples: 3 eps: 2.000000 cluster: [0 1 1 1 1 0 0 0 1 0 0 0]
min_samples: 3 eps: 3.000000 cluster: [0 0 0 0 0 0 0 0 0 0 0 0]
min_samples: 5 eps: 1.000000 cluster: [-1 -1 -1 -1 -1 -1 -1 -1 -1  -1 -1 -1]
min_samples: 5 eps: 1.500000 cluster: [-1 0  0   0  0 -1 -1 -1  0 -1 -1 -1]
min_samples: 5 eps: 2.000000 cluster: [-1 0 0  0  0  -1 -1 -1  0 -1 -1 -1]
min_samples: 5 eps: 3.000000 cluster: [0 0 0 0 0 0 0 0 0 0 0 0]

image.png

由此可见esp越大,越容易整体归为一类;min_samples越大,噪音越多。


4.2.4 DBSCA分析两个月亮模型数据

from sklearn.datasets import make_moons
from sklearn.preprocessing import StandardScaler # 标准化工具
from sklearn.cluster import DBSCAN
    X, y =  make_moons(n_samples=200,noise=0.05, random_state=0)
# 缩放数据
    scaler = StandardScaler()
    scaler.fit(X)
    X_scaled =  scaler.transform(X)
# 打印处理后的数据形态
    print("处理后的数据形态:",X_scaled.shape)
# 处理后的数据形态: (200, 2) 200个样本 2类   
    dbscan = DBSCAN()
     clusters=dbscan.fit_predict(X_scaled)
#绘制簇分配结果
    plt.scatter(X_scaled[:,0],X_scaled[:,1],c=clusters,cmap=mglearn.cm2,s=60)
    plt.xlabel("Feture  0")
    plt.ylabel("Feture  1")
    plt.show()


输出

image.png


5.聚类比较



算法

特色

K均值

  • 允许用户设定“簇”的数量
  • 用簇平均值表示簇

凝聚

  • 允许用户设定“簇”的数量
  • 划分整个层次结构,通过树状图查看

DBSCAN

  • 可以检测没有分配的噪音
  • 允许用户设定eps定义接近程度,从而影响“簇”的大小
  • 可以生成差别很大的两个“簇”

 

—————————————————————————————————


软件安全测试

https://study.163.com/course/courseMain.htm?courseId=1209779852&share=2&shareId=480000002205486

接口自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209794815&share=2&shareId=480000002205486

DevOps 和Jenkins之DevOps

https://study.163.com/course/courseMain.htm?courseId=1209817844&share=2&shareId=480000002205486

DevOps与Jenkins 2.0之Jenkins

https://study.163.com/course/courseMain.htm?courseId=1209819843&share=2&shareId=480000002205486

Selenium自动化测试

https://study.163.com/course/courseMain.htm?courseId=1209835807&share=2&shareId=480000002205486

性能测试第1季:性能测试基础知识

https://study.163.com/course/courseMain.htm?courseId=1209852815&share=2&shareId=480000002205486

性能测试第2季:LoadRunner12使用

https://study.163.com/course/courseMain.htm?courseId=1209980013&share=2&shareId=480000002205486

性能测试第3季:JMeter工具使用

https://study.163.com/course/courseMain.htm?courseId=1209903814&share=2&shareId=480000002205486

性能测试第4季:监控与调优

https://study.163.com/course/courseMain.htm?courseId=1209959801&share=2&shareId=480000002205486

Django入门

https://study.163.com/course/courseMain.htm?courseId=1210020806&share=2&shareId=480000002205486

啄木鸟顾老师漫谈软件测试

https://study.163.com/course/courseMain.htm?courseId=1209958326&share=2&shareId=480000002205486

相关实践学习
通过性能测试PTS对云服务器ECS进行规格选择与性能压测
本文为您介绍如何利用性能测试PTS对云服务器ECS进行规格选择与性能压测。
目录
打赏
0
0
0
0
310
分享
相关文章
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
207 6
一个测试工程师的实战笔记:我是如何在Postman和Apipost之间做出选择的?
优秀的API测试工具应该具备: 分层设计:既有可视化操作,也开放代码层深度定制 场景感知:自动识别加密需求推荐处理方案 协议包容:不强迫开发者为了不同协议切换工具 数据主权:允许自主选择数据存储位置
22 7
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法
在数据驱动时代,A/B 测试成为评估机器学习项目不同方案效果的重要方法。本文介绍 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,同时提供 Python 实现示例,强调其在确保项目性能和用户体验方面的关键作用。
76 6
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段
在数据驱动时代,A/B 测试成为评估机器学习项目效果的重要手段。本文介绍了 A/B 测试的基本概念、步骤及其在模型评估、算法改进、特征选择和用户体验优化中的应用,强调了样本量、随机性和时间因素的重要性,并展示了 Python 在 A/B 测试中的具体应用实例。
54 1
自动化测试的未来:AI与机器学习的融合之路
【10月更文挑战第41天】随着技术的快速发展,软件测试领域正经历一场由人工智能和机器学习驱动的革命。本文将探讨这一趋势如何改变测试流程、提高测试效率以及未来可能带来的挑战和机遇。我们将通过具体案例分析,揭示AI和ML在自动化测试中的应用现状及其潜力。
85 0
前端大模型应用笔记(二):最新llama3.2小参数版本1B的古董机测试 - 支持128K上下文,表现优异,和移动端更配
llama3.1支持128K上下文,6万字+输入,适用于多种场景。模型能力超出预期,但处理中文时需加中英翻译。测试显示,其英文支持较好,中文则需改进。llama3.2 1B参数量小,适合移动端和资源受限环境,可在阿里云2vCPU和4G ECS上运行。
241 1
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
这篇文章是关于如何通过算法接口返回的目标检测结果来计算性能指标的笔记。它涵盖了任务描述、指标分析(包括TP、FP、FN、TN、精准率和召回率),接口处理,数据集处理,以及如何使用实用工具进行文件操作和数据可视化。文章还提供了一些Python代码示例,用于处理图像文件、转换数据格式以及计算目标检测的性能指标。
114 0
测试专项笔记(一): 通过算法能力接口返回的检测结果完成相关指标的计算(目标检测)
目标分类笔记(二): 利用PaddleClas的框架来完成多标签分类任务(从数据准备到训练测试部署的完整流程)
这篇文章介绍了如何使用PaddleClas框架完成多标签分类任务,包括数据准备、环境搭建、模型训练、预测、评估等完整流程。
282 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
本文介绍了DeepLab V3在语义分割中的应用,包括数据集准备、模型训练、测试和评估,提供了代码和资源链接。
800 0
语义分割笔记(二):DeepLab V3对图像进行分割(自定义数据集从零到一进行训练、验证和测试)
机器学习的核心功能:分类、回归、聚类与降维
机器学习领域的基本功能类型通常按照学习模式、预测目标和算法适用性来分类。这些类型包括监督学习、无监督学习、半监督学习和强化学习。
118 0

热门文章

最新文章

  • 1
    小鱼深度评测 | 通义灵码2.0,不仅可跨语言编码,自动生成单元测试,更炸裂的是集成DeepSeek模型且免费使用,太炸裂了。
    136763
  • 2
    3天功能开发→3小时:通义灵码2.0+DEEPSEEK实测报告,单元测试生成准确率92%的秘密
    73
  • 3
    Potpie.ai:比Copilot更狠!这个AI直接接管项目代码,自动Debug+测试+开发全搞定
    21
  • 4
    基于FPGA的图像双线性插值算法verilog实现,包括tb测试文件和MATLAB辅助验证
    9
  • 5
    【01】噩梦终结flutter配安卓android鸿蒙harmonyOS 以及next调试环境配鸿蒙和ios真机调试环境-flutter项目安卓环境配置-gradle-agp-ndkVersion模拟器运行真机测试环境-本地环境搭建-如何快速搭建android本地运行环境-优雅草卓伊凡-很多人在这步就被难倒了
    70
  • 6
    大前端之前端开发接口测试工具postman的使用方法-简单get接口请求测试的使用方法-简单教学一看就会-以实际例子来说明-优雅草卓伊凡
    22
  • 7
    「ximagine」业余爱好者的非专业显示器测试流程规范,同时也是本账号输出内容的数据来源!如何测试显示器?荒岛整理总结出多种测试方法和注意事项,以及粗浅的原理解析!
    11
  • 8
    用户说 | 通义灵码2.0,跨语言编码+自动生成单元测试+集成DeepSeek模型且免费使用
    59
  • 9
    以项目登录接口为例-大前端之开发postman请求接口带token的请求测试-前端开发必学之一-如果要学会联调接口而不是纯写静态前端页面-这个是必学-本文以优雅草蜻蜓Q系统API为实践来演示我们如何带token请求接口-优雅草卓伊凡
    12
  • 10
    AxBench:斯坦福大学推出评估语言模型控制方法的基准测试框架
    2
  • AI助理

    你好,我是AI助理

    可以解答问题、推荐解决方案等