大数据-213 数据挖掘 机器学习理论 - KMeans Python 实现 距离计算函数 质心函数 聚类函数

news2024/11/13 9:28:49

点一下关注吧!!!非常感谢!!持续更新!!!

目前已经更新到了:

  • Hadoop(已更完)
  • HDFS(已更完)
  • MapReduce(已更完)
  • Hive(已更完)
  • Flume(已更完)
  • Sqoop(已更完)
  • Zookeeper(已更完)
  • HBase(已更完)
  • Redis (已更完)
  • Kafka(已更完)
  • Spark(已更完)
  • Flink(已更完)
  • ClickHouse(已更完)
  • Kudu(已更完)
  • Druid(已更完)
  • Kylin(已更完)
  • Elasticsearch(已更完)
  • DataX(已更完)
  • Tez(已更完)
  • 数据挖掘(正在更新…)

章节内容

上节我们完成了如下的内容:

  • 无监督学习算法
  • KMeans 基本原理
  • KMeans 簇内误差平方和

在这里插入图片描述

Python实现

导入依赖

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from IPython.core.interactiveshell import InteractiveShell
InteractiveShell.ast_node_interactivity = "all"
# 解决坐标轴刻度负号乱码
plt.rcParams['axes.unicode_minus'] = False
# 解决中文乱码问题
plt.rcParams['font.sans-serif'] = ['Simhei']

导入数据集

此处使用鸢尾花数据集为例:

import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
%matplotlib inline
#导入数据集
iris = pd.read_csv("iris.txt",header = None)
iris.head()
iris.shape

执行结果如下图所示:
在这里插入图片描述

编写距离计算函数

我们需要定义一个两个长度相等的数组之间欧式距离计算函数,在不直接应用计算结果,只比较距离远近的情况下,我们可以用距离平方和代替距离进行比较,化简开平方运算,从而减少函数计算量。此外需要说明的是,涉及到距离计算的,一定要注意量纲的统一。
如果量纲不统一的话,模型极易偏向量纲大的那一方。

  • 函数功能:计算两个数据集之间的欧式距离
  • 输入:两个 array 数据集
  • 返回:两个数据集之间的欧式距离(此处用距离平方和代替距离)
def distEclud(arrA, arrB):
    d = arrA - arrB
    dist = np.sum(np.power(d, 2), axis=1)
    return dist

编写随机函数生成质心函数

在定义随机质心生成函数时,首先需要计算每列数值的范围,然后从该范围中随机生成指定个数的质心。

  • 函数功能:随机生成 k 个质心
  • 参数说明:dataSet 包含标签的数据集,k 是簇的个数,返回 data_cent 是 k 个质心
def randCent(dataSet, k):
    # n为列数,假设dataSet是一个DataFrame
    n = dataSet.shape[1]  # 获取数据集的列数(例如 iris 数据集有 5 列)
    
    # 获取每一列的最小值和最大值(仅使用前 n-1 列,最后一列是标签或类别)
    data_min = dataSet.iloc[:, :n-1].min()  # 前4列的最小值
    data_max = dataSet.iloc[:, :n-1].max()  # 前4列的最大值
    
    # 在最小值和最大值之间生成 k 个随机中心点,形状为 (k, n-1)
    data_cent = np.random.uniform(data_min, data_max, (k, n-1))
    
    return data_cent

经过上述定义,在 iris 中随机生成了三个质心:
执行对应的代码:

iris_cent = randCent(iris, 3)
iris_cent

执行结果如下图所示:
在这里插入图片描述

编写 K-Means 聚类函数

在执行 K-Means 的时候,需要不断的迭代质心,因此我们需要两个可迭代的容器来完成该目标:

  • 第一个容器用于存放和更新质心,该容器可考虑使用 list 来执行,list 不仅是可迭代对象,同时 list 内不同元素索引位置也可以用于标记和区分各质心,即各簇的编号:即代码中的 centroids。
  • 第二个容器则需要记录,保存和更新到各点到质心之间的距离,并能够方便对其进行比较,该容器考虑使用一个三列的数组来执行。

