kmeans对自己的图像数据集聚类(及肘部法求最佳K值)
pytorch实现kmeans(自己的图像数据集)
上篇笔记已经介绍了,如何加载自己的图像数据集。(加载数据集: https://blog.csdn.net/hnu_zzt/article/details/84766049 ) 这篇笔记介绍对自己的图像数据集用kmeans聚类。为了方便演示,我的数据集是1000张3×64×64的彩色图片,均放在test文件夹下。只需修改下文件夹路径就可以实现。详细代码和注释如下:
import torch
from torch.utils import data
from PIL import Image
import numpy as np
from torchvision import transforms
from numpy import *transform = transforms.Compose([transforms.ToTensor(), # 将图片转换为Tensor,归一化至[0,1]# transforms.Normalize(mean=[.5, .5, .5], std=[.5, .5, .5]) # 标准化至[-1,1]
])# 定义自己的数据集合
class FlameSet(data.Dataset):def __init__(self, root):# 所有图片的绝对路径imgs = os.listdir(root)self.imgs = [os.path.join(root, k) for k in imgs]self.transforms = transformdef __getitem__(self, index):img_path = self.imgs[index]pil_img = Image.open(img_path)if self.transforms:data = self.transforms(pil_img)else:pil_img = np.asarray(pil_img)data = torch.from_numpy(pil_img)return datadef __len__(self):return len(self.imgs)# 计算两个矩阵的距离
def euclDistance(vector1, vector2):return sqrt(sum(power(vector2 - vector1, 2)))# 在样本集中随机选取k个样本点作为初始质心
def initCentroids(dataSet, k):numSamples, dim = dataSet.shape # 矩阵的行数、列数centroids = zeros((k, dim)) # 感觉要不要你都可以for i in range(k):index = int(random.uniform(0, numSamples)) # 随机产生一个浮点数,然后将其转化为int型centroids[i, :] = dataSet[index, :]return centroids# k-means cluster
# dataSet为一个矩阵
# k为将dataSet矩阵中的样本分成k个类
def kmeans(dataSet, k):numSamples = dataSet.shape[0] # 读取矩阵dataSet的第一维度的长度,即获得有多少个样本数据# first column stores which cluster this sample belongs to,# second column stores the error between this sample and its centroidclusterAssment = mat(zeros((numSamples, 2))) # 得到一个N*2的零矩阵clusterChanged = True## step 1: init centroidscentroids = initCentroids(dataSet, k) # 在样本集中随机选取k个样本点作为初始质心while clusterChanged:clusterChanged = False## for each samplefor i in range(numSamples): # rangeminDist = 100000.0minIndex = 0## for each centroid## step 2: find the centroid who is closest# 计算每个样本点与质点之间的距离,将其归内到距离最小的那一簇for j in range(k):distance = euclDistance(centroids[j, :], dataSet[i, :])if distance < minDist:minDist = distanceminIndex = j## step 3: update its cluster# k个簇里面与第i个样本距离最小的的标号和距离保存在clusterAssment中# 若所有的样本不在变化,则退出while循环if clusterAssment[i, 0] != minIndex:clusterChanged = TrueclusterAssment[i, :] = minIndex, minDist ** 2 # 两个**表示的是minDist的平方## step 4: update centroidsfor j in range(k):# clusterAssment[:,0].A==j是找出矩阵clusterAssment中第一列元素中等于j的行的下标,返回的是一个以array的列表,第一个array为等于j的下标pointsInCluster = dataSet[nonzero(clusterAssment[:, 0].A == j)[0]] # 将dataSet矩阵中相对应的样本提取出来centroids[j, :] = mean(pointsInCluster, axis=0) # 计算标注为j的所有样本的平均值print('Congratulations, cluster complete!')print(clusterAssment)return centroids, clusterAssment
#centroids为k个类别,其中保存着每个类别的质心
#clusterAssment为样本的标记,第一列为此样本的类别号,第二列为到此类别质心的距离 if __name__ == '__main__':# 数据预处理temp = FlameSet('./test')dataSet = np.zeros((1000, 12288)) # 数据集的大小为1000*12288# print(dataSet.shape)for i in range(1000): # test中共1000张图片arr = temp[i].numpy() # 将将Tensor张量转化为numpy矩阵arr = arr.reshape(12288) # 将矩阵拉成向量dataSet[i][:] = dataSet[i][:] + arr # 添加到数据集中,每一行表示一张图片信息# print(dataSet)kmeans(dataSet, 3)
显示结果:
第一列为此样本的类别号,第二列为到此类别质心的距离。
接下来介绍如何选取较为合适的K值。使用各个簇内的样本点到所在簇质心的距离平方和(SSE)作为性能度量,越小则说明各个类簇越收敛。
# 肘部法求最佳K值
# 使用各个簇内的样本点到所在簇质心的距离平方和(SSE)作为性能度量,越小则说明各个类簇越收敛。
# 将clusterAssment的第二列求和就行
def chooseK(dataSet, i):list = []for j in range(1, i):centroids, clusterAssment = kmeans(dataSet, j)sum0 = sum(clusterAssment[:, 1])list.append(sum0)print(list)fig = plt.figure()ax = fig.add_subplot(111)ax.plot(list)plt.show()
指定一个i值,即可能的最大类簇数。然后将类簇数从1开始递增,一直到i,计算出i个SSE。根据数据的潜在模式,当设定的类簇数不断逼近真实类簇数时,SSE呈现快速下降态势,而当设定类簇数超过真实类簇数时,SSE也会继续下降,当下降会迅速趋于缓慢。通过画出K-SSE曲线,找出下降途中的拐点,即可较好的确定K值。
可参考:https://blog.csdn.net/weixin_41548818/article/details/82590817
kmeans对自己的图像数据集聚类(及肘部法求最佳K值)相关推荐
- K-Means聚类分析广告投放效果的改进(数据标准化、最佳K值的确定)
业务场景: 甲公司投放广告的渠道很多,每个渠道的客户性质也可能不同,比如在优酷视频投广告和今日头条投放广告,效果可能会有差异.现在需要对广告效果分析实现有针对性的广告效果测量和优化工作. 1 导入相关 ...
- 肘方法确定聚类数k_肘方法确定KMeans聚类的最佳K值
当Kmeans聚类的K没有指定时,可以通过肘部法来估计聚类数量 K_means参数的最优解是以成本函数最小化为目标,成本函数为各个类畸变程度之和,每个类的畸变程度等于该类重心与其内部成员位置距离的平方 ...
- 在K-Means算法中使用肘部法寻找最佳聚类数
1.from scipy.cluster.vq import kmeans包的介绍: 输入 数据集和簇的数量 返回 聚类中心坐标(codebook).观测值与生成的质心之间的平均(非平方)欧氏距离(d ...
- 【sklearn练习】KMeans ---- Seeds(小麦种子)数据集聚类评估
文章目录 一.数据集探索 二.数据预处理 三.构建模型获取结果 四.聚类结果可视化 五.聚类模型评估 ① 轮廓系数 ② 卡林斯基 - 哈拉巴斯指数 ③ FMI评价法 一.数据集探索 Seeds 数据集 ...
- K均值聚类(KMeans)、可视化选取最佳K值、通过TSNE进行结果可视化分析、抽取核心特征因子
K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标. k ...
- R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值、并与层次聚类的最优K值进行比较
R语言Kmeans聚类.抽取Kmeans聚类找到的聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(Average average silhouett ...
- KMeans聚类 K值的确定以及初始类簇中心点的选取
KMeans算法是最常用的聚类算法,基本思想是:在给定K值和K个初始类簇中心点的情况下,把每个样本点分到离其最近的簇中,然后重新计算每个簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的 ...
- 机器学习之K-Means聚类(python手写实现+使用Silhouette Coefficient来选取最优k值)
文章目录 K-Means Silhouette Coefficient(轮廓系数) 代码实现 参考 K-Means K-Means聚类又叫K均值聚类,是一种线性时间复杂度的聚类方法,也是比较成熟的一种 ...
- matlab实现肘部法(手肘法)确定kmeans方法k值
Author:HanDi 上海某高校遥感专业 工科男 相信积微者速成,相信分享的力量 CSDN@这可真是难为我了 数学建模时用K-means分类时确定K值遇见的一个小问题,上网查,发现matlab版本 ...
最新文章
- 能量视角下的GAN模型:GAN=“挖坑”+“跳坑”
- 临时表与表变量深入探究
- 开源工具 @sap/ux-ui5-tooling 介绍
- 一根火柴可以将一瓶大可乐吊起来吗?
- python上传文件到linux服务器_python上传大文件到服务器报错
- java并查集找朋友圈_图—并查集(解决朋友圈问题)
- mysql query cache 关闭_为什么要关闭MySQL query cache-Fun言
- mapreduce复制连接的代码_MapReduce:在大型集群上简化数据处理(2)
- AutoHotKey Script解密
- zend studio使用xdebug调试程序不能单步调试的解决方案
- Centos7 网络配置 设置静态Ip
- SpringBoot 2.0参数校验Hibernate Validator
- vm14卡顿及安装linux黑屏问题
- 知乎热议最丑陋的数学公式:「四次方程求根」高票当选
- C语言_推箱子小游戏
- mysql枚举类型enum用法6_mysql中的枚举类型ENUM的用法
- vue2 typescript 项目 如何引入antd -ui组件
- ssh 远程脚本执行 java: command not found
- Cesium 拾取 API 完全总结
- 哈工大SCIR倾力打造NLP新书,详解预训练语言模型
热门文章
- c语言中void明明没有return为什么还可以使用结果,为什么要在void的函数里面使用return语句呢?(C语言)...
- 【案例精选】聚铭网络助力成武县综合行政执法局推进日志审计优化
- 哈夫曼树,二叉树结点个数计算
- echarts实现GIS可视化——热力图
- plupload+ssm
- 可行加权最小二乘法_最小二乘法和加权最小二乘法
- mac下搭建PHP开发环境
- DHCP(一)-BOOTP引导程序协议小结
- K-modes聚类-全中文特征-非数值型特征
- springboot内嵌tomcat的jar包启动流程