K-means矢量量化算法介绍

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一。

K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。matlab中有kmeans聚类算法的函数可以调用,如[ldx,C,sumD,D]=kmeans(X,k)(详见matlab help kmeans)。以下链接是一个用java写的聚类演示K-means demo

对于该算法存在的缺点可以使用ISODATA(迭代自组织数据分析算法)来确定聚类数目K,使用K-means++算法或者遗传算法(GA)来选择初始中心。

 

K-means算法流程:

1.初始化:选择合适的方法设置K个初始的码本中心zi,1<=i<=K;

2.最近邻分类:将训练数据矢量xt按照最近邻原则分配到最近的码本zi中,此步骤中可以采用欧式距离、马氏距离等。

3.码本更新:将所有的训练数据分配到离其最近的码本后,生成新的质心,即新的码本。

4.重复2、3直到相邻的迭代误差满足阈值要求。

 

ISODATA算法:

isodata(跌代自组织分析),通过设定初始参数使用归并与分裂的机制。当某两类聚类中心距离小于某一阈值时,将它们合并为一类;当某类标准差大于某一阈值或其样本数目超过某一阈值时,将其分为两类;在某类样本数目少于某阈值时,需将其取消。

 

K-means++算法流程:

1.给定初始点的集合D

2.随机从点集D中选择一个点作为初始的中心点

3.计算每一个点到最近中心点的距离Si

4.求和Si得到Sum

5.取随机值Random(0 < Random < Sum)

6.循环点集D,做Random -= Si(更新后的Si)运算直到Random < 0,那么点i就是下一个中心点

7.循环3-6,直到去除所有的K个中心点

8.进行K-means算法

 

参考:K-means算法

         Kmeans++算法的理解     

         Kmeans、Kmeans++和KNN算法比较 

转载于:https://www.cnblogs.com/guangxu/p/4264631.html

K-means是一种经典的聚类算法,可以将数据集分成不同的簇。在图像处理中,K-means可以用于将图像中的颜色聚类成不同的簇,从而实现图片的矢量量化操作。 具体来说,我们可以将每个像素的RGB值看作一个三维向量,然后使用K-means算法将这些向量聚类成不同的簇。聚类完成后,我们可以将每个簇的中心作为该簇的代表颜色,然后将图片中的像素替换为最近的簇中心颜色,从而实现矢量量化。 以下是使用Python实现K-means进行图片的矢量量化的示例代码: ```python import numpy as np import cv2 # 读取图片 img = cv2.imread('test.jpg') # 将图片像素转换为向量 pixels = np.float32(img.reshape(-1, 3)) # 定义K-means模型 kmeans = cv2.Kmeans(nclusters=16, init='kmeans++') # 训练K-means模型 kmeans.fit(pixels) # 获取簇中心 centers = np.uint8(kmeans.cluster_centers_) # 将像素替换为最近的簇中心颜色 quantized = centers[kmeans.labels_] # 将量化后的像素转换回图片格式 result = quantized.reshape(img.shape) # 显示原图和量化后的图片 cv2.imshow('Original', img) cv2.imshow('Quantized', result) cv2.waitKey() cv2.destroyAllWindows() ``` 在上面的代码中,我们首先将图片像素转换为向量,然后使用K-means训练模型并获取簇中心。接着,我们将每个像素替换为最近的簇中心颜色,最后将量化后的像素转换回图片格式并显示原图和量化后的图片。 注意,K-means算法的聚类结果可能会受到初始聚类中心的影响,因此我们可以尝试不同的初始化方来得到更好的结果。另外,选择合适的簇数也是一个需要考虑的问题,如果簇数太少,可能会导致量化后的图片失真;如果簇数太多,可能会导致量化后的图片过于细节化。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值