【聚类】K-Means聚类

cluster:簇

原理:

这边暂时没有时间具体介绍kmeans聚类的原理。简单来说,就是首先初始化k个簇心;然后计算所有点到簇心的欧式距离,对一个点来说,距离最短就属于那个簇;然后更新不同簇的簇心(簇内所有点的平均值,也就是簇内点的重心);循环往复,直至簇心不变达到规定的迭代次数

python实现

我们这边通过调用sklearn.cluster中的kmeans方法实现kmeans聚类

入门

原始数据的散点图

from sklearn.cluster import KMeans
import numpy as np
import matplotlib.pyplot as plt# 数据
class1 = 1.5 * np.random.randn(100,2) #100个2维点,标准差1.5正态分布
class2 = 1.5*np.random.randn(100,2) + np.array([5,5])#标准正态分布平移5,5# 画出数据的散点图
plt.figure(0,dpi = 300)
plt.scatter(class1[:,0],class1[:,1],c='y',marker='*')
plt.scatter(class2[:,0],class2[:,1],c='k',marker='.')
plt.axis('off')  # 不显示坐标轴
plt.show()

kmeans聚类

#---------------------------kmeans--------------------
# 调用kmeans函数
features = np.vstack((class1,class2))
kmeans = KMeans(n_clusters=2)
kmeans .fit(features)plt.figure(1,dpi = 300)#满足聚类标签条件的行
ndx = np.where(kmeans.labels_==0)
plt.scatter(features[ndx,0],features[ndx,1],c='b',marker='*')ndx = np.where(kmeans.labels_==1)
plt.scatter(features[ndx,0],features[ndx,1],c='r',marker='.')
# 画出簇心
plt.scatter(kmeans.cluster_centers_[:,0],kmeans.cluster_centers_[:,1],c='g',marker='o')plt.axis('off')   # 去除画布边框
plt.show()

进一步:选择簇心k的值 

前面的数据是我们自己创建的,所以簇心k是我们自己可以定为2。但是在实际中,我们不了解数据,所以我们需要根据数据的情况确定最佳的簇心数k。

这是下面用到的数据data11_2.txt【免费】这是kmean聚类中用到的一个数据资源-CSDN文库

簇内离差平方方和与拐点法(不太好判断)

定义w是簇内的点,m_i是簇的重心。

则所有簇的簇内离差平方和的和为J_k = \sum_{i=1}^{k} \sum_{w \in G_i} ||w-m_i||^2。然后通过可视化的方法,找到拐点,认为突然变化的点就是寻找的目标点,因为继续随着k的增加,聚类效果没有大的变化

借助python中的“md = KMeans(i).fit(b),md.inertia_”实现。

import numpy as np
from sklearn.cluster import KMeans
import pylab as pltplt.rcParams['font.sans-serif'] = ['SimHei']  # 显示中文
a = np.loadtxt('data/data11_2.txt')  # 加载数
b=(a-a.min(axis=0))/(a.max(axis=0)-a.min(axis=0))  # 标准化# 求出k对应的簇内离差平均和的和
SSE = []; K = range(2, len(a)+1)
for i in K:md = KMeans(i).fit(b)SSE.append(md.inertia_)  # 它表示聚类结果的簇内平方误差和(Inertia)# 可视化
plt.figure(1)
plt.title('k值与离差平方和的关系曲线')
plt.plot(K, SSE,'*-');
# 生成想要的 x 轴刻度细化值
x_ticks = np.arange(2, 10, 1)
# 设置 x 轴刻度
plt.xticks(x_ticks)
plt.show()

通过上图可以看出k=3时,是个拐点。所有选择k=3。

轮廓系数法(十分客观)

定义样本点i的轮廓系数S_i = \frac{b_i-a_i}{max(a_i,b_i)},S_i代表样本点i的轮廓系数,a_i代表该点到簇内其他点的距离的均值;b_i分两步,首先计算该点到其他簇内点距离的平均距离,然后将最小值作为b_i。a_i表示了簇内的紧密度,b_i表示了簇间的分散度。

k个簇的总轮廓点系数定义为所有样本点轮廓系数的平均值。因此计算量大

