数据挖掘算法原理与实践:k-均值

news2024/11/25 18:55:04

目录

第一关:什么是质心

任务描述:

相关知识:

什么是质心:

编程要求:

测试说明:

第二关:动手实现k-均值

任务描述:

相关知识:

一、数据集介绍

二、k-means算法原理

三、k-means算法流程

四、如何确定k的值

编程要求:

测试说明:


第一关:什么是质心

任务描述:

本关任务:使用Pyhton编写一个能计算所有样本质心且将所有样本到质心距离按从小到大排序的方法。

相关知识:

为了完成本关任务,你需要掌握:1.什么是质心。

什么是质心:

K-means算法是一个基于距离的聚类方法,距离指的是每个样本到质心的距离。那么,这里所说的质心是什么呢?

其实,质心指的是样本每个特征的均值所构成的一个坐标。举个例子:假如有两个数据(1,1)(2,2)则这两个样本的质心为(1.5,1.5)

 

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,计算样本间距离distance(x, y, p=2)方法:

  • x:第一个样本的坐标
  • y:第二个样本的坐标
  • p:等于1时为曼哈顿距离,等于2时为欧氏距离

构造计算所有样本质心的方法cal_Cmass(data)

  • data:数据样本

与将所有样本到质心距离按从小到大排序的方法sorted_list(data,Cmass)

  • data:数据样本
  • Cmass:数据样本质心

测试说明:

只需返回预测结果即可,程序内部会检测您的代码,计算正确则视为通过。如:

输入:[[2,3,4],[4,5,6],[5,6,7]] 输出:[0.5773502691896255,2.309401076758503,2.886751345948129]

输入:[[8,8,8],[7,7,7],[9,9,9]] 输出:[0.0, 1.7320508075688772, 1.7320508075688772]

#encoding=utf8
import numpy as np

#计算样本间距离
def distance(x, y, p=2):
    '''
    input:x(ndarray):第一个样本的坐标
          y(ndarray):第二个样本的坐标
          p(int):等于1时为曼哈顿距离,等于2时为欧氏距离
    output:distance(float):x到y的距离      
    '''
    #********* Begin *********#
    dis2 = np.sum(np.abs(x-y)**p)
    dis = np.power(dis2,1/p)
    return dis    

    #********* End *********#
#计算质心
def cal_Cmass(data):
    '''
    input:data(ndarray):数据样本
    output:mass(ndarray):数据样本质心
    '''
    #********* Begin *********#
    Cmass = np.mean(data,axis=0)

    #********* End *********#
    return Cmass
#计算每个样本到质心的距离,并按照从小到大的顺序排列
def sorted_list(data,Cmass):
    '''
    input:data(ndarray):数据样本
          Cmass(ndarray):数据样本质心
    output:dis_list(list):排好序的样本到质心距离
    '''
    #********* Begin *********#
    dis_list = []
    for i in range(len(data)):
        dis_list.append(distance(Cmass,data[i][:]))
    dis_list = sorted(dis_list)

    #********* End *********#
    return dis_list

第二关:动手实现k-均值

任务描述:

本关任务:使用python实现kmeans方法,并对鸢尾花数据进行聚类。

相关知识:

为了完成本关任务,你需要掌握:1.k-means算法原理,2.k-means算法流程,3.如何确定k的值。

一、数据集介绍

鸢尾花数据集是一类多重变量分析的数据集,一共有150个样本,通过花萼长度花萼宽度花瓣长度花瓣宽度 4个特征预测鸢尾花卉属于(SetosaVersicolourVirginica)三个种类中的哪一类。

数据集中部分数据如下所示:

花萼长度花萼宽度花瓣长度花瓣宽度
5.13.51.40.2
4.93.21.40.2
4.73.11.30.2

其中每一行代表一个鸢尾花样本各个属性的值。

数据集中部分标签如下图所示:

标签
0
1
2

标签中的值0,1,2分别代表鸢尾花三种不同的类别。

我们可以直接使用sklearn直接对数据进行加载,代码如下:

from sklearn.datasets import load_iris
#加载鸢尾花数据集
iris = load_iris()
#获取数据特征与标签
x,y = iris.data.astype(int),iris.target

 不过为了能够进行可视化我们只使用数据中的两个特征:

  1. from sklearn.datasets import load_iris
  2. iris = load_iris()
  3. x,y = iris.data,iris.target
  4. x = x[:,2:]

可视化数据分布:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(x[:,0],x[:,1])
  3. plt.show()

可视化结果:

 我们可以先根据数据的真实标签查看数据类别情况:

  1. import matplotlib.pyplot as plt
  2. plt.scatter(x[:,0],x[:,1],c=y)
  3. plt.show()