第二个容器中:

  • 第一列用于存放最近一次计算完成后某点到各质心的最短距离
  • 第二列用于记录最近一次计算完成后根据最短距离得到的代表对应质心的数值索引,即所述簇,即质心编号。
  • 第三列用于存放上一次某点对应质心编号(某点所属簇),后两列用于比较质心发生变化后某点所属簇的情况是否发生变化。

函数功能:K-均值聚类算法
参数说明:

  • dataSet 带标签数据集
  • k 簇的个数
  • distMeas 距离计算函数
  • createCent 随机质心生成函数

返回:

  • centroids 质心
  • result_set 所有数据划分结果
# 假设 distEclud 和 randCent 是你定义的距离测量函数和随机生成质心函数
def kMeans(dataSet, k, distMeas=distEclud, createCent=randCent):
    # 获取数据集的维度,m 是行数,n 是列数
    m, n = dataSet.shape  # m是行数(数据量),n是列数(例如 iris 为 150*5)

    # 初始化质心 centroids,生成 k 个随机质心
    centroids = createCent(dataSet, k)  # centroids 为 k*n 的矩阵(随机生成)

    # 初始化 clusterAssment 矩阵,用来存储每个点的簇分配结果
    # clusterAssment: [该行到最近质心的距离, 本次迭代中最近质心编号, 上次迭代中最近质心编号]
    clusterAssment = np.zeros((m, 3))  # 初始化为 m*3 的矩阵
    clusterAssment[:, 0] = np.inf  # 设置初始距离为无穷大
    clusterAssment[:, 1:3] = -1  # 质心编号初始化为 -1

    # 将数据集和 clusterAssment 合并,形成 result_set
    result_set = pd.concat([dataSet, pd.DataFrame(clusterAssment)], axis=1, ignore_index=True)

    # 标记簇是否发生变化
    clusterChanged = True

    while clusterChanged:
        clusterChanged = False
        # 遍历每个样本点,计算它与每个质心的距离,并更新簇分配信息
        for i in range(m):
            # 计算当前数据点到所有质心的距离
            dist = distMeas(dataSet.iloc[i, :n-1].values, centroids)  # 计算距离,dist 是 k*1 的矩阵
            # 记录最小距离和对应质心的索引
            result_set.iloc[i, n] = dist.min()  # 记录最小距离
            result_set.iloc[i, n+1] = np.where(dist == dist.min())[0][0]  # 记录最近质心的索引

        # 检查当前簇分配与上次是否完全一致
        clusterChanged = not (result_set.iloc[:, -1] == result_set.iloc[:, -2]).all()

        # 如果簇分配发生变化,则更新质心和 result_set
        if clusterChanged:
            # 根据新的簇分配,计算新的质心位置
            cent_df = result_set.groupby(n+1).mean()  # 根据最新簇分配,分组计算新的质心
            centroids = cent_df.iloc[:, :n-1].values  # 更新质心,使用新的均值作为质心

            # 更新簇分配编码,将当前簇分配替换为上次的簇分配
            result_set.iloc[:, -1] = result_set.iloc[:, -2]

    return centroids, result_set

将鸢尾花数据带进去,查看模型的效果:

iris_cent,iris_result = kMeans(iris, 3)
iris_cent
iris_result.head()

执行结果若下所示:
在这里插入图片描述
有几点需要特别注意:

  • 设置统一的操作对象 result_set,为了调用和使用的方便,这里将 clusterAssment 转换为了 DataFrame 并与输入 DataFrame 合并,组成的对象作为后续调用的统一对象,该对象内即保存了原始数据,也保存了迭代运算的中间结果,包括数据所属簇标记和数据质心距离等,该对象同时也作为最终函数的返回结果
  • 判断质心是否发生改变条件,在K-Means 中判断质心是否发生改变,即判断是否继续进行下一步迭代的依据并不是某点距离新的质心距离变短,而是某点新的距离向量(到各质心的距离)中最短的分量位置是否发生变化,即质心变化后某点是否应归属另外的簇,在质心变化导致各点所属簇发生变化的过程中,点到质心的距离不一定会变短,即判断条件不能用下述语句表示
  • 质心和类别一一对应,在最后生成的结果中,centroids的行标为 result_set 中各点所属类别

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

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