总轮廓系数越接近1,聚类效果越好。簇内平均距离小,簇间平均距离大。

调用sklearn.metrics中的silhouette_score(轮廓分数)函数实现

#程序文件ex11_7.py
import numpy as np
import matplotlib.pyplot  as plt
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_score
plt.rcParams['font.sans-serif'] = ['SimHei']# 忽略警告
import warnings
# 使用过滤器来忽略特定类型的警告
warnings.filterwarnings("ignore")a = np.loadtxt('data/data11_2.txt')
b=(a-a.min(axis=0))/(a.max(axis=0)-a.min(axis=0))
S = []; K = range(2, len(a))
for i in K:md = KMeans(i).fit(b)labels = md.labels_S.append(silhouette_score(b, labels))
plt.figure(dpi = 300)
plt.title('k值与轮廓系数的关系曲线')
plt.plot(K, S,'*-'); plt.show()

综上两种方法,好像并没有什么最好的方法,离差平均和不好判断,轮廓系数又像上面的情况。感觉综合两种方法比较好 

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

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

相关文章

[Linux]文件系统

[Linux]文件系统 文件系统是操作系统的一部分,负责组织、存储和管理存储在外部设备上的文件和目录,也就是操作系统管理外设中的文件的策略。本文讲解的是Ext2文件系统。Linux操作系统使用的就是Ext系列的文件系统。 文章目录 [Linux]文件系统了解磁盘结构…

如何选择合适的HTTP代理服务器

HTTP代理服务器是一种常见的网络代理方式,它可以帮助用户隐藏自己的IP地址,保护个人隐私和安全。然而,选择合适的HTTP代理服务器并不容易,需要考虑多个因素。本文将介绍如何选择合适的HTTP代理服务器。 了解代理服务器的类型 HTT…

Web Components详解-Shadow DOM插槽

前言 插槽实际上也属于组件通信的一种方式,但是由于其强大的api和实用性,我将其单独拆开来介绍。 定义 Slot(插槽)是Web Components中一个重要的特性,它允许在组件内部定义占位符,以便父组件可以向其中插…

【Java并发】聊聊ReentrantReadWriteLock锁降级和StampedLock邮戳锁

面试题 1.你说你用过读写锁,锁饥饿问题是什么? 2.有没有比读写锁更快的锁? 3.StampedLock知道吗?(邮戳锁/票据锁) 4.ReentrantReadWriteLock有锁降级机制策略你知道吗? 在并发编程领域,有多线程进行提升整体性能&…

流程图 and/or/xor 讲解

and表示后续2个活动同时触发, or表示后续2个活动可触发其中的1个或2个,无排他性,也就是每个活动的触发不影响其他活动; xor表示后续2个活动只触发一个,有排他性,也就是只能触发其中一个。 示例演示“OR”…

云原生Kubernetes:Yaml文件编写

目录 一、理论 1.Kubernetes与yaml文件 二、实验 1.Kubernetes与yaml文件 三、问题 1.kubectl create 和 kubectl apply区别 四、总结 一、理论 1.Kubernetes与yaml文件 (1)Kubernetes支持管理资源对象的文件格式 Kubernetes支持YAML 和JSON 格…

基于微信小程序的智能垃圾分类回收系统,附源码、教程

博主介绍:✌程序员徐师兄、7年大厂程序员经历。全网粉丝30W、csdn博客专家、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ 1 简介 视频演示地址: 基于微信小程序的智能垃圾分类回收系统,可作为毕业设计 小…

PDF文件太大怎么办?三招教会你PDF文件压缩

PDF文件太大怎么办?这是许多人在处理PDF文件时遇到的问题。为了帮助大家解决这个问题,下面总结了三个可以解决PDF文件过大问题的方法,需要的朋友抓紧来看看吧~ 方法一:使用嗨格式压缩大师 嗨格式压缩大师是一款功能强大的PDF压缩…

无涯教程-JavaScript - IMSECH函数

