K-means聚类算法

article/2025/10/1 17:22:57

实训目标
本实训项目介绍无监督学习中,使用最广泛的 K-means 聚类算法。
先修知识
本实训项目假设,你已经掌握了初步的 Python 程序设计的基础知识。学习者若有一些 numpy 的使用经验,则可更快速地通过实训。
实训知识点
欧几里得距离
估算簇集中心
评估聚类效果
K-means算法框架

第1关:计算欧几里得距离

任务描述
本关实现一个函数来计算欧几里得距离。

相关知识
K-means 算法的核心思想是,将数据集中的样本聚类为多个簇集,簇内样本距离较近,簇间样本距离较远。由此可见,其最基本的运算是判断样本(如书籍、电影、用户、汽车等)之间的距离(或者相似度)。

通常数据集中的样本都可描述为一个 n 维向量在这里插入图片描述
。每一个维度代表样本的一个属性。比如,对于用户 x 而言,其属性可能是收入、年龄、工作时间等,对于电影而言,其属性可能是出品年份、导演、风格等。本关卡学习欧几里得度量。

欧几里得度量(Euclidean metric)(也称欧氏距离)是一个常用的距离定义,计算 n 维空间中,两个样本点之间的几何距离。

两个在 n 维空间的点 在这里插入图片描述
的欧几里得距离为:
在这里插入图片描述

编程要求
本关卡要求你实现函数 euclid_distance,在右侧编辑器 Begin-End 区间补充代码,需要填充的代码块如下:

#-- coding: utf-8 --
import numpy as np
def euclid_distance(x1, x2):
“”“计算两个点之间点欧式距离
参数:
x1-numpy数组
x2-numpy数组
返回值:
ret-浮点型数据
“””
# 请在此添加实现代码 #
ret = 0
#********** Begin #
#
* End ***********#
return ret
测试说明
平台将对你的函数输入两个 Numpy 数组,计算欧式距离,比对函数 euclid_distance 的输出结果与正确结果的差异,只有完全正确才能进入下一关。

开始你的任务吧,祝你成功!

# -*- coding: utf-8 -*-
import numpy as np
def euclid_distance(x1, x2):"""计算欧几里得距离参数:x1 - numpy数组x2 - numpy数组返回值:distance - 浮点数,欧几里得距离"""distance = 0#   请在此添加实现代码     ##********** Begin *********#import numpy as npdistance = np.sqrt(np.sum((x1-x2)**2))#********** End ***********#return distance

第2关:计算样本的最近邻聚类中心

任务描述
本关实现一个函数来计算距离每个样本最近的簇中心。

相关知识
在前一个关卡中,我们学习了欧几里得距离计算函数,对于任意两个样本,我们可以得出其距离远近。本关,我们基于这个函数,来计算距离每个样本最近的簇中心。

聚类算法中一个重要的步骤就是,来计算每个样本最近的簇中心。对于一个样本 x 和 k 个簇中心在这里插入图片描述
,我们可以通过如下公式计算距离 x 最近的簇 i。

在这里插入图片描述

其中公式:

在这里插入图片描述

代表样本 x 与簇中心C i的欧几里得距离,argmin i代表最小值所在的序号 i。

编程要求
本关卡要求你实现函数 nearest_cluster_center,在右侧编辑器 Begin-End 区间补充代码,需要填充的代码块如下:

#-- coding: utf-8 --
#-- coding: utf-8 --
def nearest_cluster_center(x, centers):
“”“计算各个聚类中心与输入样本最近的
参数:
x - numpy数组
centers - numpy二维数组
返回值:
cindex - 整数,簇中心的索引值,比如3代表分配x到第3个聚类中
“””
cindex = -1
from distance import euclid_distance
# 请在此添加实现代码 #
#********** Begin #
#
* End ***********#
return cindex
测试说明
平台将对你的函数输入一个整数向量代表样本和一个二维数组代表一组簇向量,比对函数 nearest_cluster_center 的输出结果与正确结果的差异,只有完全正确才能进入下一关。

