K-Means聚类

文章目录

    • 概要
    • 整体架构流程
    • 技术名词解释
    • 技术细节
    • 小结

概要

K-means聚类算法实现

技术细节

选取的数据集是sklearn.datasets里面的鸢尾花数据集,方便最后的算法评价

根据手肘法(即根据SSE代价函数)得出最合适的k值。

此处思路是先根据E=\sum_{i}^{k}\sum\left | x-\bar{x_{i}} \right |^{2}

定义函数sse,然后在find_k函数中作出sse关于k值变化的点图,得到k=3为最合适的。

然后为了与后续操作形成更加明显的对比,先作了数据集的两组数据的相关散点图。代码和结果如下:

初始簇中心的选择:

此处随机选择最靠前的K个样本作为初始聚类中心。

因为是分为三簇,此处的思想是先利用cdist()函数计算各样本点到上一次迭代的聚类中心的距离,根据各点对应的距离最小值得到各样本点所在的簇。将各簇存在同一个列表中进行存储。并利用list的sum()函数除以列表长度计算聚类中心的坐标。最终返回分类后的各簇情况和聚类中心组成的列表。

每次迭代classification函数都是一次簇的更新运算。

后面的代码利用了迭代的方式,如果得到的聚类中心与上一次的聚类中心不同就对数据对象进行重新分配,最终得到最后的聚类中心和聚类情况。

输出结果:

此处的思想是直接读取迭代结束后返回的存放聚类情况的列表a,分别用不同的点的样式表示各簇数据,并将最后的三个聚类中心标出,最终可视化得到如下图。

代码

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import KMeans
from sklearn.datasets import load_iris
from scipy.spatial.distance import cdist
iris = load_iris()
X = iris.data[:]
def sse(k,X):#代价函数x=0km=KMeans(n_clusters=k)km.fit(X)d=cdist(X,km.cluster_centers_)for i in d:x+=min(i)**2return x
def find_k(X):#绘图y=[]k=np.arange(1,10)for i in k:y.append(sse(i,X))plt.scatter(k, y, c = "blue", marker='+', label='label2')plt.xlabel('k')plt.ylabel('sse')plt.show()
def show(X):# 取其中两个维度,绘制原始数据散点分布图# x, y为散点坐标,c是散点颜色,marker是散点样式(如'o'为实心圆)x=[]y=[]for i in X:x.append(i[0])y.append(i[1])plt.scatter(x,y)#可视化一组数据# 横坐标轴标签plt.xlabel('sepal length')# 纵坐标轴标签plt.ylabel('sepal width')# plt.legend设置图例的位置plt.legend(loc=2)plt.show()
# print(iris)
def center(X,k):#随机选取聚类中心l=[]for i in range(k):l.append(list(X[i]))return l
def classification(X,l):a=[[],[],[]]b=[]d=cdist(X,l)for i in range(len(d)):for j in range(len(l)):if d[i][j]==min(d[i]):a[j].append(X[i])for i in range(len(a)):b.append(list(sum(a[i])/len(a[i])))return a,b#以l为聚类中心分类后的a和新聚类中心b
find_k(X)#根据SSE和K的关系,选择k=3
show(X)
l=center(X,3)
a,b=classification(X,l)
while True:if l==b:breakl=ba,b=classification(X,l)
print(b)
# 取其中两个维度,绘制聚类后散点分布图
# x, y为散点坐标,c是散点颜色,marker是散点样式(如'o'为实心圆)
x=[]
y=[]
for j in a[0]:x.append(j[0])y.append(j[1])
plt.scatter(x,y,marker='*')#可视化一组数据
x=[]
y=[]
for j in a[1]:x.append(j[0])y.append(j[1])
plt.scatter(x,y,marker='+')#可视化一组数据
x=[]
y=[]
for j in a[2]:x.append(j[0])y.append(j[1])
plt.scatter(x,y,marker='.')#可视化一组数据
x=[]
y=[]
for j in b:x.append(j[0])y.append(j[1])
plt.scatter(x,y,marker='o')#可视化一组数据# 横坐标轴标签
plt.xlabel('sepal length')# 纵坐标轴标签
plt.ylabel('sepal width')# plt.legend设置图例的位置
plt.legend(loc=2)
plt.show()