描述 IMSECH函数以x yi或x yj文本格式返回复数的双曲正割。复数的双曲正割被定义为双曲余弦的倒数,即 六(z) 1/cosh(z) 语法 IMSECH (inumber)争论 Argument描述Required/OptionalInumberA complex number for which you want the hyperbolic secant.Required Notes Ex…

手机usb连接电脑上网怎么做?掌握2个方法即可!

“我的电脑不知道怎么就连不上网络了,之前好像听说可以使用手机usb连接网络上网,但是不知道具体应该怎么操作。有没有知道详细操作步骤的朋友可以分享一下呀!” 在需要临时共享手机网络连接或电脑无法连接Wi-Fi的情况下,将手机通过…

【C++基础】实现日期类

​👻内容专栏: C/C编程 🐨本文概括: C实现日期类。 🐼本文作者: 阿四啊 🐸发布时间:2023.9.7 对于类的成员函数的声明和定义,我们在类和对象上讲到过,需要进行…

c++通过tensorRT调用模型进行推理

模型来源: 算法工程师训练得到的onnx模型 c对模型的转换: 拿到onnx模型后,通过tensorRT将onnx模型转换为对应的engine模型,注意:训练用的tensorRT版本和c调用的tensorRT版本必须一致。 如何转换: 算法工…

2020年12月 C/C++(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

C/C++编程(1~8级)全部真题・点这里 第1题:数组指定部分逆序重放 将一个数组中的前k项按逆序重新存放。例如,将数组8,6,5,4,1前3项逆序重放得到5,6,8,4,1。 时间限制:1000 内存限制:65536 输入 输入为两行: 第一行两个整数,以空格分隔,分别为数组元素的个数n(1 < n…

在Qt5中SQLite3的使用

一、SQLite简要介绍 什么是SQLite SQLite是一个进程内的库&#xff0c;实现了自给自足的、无服务器的、零配置的、事务性的 SQL 数据库引擎。它是一个零配置的数据库&#xff0c;这意味着与其他数据库不一样&#xff0c;您不需要在系统中配置。 就像其他数据库&#xff0c;S…

基于javaweb的CT图像管理系统(servlet+jsp)

系统简介 本项目采用eclipse工具开发&#xff0c;jspservletjquery技术编写&#xff0c;数据库采用的是mysql&#xff0c;navicat开发工具。 三个角色&#xff1a;管理员&#xff0c;普通用户&#xff0c;医生 模块简介 管理员&#xff1a; 1、登录 2、用户管理 3、医生管…

ARM DIY(十)LRADC 按键

前言 ARM SOC 有别于单片机 MCU 的一点就是&#xff0c;ARM SOC 的 GPIO 比较少&#xff0c;基本上引脚都有专用的功能&#xff0c;因为它很少去接矩阵键盘、众多继电器、众多 LED。 但有时 ARM SOC 又需要三五个按键&#xff0c;这时候 LRADC 就是一个不错的选择&#xff0c;…

C# OpenVino Yolov8 Detect 目标检测

效果 项目 代码 using OpenCvSharp; using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using static System.Net.Mime.MediaT…

python趣味编程-数独游戏

数独游戏是一个用Python编程语言编写的应用程序。该项目包含可以显示实际应用程序的基本功能。该项目可以让修读 IT 相关课程并希望开发简单应用程序的学生受益。这个Python 数独游戏是一个简单的项目,可用于学习tkinter库的实践。这个数独游戏可以提供Python编程的基本编码技…

黑马JVM总结(三)

&#xff08;1&#xff09;栈内存溢出 方法的递归调用&#xff0c;没有设置正确的结束条件&#xff0c;栈会有用完的一天&#xff0c;导致栈内存溢出 可以修改栈的大小&#xff1a; 再次运行&#xff1a;减少了次数 案例二&#xff1a; 两个类的循环应用问题&#xff0c;导致Js…

linux-进程-execl族函数

exec函数的作用&#xff1a; 我们用fork函数创建新进程后&#xff0c;经常会在新进程中调用exec函数去执行另外一个程序。当进程调用exec函数时&#xff0c;该进程被完全替换为新程序。因为调用exec函数并不创建新进程&#xff0c;所以前后进程的ID并没有改变。 简单来说就是&…