• 【计算机视觉】图像聚类&噪声


    1. 图像分类与聚类

    以下算法不只能用于图像聚类

    1.1 分类

    • 分类:从特定的数据中挖掘模式,作出判断的过程。(也就是给出一个标签)

    • 分类学习主要过程(有监督学习supervised Learning)

      (1)训练数据集存在一个类标记号,判断它是正向数据集(起积极作用,不垃圾邮件), 还是负向数据集(起抑制作用,垃圾邮件);

      (2)然后需要对数据集进行学习训练,并构建一个训练的模型;

      (3)通过该模型对预测数据集进预测,并计算其结果的性能。

      在这里插入图片描述

    1.2 聚类

    • 聚类:从广义上说,聚类就是将数据集中在某些方面相似的数据成员放在一起。 一个聚类就是一些数据实例的集合,其中处于相同聚类中的数据元素彼此相似,但是处于不同聚类中的元素彼此不同

    • 聚类解释:将一些数据分成几堆,但是并不知道每一堆都有什么样的特点 、分别属于哪一类。也就是把相同特点的聚成一堆,但是不知道具体是什么特点。

    • 无监督学习:由于在聚类中那些表示数据类别的分类或分组信息是没有的,即这些数据是没有标签的,所以聚类通常被归为无监督学习(Unsupervised Learning)。

    • 聚类的目的:把数据分类,但是事先是不知道如何去分的,完全是算法自己来判断各条数据之间的相似性,相似的就放在一起。

    • 分类与聚类区别:聚类主要是"物以类聚",通过相似性把相似元素聚集在一起,它没有标签;而分类通过标签来训练得到一个模型,对新数据集进行预测的过程,其数据存在标签。分类属于有监督学习,聚类属于无监督学习。

      分类 聚类
      有标签 有监督学习
      无标签聚类 无监督学习
      训练过程
    • 聚类样本间的属性:有序属性(西瓜的甜度:0.1,0.2,0.3)、无序属性(性别:男,女)

    1.2.1 原型聚类:K-Means聚类(最常用算法)

    K均值聚类算法(K-Means聚类)最初起源于信号处理,其目标是将数据点划分为K个类簇。

    • 优点:简单、便于理解,运算速度较快

    • 缺点:要在聚类前指定聚集的类簇数;必须事先给出k,对噪声和孤立点数据敏感

    • k-means聚类算法的分析流程

      • 第一步,确定K值(人为确定),即将数据集聚集成K个类簇或小组。

      • 第二步,从数据集中随机选择K个数据点作为质心(Centroid)或数据中心。

      • 第三步,分别计算每个点到每个质心之间的距离,并将每个点划分到离最近质心的小组。

      • 第四步,当每个质心都聚集了一些点后,重新定义算法选出新的质心。

        注释:一般来说对于每个簇,计算每个簇均值,即得到新的k个质心点。当然也可以计算每个簇的最大值最小值或者其他特殊值做质心,根据实际情况改变 。

      • 第五步,迭代执行第三步到第四步,直到迭代终止条件满足为止。

        注释:迭代终止条件一般指聚类结果不再变化,即最后每簇的数据不再变化。但也可以人为设置其他终止条件,根据实际情况而变。

    • Kmeans()函数原型:
      retval, bestLabels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])

      参数解释:

      • data表示聚类数据,最好是np.flloat32类型的N维点集

      • K表示聚类类簇数

      • bestLabels表示输出的整数数组,用于存储每个样本的聚类标签索引

      • criteria表示迭代停止的模式选择,这是一个含有三个元素的元组型数。

        格式为(type, max_iter, epsilon)其中,type有如下模式:
        —–cv2.TERM_CRITERIA_EPS :精确度(误差)满足epsilon停止。
        —-cv2.TERM_CRITERIA_MAX_ITER:迭代次数超过max_iter停止。
        —-cv2.TERM_CRITERIA_EPS+cv2.TERM_CRITERIA_MAX_ITER,两者合体,任意一个满足结束。

      • attempts表示重复试验kmeans算法的次数,算法返回产生的最佳结果的标签

      • flags表示初始中心的选择,两种方法是cv2.KMEANS_PP_CENTERS ;cv2.KMEANS_RANDOM_CENTERS

      • centers表示集群中心的输出矩阵,每个集群中心为一行数据

    • 图像处理中的运用场景:图像分割、图像聚类、图像识别

    【代码实现】直接调用K-Menas接口
    # coding=utf-8  
    from sklearn.cluster import KMeans
     
    """
    第一部分:数据集
    X表示二维矩阵数据,篮球运动员比赛数据
    总共20行,每行两列数据
    第一列表示球员每分钟助攻数:assists_per_minute
    第二列表示球员每分钟得分数:points_per_minute
    """
    X = [[0.0888, 0.5885],
         [0.1399, 0.8291],
         [0.0747, 0.4974],
         [0.0983, 0.5772],
         [0.1276, 0.5703],
         [0.1671, 0.5835],
         [0.1306, 0.5276],
         [0.1061, 0.5523],
         [0.2446, 0.4007],
         [0.1670, 0.4770],
         [0.2485, 0.4313],
         [0.1227, 0.4909],
         [0.1240, 0.5668],
         [0.1461, 0.5113],
         [0.2315, 0.3788],
         [0.0494, 0.5590],
         [0.1107, 0.4799],
         [0.1121, 0.5735],
         [0.1007, 0.6318],
         [0.2567, 0.4326],
         [0.1956, 0.4280]   
        ]
     
    #输出数据集
    print (X)
    
    """
    第二部分:KMeans聚类
    clf = KMeans(n_clusters=3) 表示类簇数为3,聚成3类数据,clf即赋值为KMeans
    y_pred = clf.fit_predict(X) 载入数据集X,并且将聚类的结果赋值给y_pred
    """
    
    clf = KMeans(n_clusters=3)
    y_pred = clf.fit_predict(X)
     
    #输出完整Kmeans函数,包括很多省略参数
    print(clf)
    #输出聚类预测结果
    print("y_pred = ",y_pred)
     
    """
    第三部分:可视化绘图
    """
    
    import numpy as np
    import matplotlib.pyplot as plt
    
    #获取数据集的第一列和第二列数据 使用for循环获取 n[0]表示X第一列
    x = [n[0] for n in X]
    print (x)
    y = [n[1] for n in X]
    print (y)
    
    ''' 
    绘制散点图 
    参数:x横轴; y纵轴; c=y_pred聚类预测结果; marker类型:o表示圆点,*表示星型,x表示点;
    '''
    plt.scatter(x, y, c=y_pred, marker='x')
     
    #绘制标题
    plt.title("Kmeans-Basketball Data")
     
    #绘制x轴和y轴坐标
    plt.xlabel("assists_per_minute")
    plt.ylabel("points_per_minute")
     
    #设置右上角图例
    plt.legend(["A","B","C"])
     
    #显示图形
    plt.show()
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66
    • 67
    • 68
    • 69
    • 70
    • 71
    • 72
    • 73
    • 74
    • 75
    • 76
    • 77
    • 78
    • 79
    • 80
    • 81
    • 82

    运行结果:

    [[0.0888, 0.5885], [0.1399, 0.8291], [0.0747, 0.4974], [0.0983, 0.5772], [0.1276, 0.5703], [0.1671, 0.5835], [0.1306, 0.5276], [0.1061, 0.5523], [0.2446, 0.4007], [0.167, 0.477], [0.2485, 0.4313], [0.1227, 0.4909], [0.124, 0.5668], [0.1461, 0.5113], [0.2315, 0.3788], [0.0494, 0.559], [0.1107, 0.4799], [0.1121, 0.5735], [0.1007, 0.6318]<
    • 相关阅读:
      Java多线程编程
      企业能源管控平台在工业能效提升行动中的作用
      数据库MySQL(二):DDL数据定义语言
      万界星空科技QMS质量管理系统功能
      《大厂高并发分布式锁从入门到实战》第6讲之Mysql分布式锁
      Shell-条件控制语句2
      Sentinel 规则持久化操作
      全新一代智慧园区数字孪生解决方案,为园区运营商和集成商赋能!
      椭圆加密C#实现
      【Kubernetes 系列】一文带你吃透 K8S 应用pod结点
    • 原文地址:https://blog.csdn.net/m0_52923241/article/details/126571000