K-Means聚类算法思想及实现

K-Means聚类概念:

K-Means聚类是最常用的聚类算法,最初起源于信号处理,其目标是将数据点划分为K个类簇, 找到每个簇的中心并使其度量最小化。 该算法的最大优点是简单、便于理解,运算速度较快,缺点是只能应用于连续型数据,并且要 在聚类前指定聚集的类簇数。 k-means算法是一种原型聚类算法。

K-Means聚类分析流程:

第一步,确定K值,即将数据集聚集成K个类簇或小组。
第二步,从数据集中随机选择K个数据点作为质心(Centroid)或数据中心。
第三步,分别计算每个点到每个质心之间的距离,并将每个点划分到离最近质心的小组。
第四步,当每个质心都聚集了一些点后,重新定义算法选出新的质心。(对于每个簇,计 算其均值,即得到新的k个质心点)
第五步,迭代执行第三步到第四步,直到迭代终止条件满足为止(分类结果不再变化)
举个例子:
起始情况:
在这里插入图片描述
在这里插入图片描述
第一步,确定K值,即将数据集聚集成K个类簇或小组。 ----这里我们选K=2
第二步,从数据集中随机选择K个数据点作为质心(Centroid)或数 据中心。----假设我们选择P1和P2作为初始的质心
第三步,分别计算每个点到每个质心之间的距离,并将每个点划分 到离最近质心的小组。 ----计算P3到P1的距离:√10 = 3.16; ----计算P3到P2的距离:√((3-1)2+(1-2)2 = √5 = 2.24; ----所以P3离P2更近,P3就加入P2的簇。同理,P4、P5、P6;
在这里插入图片描述
P3到P6都跟P2更近,所以第一次分组的结果是:
• 组A:P1
• 组B:P2、P3、P4、P5、P6
在这里插入图片描述
按照上一次的方法选出两个新的虚拟质心: —P哥1(1.33,1), P哥2(9,8.33)。
第三次计算点到质心的距离:
— 这时可以看到P1、P2、P3离P哥1更近,P4、 P5、P6离P哥2更近。
所以第三次分组的结果是:
• 组A:P1、P2、P3
• 组B:P4、P5、P6
我们发现,这次分组的结果和上次没有任何变化了,说 明已经收敛,聚类结束。

K-Means聚类应用:

在图像处理中,通过K-Means聚类算法可以实现图像分割、图像聚类、图像识别等操作。 我们通过K-Means可以将这些像素点聚类成K个簇,然后使用每个簇内的质心点来替换簇内所有 的像素点,这样就能实现在不改变分辨率的情况下量化压缩图像颜色,实现图像颜色层级分割。

K-Means聚类优缺点:

优点:
1.是解决聚类问题的一种经典算法,简单、快速
2.对处理大数据集,该算法保持可伸缩性和高效率
3.当结果簇是密集的,它的效果较好
缺点:
1.在簇的平均值可被定义的情况下才能使用,可能不适用于某些应用
2.必须事先给出k(要生成的簇的数目),而且对初值敏感,对于不同的初始值,可能会导致不同结果。
3.不适合于发现非凸形状的簇或者大小差别很大的簇
4.对躁声和孤立点数据敏感

算法实现

简单的灰色图像聚类:

'''
在OpenCV中,Kmeans()函数原型如下所示:
compactness, Labels, centers = kmeans(data, K, bestLabels, criteria, attempts, flags[, centers])返回值:compactness:紧密度,返回每个点到相应重心的距离的平方和labels:结果标记,每个成员被标记为分组的序号,如 0,1,2,3,4...等centers:由聚类的中心组成的数组输入值:data表示聚类数据,最好是np.flloat32类型的N维点集K表示聚类类簇数bestLabels表示输出的整数数组,用于存储每个样本的聚类标签索引criteria表示算法终止条件,即最大迭代次数或所需精度。在某些迭代中,一旦每个簇中心的移动小于criteria.epsilon,算法就会停止attempts表示重复试验kmeans算法的次数,算法返回产生最佳紧凑性的标签flags表示初始中心的选择,两种方法是cv2.KMEANS_PP_CENTERS ;和cv2.KMEANS_RANDOM_CENTERScenters表示集群中心的输出矩阵,每个集群中心为一行数据
'''import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像灰度颜色
img = cv2.imread('lenna.png', 0) 
print (img.shape)#获取图像高度、宽度
rows, cols = img.shape[:]#图像二维像素转换为一维
data = img.reshape((rows * cols, 1))
data = np.float32(data)#定义终止条件 (type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#每次随机选择初始中心
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚类 聚集成4类
compactness, labels, centers = cv2.kmeans(data, 4, None, criteria, 10, flags)#生成最终图像
dst = labels.reshape((img.shape[0], img.shape[1]))#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']#显示图像
titles = [u'原始图像', u'聚类图像']  
images = [img, dst]  
for i in range(2):  plt.subplot(1,2,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i])  plt.xticks([]),plt.yticks([])  
plt.show()

