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()
运行结果:
[[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], [0.2567, 0.4326], [0.1956, 0.428]]
KMeans(n_clusters=3)
y_pred = [0 2 0 0 0 0 0 0 1 1 1 0 0 0 1 0 0 0 0 1 1