开始你的任务吧,祝你成功!

# -*- coding: utf-8 -*-
def nearest_cluster_center(x, centers):"""计算各个聚类中心与输入样本最近的参数:x - numpy数组centers - numpy二维数组返回值:cindex - 整数,类中心的索引值,比如3代表分配x到第3个聚类中"""cindex = -1from distance import euclid_distance#   请在此添加实现代码     ##********** Begin *********##计算点到各个中心的距离n_clusters = len(centers)distance_list = []for cluster_index in range(n_clusters):distance_list.append((cluster_index, euclid_distance(x, centers[cluster_index])))#找出最小距离的类distance_list = sorted(distance_list, key=lambda s:s[1])cindex = distance_list[0][0]#********** End ***********#    return cindex

第3关:计算各聚类中心

任务描述
本关实现一个函数来计算各簇的中心。

相关知识
在前一个关卡中,我们实现了一个函数来计算距离每个样本最近的簇中心,这样每一个样本都有了所属的簇团,从而将一堆数据分成了 n 个簇,也就是 n 个类。

K-means 算法是一个迭代优化算法,每次迭代我们需要重新计算簇的中心。一般就是通过计算每个簇类所有样本的平均值来获得。可以使用 Numpy 里面的 mean 方法np.mean(x,0)来计算均值。

编程任务
本关卡要求你实现函数 estimate_centers,在右侧编辑器 Begin-End 区间补充代码,需要填充的代码块如下:

#-- coding: utf-8 --
import numpy as np
def estimate_centers(X, y_estimated, centers):
“”“重新计算各聚类中心
参数:
X - numpy二维数组,代表数据集的样本特征矩阵
y_estimated - numpy数组,估计的各个样本的聚类中心索引
n_clusters - 整数,设定的聚类个数
返回值:
centers - numpy二维数组,各个样本的聚类中心
“””
centers = np.zeros((n_clusters, X.shape[1]))
# 请在此添加实现代码 #
#********** Begin #
#
* End ***********#
return centers
测试说明
输入一组向量(数据集)、一个数组(每个元素分配的类中心编号)和一组向量(各聚类中心),输出一组向量(各聚类中心)。平台比对函数 estimate_centers 的输出结果与正确结果的差异,只有完全正确才能进入下一关。

开始你的任务吧,祝你成功!

# -*- coding: utf-8 -*-
def estimate_centers(X, y_estimated, n_clusters):"""重新计算各聚类中心参数:X - numpy二维数组,代表数据集的样本特征矩阵y_estimated - numpy数组,估计的各个样本的聚类中心索引n_clusters - 整数,设定的聚类个数返回值:centers - numpy二维数组,各个样本的聚类中心"""import numpy as npcenters = np.zeros((n_clusters, X.shape[1]))#   请在此添加实现代码     ##********** Begin *********#for i in range(n_clusters):centers[i] = np.mean(X[y_estimated==i], 0)#********** End ***********#return centers    

第4关:评估聚类效果

本关任务
本关实现准确度评估函数,来评估聚类算法的效果。

相关知识
在前三个关卡中,我们学习了 K-measn 聚类算法中,三个比较关键的组成部分,包括欧几里得距离计算公式、找出每个样本的最近邻簇中心和重新计算每个簇的聚类中心。本关卡中,我们将学习评估聚类算法优劣的方法。

通常对于一个具有 K 个簇的数据集 {(x,y)},x 是单个样本,y (1<=y<=K)是其所在的簇标识。我们的聚类算法会针对每个样本 x 输出一个他所在的簇,记为y’(1<=y’<=K)。为了评估聚类算法的效果,我们需要比较算法得出的 y’和实际数据集中的簇 y 的差异。

一种比较常见的评估聚类算法好坏的指标就是精度,定义为:

在这里插入图片描述

其中 N 是数据集中的样本个数,公式:

在这里插入图片描述

代表比较函数,若两者相等则输出 1,否则输出 0。

编程要求
本关卡要求你实现函数 acc,在右侧编辑器 Begin-End 区间补充代码,需要填充的代码块如下:

#-- coding: utf-8 --
def acc(x1, x2):
“”“计算精度
参数:
x1 - numpy数组
x2 - numpy数组
返回值:
value - 浮点数,精度
“””
value = 0
# 请在此添加实现代码 #
#********** Begin #
#
* End ***********#
return value
测试说明
平台将对你的函数输入两个整数向量,比对函数 acc 的输出结果与正确结果的差异,只有完全正确才能通关。

开始你的任务吧,祝你成功!

# -*- coding: utf-8 -*-
def acc(x1, x2):"""计算精度参数:x1 - numpy数组x2 - numpy数组返回值:value - 浮点数,精度"""value = 0#   请在此添加实现代码     ##********** Begin *********#import numpy as npvalue = float(np.sum(x1==x2))/len(x1)#********** End ***********#return value

第5关:组合已实现的函数完成K-means算法

本关任务
本关综合前面四个关卡的内容来实现K-means聚类算法。

相关说明
K-means是一类非常经典的无监督机器学习算法,通常在实际应用中用于从数据集中找出不同样本的聚集模式,其基本原理就是类中样本的距离要远远小于类间样本的距离。

K-means聚类算法的流程如下:
首先从数据集在这里插入图片描述


中随机选择k个样本作为簇中心在这里插入图片描述

然后,进入T轮迭代,在每个迭代中执行以下两个步骤。

一、对于每个样本 x i,计算距离其最近的簇中心
在这里插入图片描述

二、对于每一个簇j,重新计算其簇中心

在这里插入图片描述

其含义实际上就是对于每一个簇j,计算分配在其中的样本向量的平均值。

编程任务
本关卡要求你完整如下代码块中星号圈出来的区域,实现K-means的核心算法步骤:

#-- coding: utf-8 --
import numpy as np
import pandas as pd
from distance import euclid_distance
from estimate import estimate_centers
from loss import acc
from near import nearest_cluster_center
#随机种子对聚类的效果会有影响,为了便于测试,固定随机数种子
np.random.seed(5)
#读入数据集
dataset = pd.read_csv(‘./data/iris.csv’)
#取得样本特征矩阵
X = dataset[[‘150’,‘4’,‘setosa’,‘versicolor’]].as_matrix()
y = np.array(dataset[‘virginica’])
#读入数据
n_clusters, n_iteration = input().split(‘,’)
n_clusters = int(n_clusters)#聚类中心个数
n_iteration = int(n_iteration)#迭代次数
#随机选择若干点作为聚类中心
point_index_lst = np.arange(len(y))
np.random.shuffle(point_index_lst)
cluster_centers = X[point_index_lst[:n_clusters]]
#开始算法流程
y_estimated = np.zeros(len(y))
#请在此添加实现代码 #
#********** Begin #
#
* End ***********#
print(‘%.3f’ % acc(y_estimated, y))
测试说明
平台将比对你的实现代码与正确结果的差异,结果正确则祝贺你完成了本实训。

# -*- coding: utf-8 -*-
import numpy as np
import pandas as pd
from distance import euclid_distance
from estimate import estimate_centers
from loss import acc
from near import nearest_cluster_center
#随机种子对聚类的效果会有影响,为了便于测试,固定随机数种子
np.random.seed(5)
#读入数据集
dataset = pd.read_csv('./data/iris.csv')
#取得样本特征矩阵
X = dataset[['150','4','setosa','versicolor']].as_matrix()
y = np.array(dataset['virginica'])
#读入数据
n_clusters, n_iteration = input().split(',')
n_clusters = int(n_clusters)#聚类中心个数
n_iteration = int(n_iteration)#迭代次数
#随机选择若干点作为聚类中心
point_index_lst = np.arange(len(y))
np.random.shuffle(point_index_lst)
cluster_centers = X[point_index_lst[:n_clusters]]
#开始算法流程
y_estimated = np.zeros(len(y))
#   请在此添加实现代码     #
#********** Begin *********#
for iter in range(n_iteration):for xx_index in range(len(X)):#计算各个点最接近的聚类中心y_estimated[xx_index] = nearest_cluster_center(X[xx_index], cluster_centers)#计算各个聚类中心cluster_centers = estimate_centers(X, y_estimated, n_clusters)
#********** End ***********#
print('%.3f' % acc(y_estimated, y))

