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值)相关推荐

  1. K-Means聚类分析广告投放效果的改进(数据标准化、最佳K值的确定)

    业务场景: 甲公司投放广告的渠道很多,每个渠道的客户性质也可能不同,比如在优酷视频投广告和今日头条投放广告,效果可能会有差异.现在需要对广告效果分析实现有针对性的广告效果测量和优化工作. 1 导入相关 ...

  2. 肘方法确定聚类数k_肘方法确定KMeans聚类的最佳K值

    当Kmeans聚类的K没有指定时,可以通过肘部法来估计聚类数量 K_means参数的最优解是以成本函数最小化为目标,成本函数为各个类畸变程度之和,每个类的畸变程度等于该类重心与其内部成员位置距离的平方 ...

  3. 在K-Means算法中使用肘部法寻找最佳聚类数

    1.from scipy.cluster.vq import kmeans包的介绍: 输入 数据集和簇的数量 返回 聚类中心坐标(codebook).观测值与生成的质心之间的平均(非平方)欧氏距离(d ...

  4. 【sklearn练习】KMeans ---- Seeds(小麦种子)数据集聚类评估

    文章目录 一.数据集探索 二.数据预处理 三.构建模型获取结果 四.聚类结果可视化 五.聚类模型评估 ① 轮廓系数 ② 卡林斯基 - 哈拉巴斯指数 ③ FMI评价法 一.数据集探索 Seeds 数据集 ...

  5. K均值聚类(KMeans)、可视化选取最佳K值、通过TSNE进行结果可视化分析、抽取核心特征因子

    K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大.该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标. k ...

  6. R语言Kmeans聚类、抽取聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(ASW)为Kmeans选择最优的聚类K值、并与层次聚类的最优K值进行比较

    R语言Kmeans聚类.抽取Kmeans聚类找到的聚类簇:fpc包的kmeansruns函数通过Calinski-Harabasz准则和平均轮廓系数(Average average silhouett ...

  7. KMeans聚类 K值的确定以及初始类簇中心点的选取

    KMeans算法是最常用的聚类算法,基本思想是:在给定K值和K个初始类簇中心点的情况下,把每个样本点分到离其最近的簇中,然后重新计算每个簇的中心点(取平均值),然后再迭代的进行分配点和更新类簇中心点的 ...

  8. 机器学习之K-Means聚类(python手写实现+使用Silhouette Coefficient来选取最优k值)

    文章目录 K-Means Silhouette Coefficient(轮廓系数) 代码实现 参考 K-Means K-Means聚类又叫K均值聚类,是一种线性时间复杂度的聚类方法,也是比较成熟的一种 ...

  9. matlab实现肘部法(手肘法)确定kmeans方法k值

    Author:HanDi 上海某高校遥感专业 工科男 相信积微者速成,相信分享的力量 CSDN@这可真是难为我了 数学建模时用K-means分类时确定K值遇见的一个小问题,上网查,发现matlab版本 ...

最新文章

  1. [ARM异常]-ARMV8-aarch32的异常向量表介绍
  2. MYSQL问题解决方案:Access denied for user 'root'@'localhost' (using password:YES)
  3. python3 安装pyinstaller_python3.7 打包(.exe)神器——pyinstaller 安装及用法
  4. c语言字符串的计算方法
  5. Java AIO 编程
  6. python原理书籍_python书籍推荐:《深入浅出深度学习:原理剖析与Python实践》
  7. HTTP协议入门——1.1版本
  8. opencv4.4.0函数手册_【文档更新】发布100ask_imx6ull用户手册V2.0和全新烧写工具
  9. 机器学习框架_一文了解机器学习框架-TensorFlow的原理和用途
  10. javascript中几个有意思的功能(目前5项) 1右键无效 2禁止网页复制 3禁止F5刷新 4新发现 5屏蔽js错误
  11. C++:缺省参数是怎样设置的?
  12. kali linux国内源
  13. C语言实现求最小公倍数。
  14. 订单超过 7 天不允许退货
  15. php38.xyz,GitHub - xyz9836/WeChatDeveloper: 【新】微信服务号+微信小程序+微信支付+支付宝支付...
  16. honor荣耀开启影像新时代?探寻其背后真正实力
  17. target=“_blank“有啥安全性问题?如何防范?
  18. 生于七八十年代,我们的童年是这样的
  19. 三井住友保险郑永强:一个区块链用得极溜的CIO
  20. 渝北统景碑口规划开发_渝北区御临河碑口水库主体工程开工建设

热门文章

  1. mysql executed_mysql 5.7 新特性之 (mysql.gtid_executed)-阿里云开发者社区
  2. 对付新上司,“三做四不做”,害人害己惹小人,吃亏是自己!
  3. 每日技巧分享:虚拟直播间软件哪个好?
  4. PowerMILL 2018 MTD机床搭建视频教程
  5. fastdfs nginx 文件跨域访问
  6. 大数据分析技术在新型智慧能源建设中的应用
  7. 在职老程序员考非全211硕士(计算机专业)经验
  8. 数据结构--堆栈应用:T型火车轨道的列车排列问题
  9. 计算器算贝塞尔公式_浅谈计算器的普及与中学数学教科书的关系
  10. 基于51单片机的简易电子数字计算器Proteus仿真