小结

        刚开始无法确定合适的k值查阅了很多资料,最终决定利用手肘法。不过感觉手肘法是通过先聚类然后得出合适的k值的,感觉还是有点更适合最后作为算法评价标准。可是看到资料上大部分确定k值的方法都是需要先利用KMeans函数进行计算,感觉这个k值的确定还是比较值得思考的一个问题。

        在聚类过程中还有被聚类情况的存储形式所困扰,尝试过用字典还有其他形式的列表存储,最后在后面编码的过程中,才想到用列表里面的元素表示不同簇。

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

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

相关文章

ZJU Beamer学习手册(二)

ZJU Beamer学习手册基于 Overleaf 的 ZJU Beamer模板 进行解读,本文则基于该模版进行进一步修改。 参考文献 首先在frame文件夹中增加reference.tex文件,文件内容如下。这段代码对参考文献的引用进行了预处理。 \usepackage[backendbiber]{biblatex} \…

最全的接口自动化测试思路和实战:【推荐】混合测试自动化框架(关键字+数据驱动)

混合测试自动化框架(关键字数据驱动) 关键字驱动或表驱动的测试框架 这个框架需要开发数据表和关键字。这些数据表和关键字独立于执行它们的测试自动化工具,并可以用来“驱动"待测应用程序和数据的测试脚本代码,关键字驱动测试看上去与手工测…

【wp】2023第七届HECTF信息安全挑战赛 Web

伪装者 考点:http协议flask的session伪造ssrf读取文件 首先根据题目要求就行伪造HTTP 这里不多说,比较基础 然后下面得到是个登入 页面,我们输入zxk1ing 得到 说什么要白马王子 ,一眼session伪造 看到ey开头感觉是jwt 输入看看 得…

DrugMAP: molecular atlas and pharma-information of all drugs学习

DrugMAP:所有药物的分子图谱和制药信息 - PMC (nih.gov) DrugMAP: the molecular atlas and pharma-information of drugs (idrblab.net) 构建了一个描述药物分子图谱和药物信息的新数据库(DrugMAP)。它提供了>30 000种药物/候选药物的相…

深入了解域名与SSL证书的关系

在如今数字化的世界里,网络安全成为我们关注的重要议题之一。为了确保数据在网络上传输的安全性,我们通常会采取各种安全措施,其中最常用的就是SSL证书。然而,很多人并不了解SSL证书是如何与域名相互关联的。 首先,我…

深入理解栈与队列:从基本概念到高级实现

💓 博客主页:江池俊的博客⏩ 收录专栏:数据结构探索👉专栏推荐:✅cpolar ✅C语言进阶之路💻代码仓库:江池俊的代码仓库🔥编译环境:Visual Studio 2022🎉欢迎大…

李宏毅2023机器学习作业HW05解析和代码分享

ML2023Spring - HW5 相关信息: 课程主页 课程视频 Sample code HW05 视频 HW05 PDF 个人完整代码分享: GitHub | Gitee | GitCode 运行日志记录: wandb P.S. HW05/06 是在 Judgeboi 上提交的,完全遵循 hint 就可以达到预期效果。 因为无法在 Judgeboi 上…

计算机系统的层次结构和性能指标

目录 五层结构三个级别语言 计算机性能指标CPU性能指标系统整体的性能指标 五层结构 三个级别语言 编译程序:将高级语言编写的源程序全部语句一次全部翻译成机器语言程序,而后再执行机器语言程序(只需翻译一次) 解释程序&#xff…

常见树种(贵州省):003柏类

摘要:本专栏树种介绍图片来源于PPBC中国植物图像库(下附网址),本文整理仅做交流学习使用,同时便于查找,如有侵权请联系删除。 图片网址:PPBC中国植物图像库——最大的植物分类图片库 一、柏木 …

windows上安装MySQL Server.

进入官网 MySQL 找到 下载,并点进入。 往下翻,找到社区下载,进入页面 选择 Mysql community Server 选择系统,下载 之后解压。 将解压文件夹下的bin路径添加到变量值中 配置初始化的my.ini文件 [mysqld] # 设置3306端口 port330…

Java中锁的深入理解

目录 对象头的理解 Monitor(锁) 锁类型 偏向锁 偏向锁的优化机制 轻量级锁 重量级锁 对象头的理解 在32位Java虚拟机中普通对象的对象头是占用8个字节,其中4个字节为Mark Word。用来存储对象的哈希值,对象创建后在JVM中的…

C++ 运算符重载详解

本篇内容来源于对c课堂上学习内容的记录 通过定义函数实现任意数据类型的运算 假设我们定义了一个复数类&#xff0c;想要实现两个复数的相加肯定不能直接使用“”运算符&#xff0c;我们可以通过自定义一个函数来实现这个功能&#xff1a; #include <iostream> using…