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.mzph.cn/news/149830.shtml

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

相关文章

【实用技巧】更改ArduinoIDE默认库文件位置,解放系统盘,将Arduino15中的库文件移动到其他磁盘

本文主要介绍更改Arduino IDE (含2.0以上版本)默认库文件位置的方法。 原创文章,转载请注明出处: 【实用技巧】更改ArduinoIDE默认库文件位置,解放C盘,将Arduino15中的库文件移动到其他磁盘-CSDN博客文章浏…

Kubernetes Dashboard部署ImagePullBackOff问题处理

通常,出现ImagePullBackOff问题是由于Kubernetes集群无法拉取所需的镜像导致的。解决这个问题的方法通常包括以下步骤: 1. 检查Pod的描述信息: kubectl describe pod/[pod名称] --namespacekubernetes-dashboard 查看Events部分是否有关于…

GOTS认证资讯-7.0版关于环境准则的要求

4.3. 环境准则 4.3.1. 环境管理政策 4.3.1.1. 除GOTS准则外,被认证实体应必须确保其加工或制造阶段(包括气体排放、废水排放和废弃物及污泥的处置)符合相应国家和当地环境法规的相关要求。 4.3.1.2. 被认证实体应拥有与其业务性质相适应的书面…

【Python百宝箱】图解未来:数据可视化引领智慧决策时代

图表和数据可视化在数据分析中的关键作用 引言: 在现代数据科学中,数据可视化扮演着至关重要的角色。通过图表和可视化工具,我们能够更直观、更有效地理解数据的分布、趋势和关联性。本文将深入讨论三个主要的数据可视化工具:mat…

Windows安装Java环境(OracleJDK)

在下载之前,我们先了解一下java的前世今生 1991年:Java 的前身 Oak 由 James Gosling 和他的团队在 Sun Microsystems 公司开发。1995年:Oak 更名为 Java,并在同年发布。Java 1.0 版本正式推出。1996年:Sun Microsyst…

Vue 2.0中引入的类型检查Flow

1. 认识 Flow Flow 是 facebook 出品的 JavaScript 静态类型检查工具。Vue.js 的源码利用了 Flow 做了静态类型检查,所以了解 Flow 有助于我们阅读源码。 2. 为什么用 Flow JavaScript 是动态类型语言,它的灵活性有目共睹,但是过于灵活的副…

XLua热更新框架原理和代码实战

安装插件 下载Xlua插件:https://github.com/Tencent/xLua 下载完成后,把Asset文件夹下的文件拖入自己的工程Asset中,看到Unity编辑器上多了个Xlua菜单,说明插件导入成功 Lua启动代码 新建一个空场景,场景中什么都不…

Threejs_06 多材质的实现

Threejs 同一个几何体如何实现多材质呢? 多材质的实现 1.使用索引绘制一个几何体 //创建几何体(三角形) const geometry new THREE.BufferGeometry();//使用索引绘制 (两个共用的) const vertices new Float32Array([-1.0, -1.0, 0.0, 1.0, -1.0, 0.0, 1.0, 1…

谈谈系统性能调优中都需要考虑哪些因素

一、 什么是性能调优? 这个系统好慢、网站又打不开了,太卡了,又没响应了,相信大家都遇到过用户的这种抱怨,此时,说明我们的应用系统出现了性能问题,那么怎么办呢,首先想到的应该是优…

npm私有云

安装node时npm会自动安装,npm也可以单独安装。 package.json 在使用npm时,package.json文件是非常重要的,因为它包含了关于项目的必要信息,比如名称、版本、依赖项等。在初始化新项目时,通常会使用npm init命令生成一…

HP惠普暗影精灵9笔记本电脑OMEN by HP Transcend 16英寸游戏本16-u0000原厂Windows11系统

惠普暗影9恢复出厂开箱状态,原装出厂Win11-22H2系统ISO镜像 下载链接:https://pan.baidu.com/s/17ftbBHEMFSEOw22tnYvPog?pwd91p1 提取码:91p1 适用型号:16-u0006TX、16-u0007TX、16-u0008TX、16-u0009TX、16-u0017TX 原厂系…

每天一道算法题(五)——判断一组数字是否连续,出现连续数字的时候以‘-’输出

文章目录 1、问题2、示例3、解决方法(0)错误示范——两个for循环遍历(1)方法1(递归)(2)方法2(推荐) 1、问题 实现一个函数,判断一组数字是否连续。当出现连续数字的时候以…

数据结构与算法编程题2

逆置线性表&#xff0c;使空间复杂度为 O(1) #include <iostream> using namespace std;typedef int ElemType; #define Maxsize 100 #define OK 1 #define ERROR 0 typedef struct SqList {ElemType data[Maxsize];int length; }SqList;void Init_SqList(SqList& …

YOLOV8部署Android Studio安卓平台NCNN

下载Android Studio&#xff0c;配置安卓开发环境&#xff0c;这个过程比较漫长。 安装cmake&#xff0c;注意安装的是cmake3.10版本。 根据手机安卓版本选择相应的安卓版本&#xff0c;我的是红米K30Pro&#xff0c;安卓12。 使用腾讯开源的ncnn&#xff0c;这是一个为手机端极…

驶入产业发展快车道,汉鑫科技人工智能研发中心正式启用!

11月18日&#xff0c;汉鑫科技人工智能研发中心正式启用。中心立足烟台&#xff0c;服务全国&#xff0c;聚焦工业智能、智能网联、智慧城市三大业务板块&#xff0c;以人工智能技术赋能政企实现“数智化”转型升级。该中心的启用标志着汉鑫科技在人工智能研发应用领域迈上了新…

移动端表格分页uni-app

使用uni-app提供的uni-table表格 网址&#xff1a;https://uniapp.dcloud.net.cn/component/uniui/uni-table.html#%E4%BB%8B%E7%BB%8D <uni-table ref"table" :loading"loading" border stripe type"selection" emptyText"暂无更多数据…

Java的构造器

构造器 1.package com.msb2; 2. 3./** 4. * Auther: msb-zhaoss 5. */ 6.public class Person { 7. //构造器&#xff1a;没有任何参数的构造器我们叫做&#xff1a;空参构造器--》空构造器 8. public Person(){ 9. /*age 19; 10. name "lili"…

【Nacos】配置管理、微服务配置拉取、实现配置热更新、多环境配置

&#x1f40c;个人主页&#xff1a; &#x1f40c; 叶落闲庭 &#x1f4a8;我的专栏&#xff1a;&#x1f4a8; c语言 数据结构 javaEE 操作系统 Redis 石可破也&#xff0c;而不可夺坚&#xff1b;丹可磨也&#xff0c;而不可夺赤。 Nacos 一、nacos实现配置管理1.1 统一配置管…

Taro安装及使用

安装及使用 安装​ Taro 项目基于 node&#xff0c;请确保已具备较新的 node 环境&#xff08;>12.0.0&#xff09;&#xff0c;推荐使用 node 版本管理工具 nvm 来管理 node&#xff0c;这样不仅可以很方便地切换 node 版本&#xff0c;而且全局安装时候也不用加 sudo 了…

不必购买Mac,这款国产设计工具能轻松替代Sketch!

介绍 即时设计是新一代可以直接在浏览器中使用的设计工具&#xff0c;具有Sketch和实时协作功能。与本地Sketch相比&#xff0c;增加了实时协作功能&#xff0c;即时设计可以看作是在线Sketch&#xff0c;两个工具可以简单粗暴地总结为一个公式&#xff1a; 即时设计Sketch云…