相关文章

【Pikachu】File Inclusion文件包含实战

永远也不要忘记能够笑的坚强,就算受伤,我也从不彷徨。 1.File Inclusion(文件包含漏洞)概述 File Inclusion(文件包含漏洞)概述 文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码…

材质(二)——材质参数化,从源材质继承生成不同的材质实例

继承原材质,对外提供参数。 更改调制不同的参数,生成不同的材质实例。 类似于,类的继承。有一个基类Base.继承生成为子类 A_Base,B_Base,C_Base

java的面向对象(从入门到深入)

目录 一、基本概念: 1.类 2.对象 3.继承 4.多态 5.封装 6.方法 7.接口 8.抽象 二、深入概念: 三:总结 一、基本概念: 1.类 类就是一个一个东西的蓝图,里面有着它的属性和方法。 2.对象 对象是一个类的实例化。 3.继承…

FPGA实现串口升级及MultiBoot(六)ICAPE2原语实例讲解

本文目录索引 一个指令和三种方式通过ICAPE2原语添加ICAPE2 IP构建Golden位流工程MultiBoot位流工程验证example2总结代码缩略词索引: K7:Kintex 7V7:Vertex 7A7:Artix 7MB:MicroBlaze上一篇文章种总结了MultiBoot 关键技术,分为:一个指令、二种位流、三种方式、四样错误。针…

自动泊车端到端算法 ParkingE2E 介绍

01 算法介绍 自主泊车是智能驾驶领域中的一项关键任务。传统的泊车算法通常使用基于规则的方案来实现。因为算法设计复杂,这些方法在复杂泊车场景中的有效性较低。 相比之下,基于神经网络的方法往往比基于规则的方法更加直观和多功能。通过收集大量专家…

sealos部署K8s,安装docker时master节点突然NotReady

1、集群正常运行中,在集群master-1上安装了dockerharbor,却发现master-1节点NotReady,使用的网络插件为 Cilium #安装docker和harbor(docker运行正常) rootmaster-1:/etc/apt# apt install docker-ce5:19.03.15~3-0~u…

什么是磁场探针台

探针台主要应用于半导体行业、光电行业、集成电路以及封装的测试。广泛应用于复杂、高速器件的精密电气测量的研发,旨在确保质量及可靠性,并缩减研发时间和器件制造工艺的成本。 磁场探针台就是在普通探针台的基础上,增加了磁性测量环境&…

【八百客CRM-注册安全分析报告-无验证方式导致安全隐患】

前言 由于网站注册入口容易被黑客攻击,存在如下安全问题: 1. 暴力破解密码,造成用户信息泄露 2. 短信盗刷的安全问题,影响业务及导致用户投诉 3. 带来经济损失,尤其是后付费客户,风险巨大,造…

iOS SmartCodable 替换 HandyJSON 适配记录

前言 HandyJSON群里说建议不要再使用HandyJSON,我最终选择了SmartCodable 来替换,原因如下: 首先按照 SmartCodable 官方教程替换 大概要替换的内容如图: 详细的替换教程请前往:使用SmartCodable 平替 HandyJSON …

✍Qt自定义带图标按钮

✍Qt自定义带图标按钮 📝问题引入 近段时间的工作中,有遇到这样一个需求 📝: 一个按钮,有normal、hover、pressed三种状态的样式,并且normal和hover样式下,字体颜色和按钮图标不一样。 分析…

OpenGL学习笔记(三) 绘制图形

