【聚类】K-Means聚类

news/2024/5/20 10:15:42 标签: 聚类, kmeans, 机器学习

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 plt

plt.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.niftyadmin.cn/n/4999059.html

相关文章

90、00后严选出的数据可视化工具:奥威BI工具

90、00后主打一个巧用工具,绝不低效率上班,因此当擅长大数据智能可视化分析的BI数据可视化工具出现后,自然而然地就成了90、00后职场人常用的数据可视化工具。 奥威BI工具三大特点,让职场人眼前一亮! 1、零编程&…

c++11 标准模板(STL)(std::basic_stringstream)(四)

定义于头文件 <sstream> template< class CharT, class Traits std::char_traits<CharT> > class basic_stringstream;(C11 前)template< class CharT, class Traits std::char_traits<CharT>, class Allocator std::alloc…

【AWS实验 】在 AWS Fargate 上使用 Amazon ECS 部署应用程序

文章目录 实验概览目标实验环境任务 1&#xff1a;连接到实验命令主机任务 2&#xff1a;将应用程序容器化任务 3&#xff1a;构建 Web2048 容器任务 4&#xff1a;创建 Amazon ECR 存储库并推送 Docker 映像任务 5&#xff1a;创建 ECS 集群任务 6&#xff1a;测试应用程序总结…

Python开源项目周排行 2023年第32周

#2023年第32周2023年9月2日1htmx一款在Django技术栈最近比较热门的前端框架。 他的理念是—— 「让网页回归HTML的本质&#xff0c;不再受JS束缚」mx 出现在 2020 年&#xff0c;创建者Carson Gross 说 htmx 来源自他于 2013 年研究的一个项目intercooler.js。2020 年&#xff…

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测

时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测 目录 时序预测 | MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测预测效果基本介绍模型描述程序设计参考资料 预测效果 基本介绍 1.MATLAB实现TCN-GRU时间卷积门控循环单元时间序列预测&#xff1b; 2.运行环…

长胜证券:大模型行业将进入产品化落地的快车道

【长胜证券&#xff1a;大模型职业将进入产品化落地的快车道】第一批8家大模型获批上线&#xff0c;标志着大模型职业在我国正式进入产品化落地阶段。后续&#xff0c;阿里、腾讯、科大讯飞等公司的大模型产品也有望陆续获批&#xff0c;进一步加速AI产品化落地。国内大模型产品…

Java面试之斐波那契数列(Fibonacci)及其应用:青蛙跳台阶问题

文章目录 一、斐波那契数列问题1.1 题目1.2 什么是斐波那契数列1.3 效率很低的解法&#xff1a;递归1.4 递归缺点分析 二、比较好的解决办法2.1 保存数列中间项2.2 从下往上计算 三、公式法四、青蛙跳台阶问题4.1 题目及分析4.2 代码实现 一、斐波那契数列问题 1.1 题目 写一…

ubuntu安装gcc和gcc c++的命令

一、在 Ubuntu 中安装 gcc 编译器非常简单。你可以按照以下步骤进行操作&#xff1a; 打开终端&#xff1a;你可以按下 Ctrl Alt T 快捷键来打开终端&#xff0c;或者在应用菜单中搜索 “终端” 并打开它。 运行以下命令以更新软件包列表&#xff1a; sudo apt update这将检…