结果展示:
在这里插入图片描述
彩色图像不同类数的聚类效果对比:

import cv2
import numpy as np
import matplotlib.pyplot as plt#读取原始图像
img = cv2.imread('lenna.png') 
print (img.shape)#图像二维像素转换为一维
data = img.reshape((-1,3))
#先前我们不知道z的shape属性是多少,但是想让z变成只有三列
data = np.float32(data)
#转换为float32位#定义终止条件(type,max_iter,epsilon)
criteria = (cv2.TERM_CRITERIA_EPS +cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)#随机选定初始中心
flags = cv2.KMEANS_RANDOM_CENTERS#K-Means聚类 聚集成2类
compactness, labels2, centers2 = cv2.kmeans(data, 2, None, criteria, 10, flags)#K-Means聚类 聚集成4类
compactness, labels4, centers4 = cv2.kmeans(data, 4, None, criteria, 10, flags)#K-Means聚类 聚集成8类
compactness, labels8, centers8 = cv2.kmeans(data, 8, None, criteria, 10, flags)#K-Means聚类 聚集成16类
compactness, labels16, centers16 = cv2.kmeans(data, 16, None, criteria, 10, flags)#K-Means聚类 聚集成64类
compactness, labels64, centers64 = cv2.kmeans(data, 64, None, criteria, 10, flags)#图像转换回uint8二维类型
centers2 = np.uint8(centers2)
res = centers2[labels2.flatten()]
dst2 = res.reshape((img.shape))centers4 = np.uint8(centers4)
res = centers4[labels4.flatten()]
dst4 = res.reshape((img.shape))centers8 = np.uint8(centers8)
res = centers8[labels8.flatten()]
dst8 = res.reshape((img.shape))centers16 = np.uint8(centers16)
res = centers16[labels16.flatten()]
dst16 = res.reshape((img.shape))centers64 = np.uint8(centers64)
res = centers64[labels64.flatten()]
dst64 = res.reshape((img.shape))#图像转换为RGB显示
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)
dst2 = cv2.cvtColor(dst2, cv2.COLOR_BGR2RGB)
dst4 = cv2.cvtColor(dst4, cv2.COLOR_BGR2RGB)
dst8 = cv2.cvtColor(dst8, cv2.COLOR_BGR2RGB)
dst16 = cv2.cvtColor(dst16, cv2.COLOR_BGR2RGB)
dst64 = cv2.cvtColor(dst64, cv2.COLOR_BGR2RGB)#用来正常显示中文标签
plt.rcParams['font.sans-serif']=['SimHei']#显示图像
titles = [u'原始图像', u'聚类图像 K=2', u'聚类图像 K=4',u'聚类图像 K=8', u'聚类图像 K=16',  u'聚类图像 K=64']  
images = [img, dst2, dst4, dst8, dst16, dst64]  
for i in range(6):  plt.subplot(2,3,i+1), plt.imshow(images[i], 'gray'), plt.title(titles[i])  plt.xticks([]),plt.yticks([])  #xticks()函数可以用来设置使x轴上ticks隐藏,即将空数组赋予它,则没有tick会显示在x轴上
plt.show()

输出结果:
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/389534.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

(2.1)DDL增强功能-数据类型、同义词、分区表

1.数据类型 (1)常用数据类型  1.整数类型 int 存储范围是-2,147,483,648到2,147,483,647之间的整数,主键列常设置此类型。 (每个数值占用 4字节) smallint 存储范围是-32,768 到 32,767 之间的整数,用…

充分利用昂贵的分析

By Noor Malik努尔马利克(Noor Malik) Let’s say you write a query in Deephaven which performs a lengthy and expensive analysis, resulting in a live table. For example, in a previous project, I wrote a query which pulled data from an RSS feed to create a li…

层次聚类和密度聚类思想及实现

层次聚类 层次聚类的概念: 层次聚类是一种很直观的算法。顾名思义就是要一层一层地进行聚类。 层次法(Hierarchicalmethods)先计算样本之间的距离。每次将距离最近的点合并到同一个类。然后,再 计算类与类之间的距离&#xff0…

通配符 或 怎么浓_浓咖啡的咖啡渣新鲜度

通配符 或 怎么浓How long could you wait to brew espresso after grinding? Ask a barista, any barista, and I suspect their answer is immediately or within a few minutes. The common knowledge on coffee grounds freshness is that after 30 minutes or so, coffee…

《netty入门与实战》笔记-02:服务端启动流程