glFrontFace(GL_CCW); // 设置CCW方向为“正面”&#xff0c;CCW即CounterClockWise&#xff0c;逆时针 glFrontFace(GL_CW); // 设置CW方向为“正面”&#xff0c;CW即ClockWise&#xff0c;顺时针#include <GL/glut.h>#include <math.h> void myDisplay(voi…

通过代码复习回忆 DiffusionDet: DiffusionTracker

DiffusionDet : DiffusionTracker复习回顾 之前的一段时间学习了基于扩散模型的检测于跟踪算法&#xff0c;最近在忙别的事情就导致了这里存在了很多和细节上的遗忘在这里进行一定的回顾&#xff0c;之后在试图看看可以进一步学习基于点集的扩散过程吗&#xff1f; Diffusion…

单体架构的 IM 系统设计

先直接抛出业务背景&#xff01; 有一款游戏&#xff0c;日活跃量&#xff08;DAU&#xff09;在两千左右&#xff0c;虽然 DAU 不高&#xff0c;但这两千用户的忠诚度非常高&#xff0c;而且会持续为游戏充值&#xff1b;为了进一步提高用户体验&#xff0c;继续增强用户的忠…

Java-字符串常量池

在Java程序中&#xff0c;类似于&#xff1a;1&#xff0c; 2&#xff0c; 3&#xff0c;3.14&#xff0c;“hello”等字面类型的常量经常频繁使用&#xff0c;为了使程序的运行速度更快、 更节省内存&#xff0c;Java为8种基本数据类型和String类都提供了常量池。 1.为什么要…

Wot Design Uni高颜值、轻量化的uni-app组件库 快速入门

一、简介 Wot Design Uni是一个基于Vue3和TypeScript开发的高颜值、轻量化的uni-app组件库。它提供了超过70个高质量组件&#xff0c;这些组件覆盖了移动端的主流场景&#xff0c;使得开发者能够更加高效地进行移动应用的开发。 以下是Wot Design Uni的一些主要特点&#xff…

maven依赖无法导入爆红问题

1、属于公司内部依赖&#xff0c;当前项目没有连接到公司Maven私服 2、之前本地已经下载过&#xff0c;但是下载中途失败了&#xff0c;产生了一个xxx.jar.lastUpdated文件&#xff0c;此时Maven不会对该依赖再下载 引入本地仓库依赖

MyBatis xml 文件中 SQL 语句的小于号未转义导致报错

问题现象 在 MyBatis 的 xml 文件中添加了一个 SQL 语句 <select id"countXxx" resultType"int">select count(*) from t1 where count < 3 </select>启动 Spring Boot 应用程序后报错&#xff1a; Caused by: org.apache.ibatis.builde…

前端学习之ES6+

1.ES6是什么 ES6&#xff0c;全称是ECMAScript 6&#xff0c;是JavaScript语言的下一代标准&#xff0c;由ECMA国际组织在2015年6月正式发布。ES6也被称作ECMAScript 2015&#xff0c;从这个版本开始&#xff0c;ECMA组织决定每年发布一个新的ECMAScript版本&#xff0c;以使J…

学习笔记:黑马程序员JavaWeb开发教程(2024.11.8)

5.10 分层解耦-分层解耦&#xff08;IOC-DI&#xff09; 在之前写的代码中&#xff0c;Controller层中new了一个Service层中的对象&#xff0c;在Service层中类名改变&#xff0c;则Controller层中也需要变化&#xff0c;这就是两个层之中耦合较重&#xff0c;需要减少耦…

Python常见并行化方法及性能对比

Python代码中通常有三种实现并行化的方法 multiprocessing的同步方法&#xff0c;mapmultiprocessing的异步方法&#xff0c;apply_asyncRay提供的并行或分布式能力 Ray 和 Python 的 multiprocessing 模块都是用于并行和分布式计算的工具&#xff0c;但它们在设计目标、功能…