效果如下:

 然后我们划分出训练集与测试集,训练集用来训练模型,测试集用来检测模型性能。代码如下:

  1. from sklearn.model_selection import train_test_split
  2. #划分训练集测试集,其中测试集样本数为整个数据集的20%
  3. train_feature,test_feature,train_label,test_label = train_test_split(x,y,test_size=0.2,random_state=666)

二、k-means算法原理

K-means算法是基于数据划分的无监督聚类算法,首先定义常数k,常数k表示的是最终的聚类的类别数,在确定了类别数k后,随机初始化k个类别的聚类中心(质心),通过计算每一个样本与聚类中心(质心)的距离,将样本点划分到距离最近的类别中。

三、k-means算法流程

k-means算法流程如下:

  1. 随机初始k个点,作为类别中心。
  2. 对每个样本将其标记为距离类别中心最近的类别。
  3. 将每个类别的质心更新为新的类别中心。
  4. 重复步骤2、3,直到类别中心的变化小于阈值。

过程如下图:

 

 

四、如何确定k的值

K-means算法中,K值作为一个超参数,它的值需要我们自己来确定,通常k默认5。当然我们也可以写一个循环,将k等于各个值的结果输出,选择最好的结果的k值。部分代码如下:

  1. for i in range(k):
  2. km = KMmeans(i)

编程要求:

根据提示,在右侧编辑器Begin-End处补充代码,实现kmeans方法,其中距离设为欧氏距离

测试说明:

程序会调用你实现的方法对鸢尾花数据进行聚类,若聚类结果与正确结果吻合度大于0.95则视为通关。

#encoding=utf8
import numpy as np

# 计算一个样本与数据集中所有样本的欧氏距离的平方
def euclidean_distance(one_sample, X):
    '''
    input:
        one_sample(ndarray):单个样本
        X(ndarray):所有样本
    output:
        distances(ndarray):单个样本到所有样本的欧氏距离平方
    '''
    #*********Begin*********#
    one_sample = one_sample.reshape(1, -1)
    distances = np.power(np.tile(one_sample, (X.shape[0], 1)) - X, 2).sum(axis=1)

    #*********End*********#
    return distances

# 从所有样本中随机选取k个样本作为初始的聚类中心
def init_random_centroids(k,X):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
    output:
        centroids(ndarray):k个簇的聚类中心
    '''
    #*********Begin*********#
    n_samples, n_features = np.shape(X)
    centroids = np.zeros((k, n_features))
    for i in range(k):
        centroid = X[np.random.choice(range(n_samples))]
        centroids[i] = centroid

    #*********End*********#
    return centroids

# 返回距离该样本最近的一个中心索引
def _closest_centroid(sample, centroids):
    '''
    input:
        sample(ndarray):单个样本
        centroids(ndarray):k个簇的聚类中心
    output:
        closest_i(int):最近中心的索引
    '''
    #*********Begin*********#
    distances = euclidean_distance(sample, centroids)
    closest_i = np.argmin(distances)

    #*********End*********#
    return closest_i

# 将所有样本进行归类,归类规则就是将该样本归类到与其最近的中心
def create_clusters(k,centroids, X):
    '''
    input:
        k(int):聚类簇的个数
        centroids(ndarray):k个簇的聚类中心
        X(ndarray):所有样本
    output:
        clusters(list):列表中有k个元素,每个元素保存相同簇的样本的索引
    '''
    #*********Begin*********#
    clusters = [[] for _ in range(k)]
    for sample_i, sample in enumerate(X):
        centroid_i = _closest_centroid(sample, centroids)
        clusters[centroid_i].append(sample_i)


    #*********End*********#
    return clusters

# 对中心进行更新
def update_centroids(k,clusters, X):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
    output:
        centroids(ndarray):k个簇的聚类中心
    '''
    #*********Begin*********#
    n_features = np.shape(X)[1]
    centroids = np.zeros((k, n_features))
    for i, cluster in enumerate(clusters):
        centroid = np.mean(X[cluster], axis=0)
        centroids[i] = centroid

    #*********End*********#
    return centroids

# 将所有样本进行归类,其所在的类别的索引就是其类别标签
def get_cluster_labels(clusters, X):
    '''
    input:
        clusters(list):列表中有k个元素,每个元素保存相同簇的样本的索引
        X(ndarray):所有样本
    output:
        y_pred(ndarray):所有样本的类别标签
    '''
    #*********Begin*********#
    y_pred = np.zeros(np.shape(X)[0])
    for cluster_i, cluster in enumerate(clusters):
        for sample_i in cluster:
            y_pred[sample_i] = cluster_i


    #*********End*********#
    return y_pred

