1. 什么是K均值聚类?
K均值聚类是一种常用的无监督学习算法,能够将一组样本划分为K个不同的类别。其目标是使每个样本点与其所属类别的中心点(也称为聚类中心)之间的距离最小化,从而实现样本点的聚类。
2. K均值聚类的步骤
2.1 初始化
首先,需要选择K个初始的聚类中心。一种常用的方法是随机选择K个样本点作为聚类中心。
import numpy as np
def initialize_centers(data, k):
np.random.shuffle(data)
centers = data[:k]
return centers
data = np.array([[1,2], [2,3], [8,7], [6,5], [7,6], [3,4]])
k = 2
centers = initialize_centers(data, k)
print(centers)
运行以上代码,得到初始化的聚类中心点。
2.2 分配样本点
对于每个样本点,计算其与每个聚类中心的距离,并将其分配到距离最近的聚类中心所属的类别。距离可以使用欧氏距离、曼哈顿距离等来度量。
def assign_points(data, centers):
n = data.shape[0]
labels = np.zeros(n)
for i in range(n):
distances = np.linalg.norm(data[i] - centers, axis=1)
labels[i] = np.argmin(distances)
return labels
labels = assign_points(data, centers)
print(labels)
运行以上代码,得到每个样本点的类别标签。
2.3 更新聚类中心
对于每个类别,计算其所有样本点的均值,并将其作为新的聚类中心。
def update_centers(data, labels, k):
centers = np.zeros((k, data.shape[1]))
for i in range(k):
centers[i] = np.mean(data[labels == i], axis=0)
return centers
centers = update_centers(data, labels, k)
print(centers)
运行以上代码,得到更新后的聚类中心。
2.4 迭代步骤2与步骤3
重复进行步骤2和步骤3,直到聚类中心不再发生变化或达到预定的迭代次数。
def kmeans(data, k, max_iter=100):
centers = initialize_centers(data, k)
for _ in range(max_iter):
labels = assign_points(data, centers)
new_centers = update_centers(data, labels, k)
if np.all(centers == new_centers):
break
centers = new_centers
return labels, centers
labels, centers = kmeans(data, k)
print(labels)
print(centers)
运行以上代码,得到经过迭代后最终的聚类结果。
3. 使用OpenCV进行K均值聚类
除了上述纯Python代码实现外,还可以使用OpenCV库提供的函数来进行K均值聚类。OpenCV是一个开源的计算机视觉库,提供了许多常用的图像处理和计算机视觉算法。
要使用OpenCV进行K均值聚类,首先需要加载并预处理数据。
import cv2
image = cv2.imread('image.jpg')
data = image.reshape(-1, 3).astype(np.float32)
上述代码将图像转换为一维数组,并将数据类型转换为浮点型。这是因为OpenCV的K均值聚类函数要求输入为浮点型。
接下来,可以使用OpenCV的kmeans函数进行聚类。
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 100, 0.6)
flags = cv2.KMEANS_RANDOM_CENTERS
_, labels, centers = cv2.kmeans(data, k, None, criteria, 10, flags)
上述代码中,我们使用了K均值聚类的随机初始中心算法,并设置了最大迭代次数为100次,终止条件为最大迭代次数或达到指定的误差条件(0.6)。
最终,可以根据聚类结果对图像进行分割。
segmented_image = centers[labels.flatten()].reshape(image.shape)
上述代码将聚类得到的类别标签映射回原始图像,并将图像恢复成原始的形状。
通过以上步骤,就可以使用OpenCV进行K均值聚类,并将聚类结果应用于图像分割。
4. 总结
K均值聚类是一种常用的无监督学习算法,用于将样本点划分为K个不同的类别。通过迭代计算每个样本点与聚类中心之间的距离,并更新聚类中心,最终实现样本点的聚类。除了纯Python实现外,还可以使用OpenCV库提供的函数进行K均值聚类,并将聚类结果应用于图像分割。使用OpenCV可以方便地加载和处理图像数据,并利用其计算机视觉算法进行聚类,为图像分析和物体识别等任务提供支持。