k-means聚类算法原理

k-means算法原理

k-means是一种无监督的分类算法,简而言之就是喂给算法的数据是没有标签的,但是我们需要自己设定k值(分类数)。如颗粒图像中有四种颜色,则设立k值为4.而相反,KNN分类算法是一种有监督的算法,我们喂给算法的数据是有标签的。
KNN属于监督学习,类别是已知的,通过对已知分类的数据进行训练和学习,找到这些不同类的特征,再对未分类的数据进行分类。
Kmeans属于非监督学习,事先不知道数据会分为几类,通过聚类分析将数据聚合成几个群体。聚类不需要对数据进行训练和学习。

算法原理

K-Means算法的特点是类别的个数是人为给定的,如果让机器自己去找类别的个数,通过一次次重复这样的选择质心-计算距离后分类-再次选择新质心的流程,直到我们分组之后所有的数据都不会再变化了,也就得到了最终的聚合结果。

算法过程

(1)随机选取k个质心(k值取决于你想聚成几类)
(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类
(3)求出分类后的每类的新质心
(4)再次计算计算样本到新质心的距离,距离质心距离近的归为一类
(5)判断新旧聚类是否相同,如果相同就代表已经聚类成功,如果没有就循环2-4步骤直到相同

KMeans算法实例讲解

(1)随机选取k个质心(k值取决于你想聚成几类)
假设我想聚3类,那我们随机选取【红色、白色、绿色】这3个电影作为质心。
(2)计算样本到质心的距离,距离质心距离近的归为一类,分为k类
计算除质心(大佬)外的样本(小弟)的欧式距离,样本(小弟)离哪个质心(大佬)近,该样本就跟哪个质心(大佬)同一个类别。
(3)求出分类后的每类的新质心
上面我们已经分为三类了,我们需要从三类中重新选出大佬(质心)。
A将红色、白色、绿色的平均值做A类的大佬。
(4)再次计算计算样本到新质心的距离,距离质心距离近的归为一类
(5)判断新旧聚类是否相同
经过这次计算我们发现聚类情况并没有变化,这就说明我们的计算收敛已经结束了,不需要继续进行分组了,最终数据成功按照相似性分成了三组。

算法编程

第一步:导入必要包

from skimage import io
from sklearn.cluster import KMeans
import numpy as np
import warnings
import cv2

第二步:读入数据

# 聚类个数
k = 8
img = cv2.imread("/fengshuiling/16.tif")

第三步:转换数据维度

# 转换数据维度
img_ori_shape = img.shape
img1 = img.reshape((img_ori_shape[0] * img_ori_shape[1], img_ori_shape[2]))
img_shape = img1.shape

第四步:获取图片色彩层数

# 获取图片色彩层数
n_channels = img_shape[0]
print(img_ori_shape)
print(img_shape)
estimator = KMeans(n_clusters=k, max_iter=4000, init='random', n_init=50)  # 构造聚类器
estimator.fit(img1)  # 聚类
centroids = estimator.cluster_centers_  # 获取聚类中心

输出结果:
(512, 512, 3)
(262144, 3)

第五步:使用算法跑出的中心点,生成一个矩阵,为数据可视化做准备

# 使用算法跑出的中心点,生成一个矩阵,为数据可视化做准备
result = []
result_width = 200
result_height_per_center = 80
for center_index in range(k):
    result.append(np.full((result_width * result_height_per_center, n_channels), centroids[center_index], dtype=int))
result = np.array(result)
result = result.reshape((result_height_per_center * k, result_width, n_channels))

最终:保存数据

# 保存图片
io.imsave('D:/fengshuiling/julei/' + 'result.bmp', result)
print(centroids)

最终输出结果为一个数组,它所代表的就是颜色的分布结果

参考博文:(最通俗的话解释KNN,KMeans算法)[https://zhuanlan.zhihu.com/p/122195108]

posted @ 2022-05-17 09:59  heyrro  阅读(514)  评论(0编辑  收藏  举报