为什么80%的码农都做不了架构师?>>> 1.服务端启动流程 这一小节,我们来学习一下如何使用 Netty 来启动一个服务端应用程序,以下是服务端启动的一个非常精简的 Demo: NettyServer.java public class NettyServer {public static v…

谱聚类思想及实现

(这个我也没有怎么懂,为了防止以后能用上,还是记录下来) 谱聚类 注意:谱聚类核心聚类算法还是K-means 算法进行聚类~ 谱聚类的实现过程: 1.根据数据构造一个 图结构(Graph) &…

Tengine HTTPS原理解析、实践与调试【转】

本文邀请阿里云CDN HTTPS技术专家金九,分享Tengine的一些HTTPS实践经验。内容主要有四个方面:HTTPS趋势、HTTPS基础、HTTPS实践、HTTPS调试。 一、HTTPS趋势 这一章节主要介绍近几年和未来HTTPS的趋势,包括两大浏览器chrome和firefox对HTTPS的…

opencv:SIFT——尺度不变特征变换

SIFT概念: Sift(尺度不变特征变换),全称是Scale Invariant Feature Transform Sift提取图像的局部特征,在尺度空间寻找极值点,并提取出其位置、尺度、方向信息。 Sfit的应用范围包括 物体辨别、机器人地图…

pca(主成分分析技术)_主成分分析技巧

pca(主成分分析技术)介绍 (Introduction) Principal Component Analysis (PCA) is an unsupervised technique for dimensionality reduction.主成分分析(PCA)是一种无监督的降维技术。 What is dimensionality reduction?什么是降维? Let us start with an exam…

npm link run npm script

npm link & run npm script https://blog.csdn.net/juhaotian/article/details/78672390 npm link命令可以将一个任意位置的npm包链接到全局执行环境,从而在任意位置使用命令行都可以直接运行该npm包。 app-cmd.cmd #!/usr/bin/env nodeecho "666" &a…

一文详解java中对JVM的深度解析、调优工具、垃圾回收

2019独角兽企业重金招聘Python工程师标准>>> jvm监控分析工具一般分为两类,一种是jdk自带的工具,一种是第三方的分析工具。jdk自带工具一般在jdk bin目录下面,以exe的形式直接点击就可以使用,其中包含分析工具已经很强…

借用继承_博物馆正在数字化,并在此过程中从数据中借用

借用继承Data visualization is a great way to celebrate our favorite pieces of art as well as reveal connections and ideas that were previously invisible. More importantly, it’s a fun way to connect things we love — visualizing data and kicking up our fee…

高斯噪声,椒盐噪声的思想及多种噪声的实现

图像噪声: 概念: • 图像噪声是图像在获取或是传输过程中受到随机信号干扰,妨碍人们对图像理解及分析处理 的信号。 • 很多时候将图像噪声看做多维随机过程,因而描述噪声的方法完全可以借用随机过程的描述, 也就是使…

如何识别媒体偏见_描述性语言理解,以识别文本中的潜在偏见

如何识别媒体偏见TGumGum can do to bring change by utilizing our Natural Language Processing technology to shed light on potential bias that websites may have in their content. The ideas and techniques shared in this blog are a result of the GumGum Hackatho…

分享 : 警惕MySQL运维陷阱:基于MyCat的伪分布式架构

分布式数据库已经进入了全面快速发展阶段。这种发展是与时俱进的,与人的需求分不开,因为现在信息时代的高速发展,导致数据量和交易量越来越大。这种现象首先导致的就是存储瓶颈,因为MySQL数据库实质上还是一个单机版本的数据库&am…

数据不平衡处理_如何处理多类不平衡数据说不可以

数据不平衡处理重点 (Top highlight)One of the common problems in Machine Learning is handling the imbalanced data, in which there is a highly disproportionate in the target classes.机器学习中的常见问题之一是处理不平衡的数据,其中目标类别的比例非常…

最小二乘法以及RANSAC(随机采样一致性)思想及实现

线性回归–最小二乘法(Least Square Method) 线性回归: 什么是线性回归? 举个例子,某商品的利润在售价为2元、5元、10元时分别为4元、10元、20元, 我们很容易得出商品的利润与售价的关系符合直线&#xf…

糖药病数据集分类_使用optuna和mlflow进行心脏病分类器调整

糖药病数据集分类背景 (Background) Data science should be an enjoyable process focused on delivering insights and real benefits. However, that enjoyment can sometimes get lost in tools and processes. Nowadays it is important for an applied data scientist to…

Android MVP 框架

为什么80%的码农都做不了架构师?>>> 前言 根据网络上的MVP套路写了一个辣鸡MVP DEMO 用到的 android studio MVPHelper插件,方便自动生成框架代码rxjavaretrofit什么是MVP MVP就是英文的Model View Presenter,然而实际分包并不是只有这三个包…

相似图像搜索的哈希算法思想及实现(差值哈希算法和均值哈希算法)

图像相似度比较哈希算法: 什么是哈希(Hash)? • 散列函数(或散列算法,又称哈希函数,英语:Hash Function)是一种从任何一种数据中创建小 的数字“指纹”的方法。散列函数把消息或数…