欢迎大家加我微信学习讨论
在这里插入图片描述


http://chatgpt.dhexx.cn/article/hU4xcaD3.shtml

相关文章

一文详解激光点云的物体聚类

点击上方“3D视觉工坊”&#xff0c;选择“星标” 干货第一时间送达 文章导读 本文针对自动驾驶中三维点云的道路目标聚类进行讲解&#xff0c;从聚类算法的原理出发&#xff0c;介绍几种常用的点云障碍物聚类算法&#xff0c;并对比分析算法的优劣和适用场景&#xff0c;从工程…

[计算机毕业设计]模糊聚类算法

前言 &#x1f4c5;大四是整个大学期间最忙碌的时光,一边要忙着准备考研,考公,考教资或者实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过…

51nod-1548:欧姆诺姆和糖果

1548 欧姆诺姆和糖果 题目来源&#xff1a; CodeForces 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 一天&#xff0c;欧姆诺诺姆来到了朋友家里&#xff0c;他发现了许多糖果。有蓝色和红色两种。他知道每颗…

android自动导入包快捷键,Android studio 自动导入(全部)包 import

http://blog.csdn.net/buaaroid/article/details/44979629 1 Android studio 只有import单个包的快捷键:Alt+Enter。没有Eclipse下的快速导入包的快捷键Ctrl+Shift+O。 2 但Android studio设置里有一项Auto Import自动导入功能。设置过程如下: Android studio --> File--&…

舍友打一把游戏的时间,我实现了一个selenium自动化测试并把数据保存到MySQL

文章目录 前言最终效果开发环境selenium元素定位方法页面分析思路分析实现步骤运行结果以下是全部代码 前言 很久没有玩selenium自动化测试了&#xff0c;近日在学习中都是在忙于学习新的知识点&#xff0c;所以呢今天就来写个selenium自动化测试的案例吧。有没有人疑惑&#…

51nod P1381 硬币游戏【数学】

题目 思路 比较简单. 参考代码 #include<iostream> #include<cstdio> using namespace std; int T,n; int main() {scanf("%d",&T);while(T--){scanf("%d",&n);printf("%d\n",2*n);}return 0; }

51nod3061 车

题目 题目链接 解题思路 提一种不需要生成树的解法。 我们将询问挂到点上&#xff0c;使用启发式合并的并查集。当询问的两边合并到一起时&#xff0c;我们就得到了答案。 整体复杂度 O ( n l o g 2 n ) O(nlog_2n) O(nlog2​n)。 代码 #include <cstdio> #include &…

51nod 1279 扔盘子

题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1279 题目: 有一口井,井的高度为N,每隔1个单位它的宽度有变化。现在从井口往下面扔圆盘,如果圆盘的宽度大于井在某个高度的宽度,则圆盘被卡住(恰好等于的话会下去)。 盘子有几种命运:1、掉到…

51nod 1352:集合计数

1352 集合计数 基准时间限制&#xff1a;1 秒 空间限制&#xff1a;131072 KB 分值: 20 难度&#xff1a;3级算法题 收藏 关注 给出N个固定集合{1&#xff0c;N},{2,N-1},{3,N-2},...,{N-1,2},{N,1}.求出有多少个集合满足&#xff1a;第一个元素是A的倍数且第二个元素是B的倍数…

51nod 1266 蚂蚁

题目链接&#xff1a;https://www.51nod.com/onlineJudge/questionCode.html#!problemId1266 题目&#xff1a; n只蚂蚁以每秒1cm的速度在长为Lcm的竿子上爬行。当蚂蚁爬到竿子的端点时就会掉落。由于竿子太细&#xff0c;两只蚂蚁相遇时&#xff0c;它们不能交错通过&#xff…