# 对整个数据集X进行Kmeans聚类,返回其聚类的标签
def predict(k,X,max_iterations,varepsilon):
    '''
    input:
        k(int):聚类簇的个数
        X(ndarray):所有样本
        max_iterations(int):最大训练轮数
        varepsilon(float):最小误差阈值
    output:
        y_pred(ndarray):所有样本的类别标签
    '''
    #*********Begin*********#
    # 从所有样本中随机选取k样本作为初始的聚类中心
    centroids = init_random_centroids(k,X)

    # 迭代,直到算法收敛(上一次的聚类中心和这一次的聚类中心几乎重合)或者达到最大迭代次数
    for _ in range(max_iterations):

        # 将所有进行归类,归类规则就是将该样本归类到与其最近的中心
        clusters = create_clusters(k,centroids, X)
        former_centroids = centroids

        # 计算新的聚类中心
        centroids = update_centroids(k,clusters, X)

        # 如果聚类中心几乎没有变化,说明算法已经收敛,退出迭代
        diff = centroids - former_centroids
        if diff.any() < varepsilon:
            break
    y_pred = get_cluster_labels(clusters, X)

    #*********End*********#
    return y_pred









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

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

相关文章

基于PHP+MySQL医院管理系统的设计与开发

随着各种医疗条件的发展,人们在寻医就药的时候更希望通过信息化的方式进行挂号等一系列操作,为此各大医院也开发出了配套的医院管理系统,方便医生和患者就诊,本系统就是这样通过PHP和MySQL开发的系统 PHP&#xff1a;MySQL医院管理系统根据实际情况分为了管理员,医生和患者三部…

Ubuntu上安装部署k8s集群

Ubuntu上安装部署k8s集群一、基础环境准备&#xff08;一&#xff09;环境说明1.主机说明&#xff08;二&#xff09;环境操作1. 设置Master与工作节点的机器名称及配置2. 解析主机3. 写入以下内容(注意IP地址和主机名换成自己的)&#xff1a;4. 虚拟内存swap分区关闭5. 开启防…

新零售时代下的实体门店步履维艰,实体门店应该如何起死回生吗?

传统实体店在新零售时代的下&#xff0c;大众的消费习惯早已经发生天翻地覆的变化&#xff0c;因而实体行业受到新型消费带来的冲击&#xff0c;再加上电商平台的迅速崛起与发展&#xff0c;实体门店更加是步履维艰。因此改变是必然&#xff0c;那么传统实体店想要转型走新零售…

万字深剖进程地址空间(全程干货)

目录前言一、程序地址空间1.程序地址空间的简图(1)正文代码(2)初始化数据(3)未初始化数据(4)堆区(5)共享区(6)栈区(7)命令行参数和环境变量2.实验&#xff1a;验证程序地址空间中各个区域的存在3.实验&#xff1a;验证堆区和栈区中地址的增长方向4.实验&#xff1a;如何理解sta…

算法设计与分析 SCAU17104 视频流有效调度

17104 视频流有效调度 时间限制:1000MS 代码长度限制:10KB 提交次数:25 通过次数:9 题型: 编程题 语言: G;GCC;VC;JAVA Description 现在n个视频流要在一条通信链路上一个接一个的传送。视频流i由bi位组成&#xff0c;这些位需要一个常数速率&#xff0c; 在ti秒内被发送。你…

lua-快速入门学习

lua-快速入门学习 安装 centos环境&#xff1a; yum install lua windows&#xff1a; window 下你可以使用一个叫 “SciTE” 的 IDE环 境来执行 lua 程序&#xff0c;下载地址为&#xff1a; Github 下载地址&#xff1a;https://github.com/rjpcomputing/luaforwindows/…

基于JavaSpringmvc+Vue+elementUI大学生求职招聘系统详细设计实现

博主介绍&#xff1a;✌全网粉丝20W,csdn特邀作者、博客专家、CSDN新星计划导师、java领域优质创作者,博客之星、掘金/华为云/阿里云/InfoQ等平台优质作者、专注于Java技术领域和毕业项目实战✌ &#x1f345;文末获取联系&#x1f345;精彩专栏推荐订阅&#x1f447;&#x1f…

前端开发技巧记录

1.取数组最后一位 let arr[1,2,3,4,5] console.log(arr[arr.length-1]) //5 console.log(arr.at(-1)) // 52.用??代替||&#xff0c;判空 ||运算符是左边是‘’ false 0 null undifined等&#xff0c;都会返回后侧的值。而??必须运算符左侧的值为null或undefined时&#x…

智能家居系统 QT