51nod3155 跳房子

3155 跳房子 小华正在和她的小伙伴玩跳房子游戏。这是一个加强版的跳房子&#xff0c;每一行的格子数量可能超过 2 个。 这个游戏需要在地面上画了n排格子&#xff0c;其中第i排包含a[i]个格子。&#xff08;保证两端的这两排仅有一个格子&#xff09; 之后规定两端的这两个格…

Pycharm中用Appium框架编写第一个自动化脚本

一.环境依赖 Node.js appium python jdk Android SDK Appium-Python-Client Appium-doctor 二.环境搭建 提醒&#xff1a;安装路径如果要自定义的话尽量不要出现中文&#xff0c;不然很容易出现各种报错&#xff01; cmd尽量用管理员身份运行 1.Node.js 下载地址&am…

软件行为(五)之数据存储

笔者愚见&#xff1a;数据的存储方式是软件行为中的重中之重。 存储数据大约有4个地方&#xff1a;寄存器、高速缓存、内存及硬盘等。其中cpu对数据的访问速度也是依次降低&#xff0c;如下图 上图从上到下也是cpu访问数据的顺序&#xff0c;CPU的数据去寄存区去拿&#xff0c…

探究业界云存储平台(1):开源的软件定义存储—CoprHD

在接下来的两章中&#xff0c;我将分别为大家介绍与分析三款软件定义存储解决方案&#xff1a;CoprHD、Ceph与ScaleIO&#xff0c;并对后两者进行性能比较分析。 一、开源的软件定义存储—CoprHD 了解开源的CoprHD&#xff08;CoprHD&#xff09;&#xff0c;需要先了解EMC V…

软件定义存储2.0,谁领风骚?

关注我们牛年牛气冲天 中国的软件定义存储&#xff08;SDS&#xff09;市场就像是早上八九点钟的太阳&#xff0c;那样耀眼&#xff0c;生机勃勃&#xff0c;富有朝气。IDC的报告显示&#xff0c;2020年全年&#xff0c;中国SDS市场规模同比增长51.7%&#xff0c;相比2019年&am…

软件定义存储

在一个生成的数据和数据种类都空前大量的时代&#xff0c;软件定义的存储赋予了企业有效应对此爆炸式增长的途径。 当然&#xff0c;随着营销机器在过去几年的大肆渲染&#xff0c;我们越来越难以了解软件定义的存储的确切含义。因此&#xff0c;为了更好地了解软件定义的存储可…

软件定义存储的逆袭

近日&#xff0c;IDC《2017年第二季度中国软件定义存储及超融合市场跟踪报告》的发布在国内软件定义存储&#xff08;SDS&#xff09;和超融合&#xff08;HCI&#xff09;市场激起涟漪。去年还隐身于“Others”的一众厂商中&#xff0c;今年却一跃成为SDS市场前三&#xff0c;…

SDS软件定义存储

计算机发展到今天&#xff0c;软件定义已经是一种潮流&#xff0c;前有软件定义网络&#xff0c;后有软件定义存储。 对于软件定义存储来说&#xff0c;是随着当年EMC在EMC World上发布的软件定义存储战略迅速成为业界热点的。软件定义存储将硬件存储资源整合起来&#xff0c;…

基于对象的软件定义存储——联想 NetApp DXL系列对象存储方案

联想 DXL 系列对象存储 基于NetApp StorageGRID 技术的联想DXL系列对象存储是一款基于对象的软件定义的存储&#xff0c;它支持 Amazon Simple Storage Service (S3) API 等行业标准对象 API。您可以利用它在全球范围内的 16 个数据中心之间构建一个单一名称空间&#xff0c;并…

软件定义的存储时代即将结束

数据存储、安全性、保护和整体管理对于大多数组织的生存至关重要。 从软件定义的存储时代的结束到本地存储的回归&#xff0c;Nyriad的首席营收官概述了他对最新技术趋势的看法&#xff0c;并提供了他对2023年将会发生的预测。 从以CPU为中心的软件定义存储过渡到卸载辅助架构…