一 环境范围设置 &#xff08;1&#xff09;界面添加新控件 在mainwindow.ui 添加控件&#xff1a; 控件的类型 文本内容 对象名&#xff08;唯一&#xff09; 是否有槽函数 QLabel <温度< lable_随意 否 QLabel <湿度< lable_随意 否 QLabel <光…

CTF-misc练习(https://buuoj.cn)之第一页

一、金胖子 1.打开gif&#xff0c;看到有东西闪过&#xff0c;把gif分帧保存 2.就得到flag&#xff1a; 二、二维码 1.分析压缩包&#xff1a; 2.解压图片&#xff0c;分析图片&#xff0c;还有一个隐藏文件&#xff1a; 3.分离图片&#xff1a; 4.图片需要输入密码&#xff…

android studio 加载html文件(备忘)

android studio版本&#xff1a;2021.2.1 例程名称&#xff1a;htmlFile 我做的一个小东西需要一个软件协议之类的&#xff0c;之前直接用textview做&#xff0c;修改起来太麻烦&#xff0c;所以改成加载html文件&#xff0c;即解决了txt可能被修改的问题&#xff0c;如果下次…

python 3 - Clipspy模块使用

一、clipspy安装&#xff1a; Clipspy底层是基于clips规则引擎开发、支持python3的一个模块&#xff0c;在python3的工程中&#xff0c;可以通过调用clipsy的API接口实现clips规则引擎。 在线安装&#xff1a; pip install clipspy 当出现Successfully installed字样时&…

从零开始的深度学习之旅(3)

目录神经网络的损失函数1.损失函数的引入2.损失函数3.回归&#xff1a;误差平方和SSE3.1 MSE的使用3.2 二分类交叉熵损失函数3.3 极大似然估计推导二分类交叉熵损失3.4 用tensor实现二分类交叉熵损失4.多分类交叉熵损失函数4.1 实现多分类交叉熵损失神经网络的损失函数 1.损失…

Excel - 获取帮助信息,查找Sheet中和VBA里的可用函数

Excel获取帮助信息 在使用Excel时&#xff0c;可以点击菜单的Help&#xff0c;可以获取帮助信息或Training。 点击Help帮助信息&#xff1a; 如果你觉得查看不方便&#xff0c;开可以使用浏览器&#xff0c;访问官网线上支持文档&#xff1a; Excel help & learning 而点击…

【微服务】GateWay概念与使用

一、API 网关功能&#xff1a; 路由到指定位置&#xff1a;后台管理系统经常给各个服务发送请求&#xff0c;某一个服务掉线了&#xff0c;我们不可能手动去修改端口号&#xff0c;让它去其他机器找。因此&#xff0c;需要 API 网关&#xff0c;让其帮助我们将请求路由到正确位…

【华为OD机试真题 python】竖直四子棋【2022 Q4 | 200分】

■ 题目描述 【竖直四子棋】 竖直四子棋的棋盘是竖立起来的,双方轮流选择棋盘的一列下子,棋子因重力落到棋盘底部或者其他棋子之上,当一列的棋子放满时,无法再在这列上下子。 一方的4个棋子横、竖或者斜方向连成一线时获胜。 现给定一个棋盘和红蓝对弈双方的下子步骤,…

学会问问题

推荐文档&#xff1a;学会问问题&#xff1b; 目录 三句话原则 你就是孙子 问问题过程 第一步—学会问好 示例如下 第二步—有屁快放 问问题需要加上的前缀或者后缀&#xff1a; 示例如下 第三步—介绍自己的框架 示例如下 第四步—介绍自己的解决思路 示例如下 …

spring cache (Redis方式)

目录前置pom: jar配置文件: application.ymlMyCacheConfig.java效果图前置 会演示springcache的使用方式 项目地址: https://gitee.com/xmaxm/test-code/blob/master/chaim-cache/chaim-spring-cache/chaim-spring-cache-redis/README.md 前置配置 本篇文章是基于上篇文章进行…

Flutter 使用FFI+CustomPainter实现全平台渲染视频

Flutter视频渲染系列 第一章 Android使用Texture渲染视频 第二章 Windows使用Texture渲染视频 第三章 Linux使用Texture渲染视频 第四章 全平台FFICustomPainter渲染视频&#xff08;本章&#xff09; 文章目录Flutter视频渲染系列前言一、如何实现1、C/C实现视频采集&#xf…

3. 使用PyTorch深度学习库训练第一个卷积神经网络CNN

这篇博客将介绍如何使用PyTorch深度学习库训练第一个卷积神经网络&#xff08;CNN&#xff09;。训练CNN使用 KMNIST 数据集&#xff08;MNIST digits数据集的替代品&#xff0c;内置在PyTorch中&#xff09;识别手写平假名字符&#xff08;handwritten Hiragana characters&am…