使用Julia语言和R语言实现K-均值

news2025/9/20 19:00:58

K-均值算法基础

  K-均值聚类算法属于一种无监督学习的方法,通过迭代的方式将数据划分为K个不重叠的子集(簇),每个子集由其内部数据点的平均值来表示。计算方法大体如下:

1.初始化簇中心

选择K个数据点作为初始的簇中心,簇中心可以随机选择的,也可以基于某种启发式方法选择,初始簇中心的选择对算法的最终结果有很大影响,不同的初始选择可能会导致完全不同的聚类结果

2.计算欧几里得距离

对于数据集中的每个点x_{i},计算它到各个簇中心\mu _j的距离d_{ij},通常使用欧几里得距离来计算。欧几里得距离衡量了数据点在多维空间中的实际距离,在K-均值算法中,数据点被分配给距离其最近的簇中心所在的簇。

d_{ij} = \sqrt{(x_i - \mu_j)^T(x_i - \mu_j)}

3.分配数据点

根据计算出的距离,将数据点分配给最近的簇。对于每个数据点x_i,找到距离它最近的簇中心\mu_{j^*},并将其分配给该簇。

4.更新簇中心

重新计算每个簇中所有数据点的平均值,并将该平均值设置为新的簇中心。对于每个簇C_j,新的簇中心\mu_j'计算如下:

5.终止迭代

重复步骤2、3和4,直到簇中心不再发生显著变化,或者达到预定的迭代次数。迭代终止条件可以表示为:

R语言数据集iris 

iris 数据集是 R 语言的内置数据集,其中包含了 3 种不同类型的鸢尾花(Iris flower)的观测数据,每种鸢尾花有 50 个样本,总共有 150 个样本。每个样本都包含了 4 个关于花萼(sepal)和花瓣(petal)的测量数据,以及鸢尾花的种类信息。

iris 数据集中的每个样本都包含以下 4 个数值型特征:

  1. Sepal.Length(花萼长度,单位是厘米)
  2. Sepal.Width(花萼宽度,单位是厘米)
  3. Petal.Length(花瓣长度,单位是厘米)
  4. Petal.Width(花瓣宽度,单位是厘米)

此外还有一个分类变量 Species,表示鸢尾花的种类,包含三个水平:setosaversicolor 和 virginica,分别对应山鸢尾、杂色鸢尾和维吉尼亚鸢尾。

在RStudio里可以输入 iris 来查看这个数据集的内容。

iris数据集内容:

Julia语言实现

  先进入Julia REPL导入需要的Julia包:

] # 进入包管理模式
add RDatasets # R语言的数据集
add DataFrames # 数据处理包
add Clustering # 提供 K-均值 功能包  
add Gadfly #绘图包

Julia语言实现K-均值代码:

using RDatasets  
using DataFrames  
using Clustering  
using Gadfly  
  
# 使用的R语言的iris 数据集  
iris = dataset("datasets", "iris")  
  
# 提取数据集的前四列作为特征矩阵,使用Matrix()函数把DataFrame的子集进行矩阵转换  
features = Matrix(iris[:, 1:4])
  
# 执行 K-means 聚类, 分成 3 个簇
k = 3 
results = kmeans(features, k)  
  
# 提取聚类分配结果  
assignments = results.assignments  
   
plot = Gadfly.plot(iris, x=:SepalLength, y=:SepalWidth, color=assignments, Geom.point)    
display(plot)

 代码运行后生成HTML图像

  

教材中旧版本代码 

# GGboy版本再次之上增加了数据集转换
using RDatasets
using Clustering
using Gadfly

mydata1 = dataset("datasets", "iris")
myf = convert(Array, mydata1[:,1:4])
myl = convert(Array, mydata1[:,5])

x = initseeds(:rand, convert(Matrix, myf'), 3)

myres = kmeans(myf, 3)
Gadfly.plot(mydata1, x = :PetalLength, y = PetalWidth, color = myres.assignments,
    Geom.point)

R语言实现

先导入 ggplot2包用于绘图

install.packages("ggplot2")

R语言实现K-均值代码: 

library(ggplot2)  

data(iris) 

# 提取前四列特征矩阵
features <- iris[, 1:4]  
k <- 3  # 执行 K-means 聚类, 分成 3 个簇
set.seed(123) # 设置随机种子以获得可重复的结果  
results <- kmeans(features, centers = k)  

iris$cluster <- as.factor(results$cluster)  

ggplot(iris, aes(x = Sepal.Length, y = Sepal.Width, color = cluster)) +  
  geom_point(size = 3, alpha = 0.8) +  
  theme_minimal() +  
  labs(title = "K-means Clustering",  
       x = "Sepal Length",  
       y = "Sepal Width",  
       color = "Cluster")

生成图像:
 

 Markdown版本计算公式及说明

# K-均值算法公式

## 1. 初始化簇中心

选择K个数据点作为初始的簇中心(质心)。这些点可以是随机选择的,也可以是基于某种启发式方法选择的。

初始簇中心的选择对算法的最终结果有很大影响。不同的初始选择可能会导致完全不同的聚类结果。因此,在实际应用中,通常会多次运行算法并使用不同的初始簇中心,然后选择其中最好的结果。

## 2. 计算欧几里得距离

对于数据集中的每个点\(x_i\),计算它到各个簇中心\(\mu_j\)的距离\(d_{ij}\)。通常使用欧几里得距离来计算。

\[d_{ij} = \sqrt{(x_i - \mu_j)^T(x_i - \mu_j)}\]

欧几里得距离是最常用的距离度量方法之一,它衡量了数据点在多维空间中的实际距离。在K-均值算法中,数据点被分配给距离其最近的簇中心所在的簇。

## 3. 分配数据点

根据计算出的距离,将数据点分配给最近的簇。对于每个数据点\(x_i\),找到距离它最近的簇中心\(\mu_{j^*}\),并将其分配给该簇。

\[j^* = \arg\min_{j=1,2,...,K} d_{ij}\]

这一步是根据距离度量将数据点划分到不同的簇中。每个数据点都被分配给距离其最近的簇中心所在的簇。这样,数据集就被划分成了K个不重叠的子集。

## 4. 更新簇中心

重新计算每个簇中所有数据点的平均值,并将该平均值设置为新的簇中心。对于每个簇\(C_j\),新的簇中心\(\mu_j'\)计算如下:

\[\mu_j' = \frac{1}{|C_j|} \sum_{x_i \in C_j} x_i\]

这一步是更新簇中心的过程。通过计算每个簇中所有数据点的平均值来得到新的簇中心。这些新的簇中心将用于下一轮的迭代计算中。

## 5. 终止迭代

重复步骤2、3和4,直到簇中心不再发生显著变化,或者达到预定的迭代次数。迭代终止条件可以表示为:

\[\|\mu_j' - \mu_j\| < \epsilon\]

其中,\(\epsilon\)是一个很小的正数,表示簇中心变化的阈值。当簇中心的变化小于该阈值时,算法停止迭代。

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

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

相关文章

A5自媒体wordpress主题模板

一个简洁的wordpress个人博客主题&#xff0c;适合做个人博客&#xff0c;SEO优化效果挺不错的。 https://www.wpniu.com/themes/204.html

数据分析-Pandas最简单的方法画矩阵散点图

数据分析-Pandas直接画矩阵散点图 数据分析和处理中&#xff0c;难免会遇到各种数据&#xff0c;那么数据呈现怎样的规律呢&#xff1f;不管金融数据&#xff0c;风控数据&#xff0c;营销数据等等&#xff0c;莫不如此。如何通过图示展示数据的规律&#xff1f; 数据表&…

添加路障-蓝桥杯-DFS

自己另辟蹊径想的新思路 果然好像还是不太行呀 import java.util.Scanner;public class Main {static int T;//样例组数static int n;//矩阵大小static int[] X {0,1,0,-1};static int[] Y {1,0,-1,0};static int[] X1 {1,0,-1,0};static int[] Y1 {0,-1,0,1};static int …

Harbor二次开发前端环境搭建

1 前端开发环境搭建 &#xff08;1&#xff09;拉取分支代码 &#xff08;2&#xff09;前端开发推荐使用VsCode编辑器打开项目 打开 harbor\src\portal 文件夹&#xff0c;该文件夹为Harbor对应的前端代码所在位置 &#xff08;3&#xff09;在portal文件夹下创建名为 pro…

macOS上实现「灵动岛」效果

自从Apple iPhone推出了「灵动岛」功能后&#xff0c;用户们就被其优雅的设计和强大的功能所吸引。然而&#xff0c;作为macOS用户&#xff0c;我们一直在等待这一功能能够在我们的设备上实现。现在&#xff0c;随着新的应用程序的推出&#xff0c;我们终于可以在我们的Mac上体…

物流分拣漫LiDAR反射板

激光雷达漫反射板是物流分拣中不可或缺的一种设备&#xff0c;它在物流分拣过程中发挥着重要的作用。漫反射板的主要功能是反射光线&#xff0c;使得光线能够在分拣区域内均匀分布&#xff0c;从而提高分拣设备的识别精度和效率。 物流分拣是现代物流系统中非常关键的一环&…

信息抽取在旅游行业的应用:以景点信息抽取为例

开源项目推荐 今天先给大家推荐一个开源项目&#xff0c;多模态AI能力引擎平台: 免费的自然语言处理、情感分析、实体识别、图像识别与分类、OCR识别、语音识别接口&#xff0c;功能强大&#xff0c;欢迎体验。 https://gitee.com/stonedtx/free-nlp-api 场景描述 在旅游行业…

【分库分表】基于mysql+shardingSphere的分库分表技术

目录 1.什么是分库分表 2.分片方法 3.测试数据 4.shardingSphere 4.1.介绍 4.2.sharding jdbc 4.3.sharding proxy 4.4.两者之间的对比 5.留个尾巴 1.什么是分库分表 分库分表是一种场景解决方案&#xff0c;它的出现是为了解决一些场景问题的&#xff0c;哪些场景喃…

【蓝桥杯】蓝桥杯算法复习(一)

&#x1f600;大家好&#xff0c;我是白晨&#xff0c;一个不是很能熬夜&#x1f62b;&#xff0c;但是也想日更的人✈。如果喜欢这篇文章&#xff0c;点个赞&#x1f44d;&#xff0c;关注一下&#x1f440;白晨吧&#xff01;你的支持就是我最大的动力&#xff01;&#x1f4…

使用Git将代码上传至代码托管平台GitCode

使用像GitLbi、GitHub、Gitee等代码托管平台用于版本控制非常滴方便&#xff0c;能够跟踪代码的变化和历史记录&#xff0c;方便管理和回滚&#xff0c;还允许多个开发者同时在一个项目上进行开发和协作&#xff0c;提高团队协作效率。 这些平台的代码托管和上传方式都大同小异…

【QT】自定义控件的示例

自定义控件&#xff08;很重要&#xff09; 什么是自定义控件&#xff1f; 顾名思义就是创建一个窗口&#xff0c;放入多个控件&#xff0c;拼接起来&#xff0c;一起使用。 为什么需要它&#xff1f; 需求&#xff0c;假设有100个窗口&#xff0c;那如果有两个控件同时被使…

开源组件安全风险及应对

在软件开发的过程中&#xff0c;为了提升开发效率、软件质量和稳定性&#xff0c;并降低开发成本&#xff0c;使用开源组件是开发人员的不二选择&#xff08;实际上&#xff0c;所有软件开发技术的演进都是为了能够更短时间、更低成本地构建软件&#xff09;。这里的开源组件指…

【网络原理】使用Java基于UDP实现简单客户端与服务器通信

目录 &#x1f384;API介绍&#x1f338;DatagramSocket&#x1f338;DatagramPacket&#x1f338;InetSocketAddress &#x1f333;回显客户端与服务器&#x1f338;建立回显服务器&#x1f338;回显客户端 ⭕总结 我们用Java实现UDP数据报套接字编程&#xff0c;需要借用以下…

深度学习相关概念及术语总结

目录 1.CNN2.RNN3.LSTM4.NLP5.CV6.正向传播7.反向传播8.sigmoid 函数9.ReLU函数10.假设函数11.损失函数12.代价函数 1.CNN CNN 是卷积神经网络&#xff08;Convolutional Neural Network&#xff09;的缩写。卷积神经网络是一种深度学习模型&#xff0c;专门用于处理具有网格状…

数据可视化基础篇-图形语法

当我们在制作仪表盘或其他数据可视化时离不开对图表的选择&#xff0c;不同的数据信息该怎么选择图表可能是不少人会遇到的问题。 要解决这个问题我们首先需要理解数据可视化的生成规律或者说是“语法”&#xff0c;目前主流的数据可视化理论认为&#xff0c;可视化是由基础标…

存储引擎的简介

简介&#xff1a; 1.在mysql存储引擎可以说就是指表的类型&#xff0c;可以称为表处理器&#xff0c;以表的形式存储。 2.他的功能就是接收上层传下来的指令&#xff0c;然后对表中的数据进行提取写入操作。 目的&#xff1a; 为了管理方便&#xff0c;我们把连接管理&#xf…

生成对抗网络 (GAN)

生成对抗网络&#xff08;Generative Adversarial Networks&#xff0c;GAN&#xff09;是由Ian Goodfellow等人在2014年提出的一种深度学习模型。GAN由两部分组成&#xff1a;一个生成器&#xff08;Generator&#xff09;和一个判别器&#xff08;Discriminator&#xff09;&…

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II

代码随想录算法训练营第四天|24.两两交换链表中的节点、19.删除链表的倒数第N的节点、07.链表相交、142.环形链表II 24.两两交换链表中的节点 给你一个链表&#xff0c;两两交换其中相邻的节点&#xff0c;并返回交换后链表的头节点。你必须在不修改节点内部的值的情况下完成…

创建数据表

Oracle从入门到总裁:https://blog.csdn.net/weixin_67859959/article/details/135209645 如果要进行数据表的创建 create table 表名称 (列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,列名称 类型 [DEFAULT 默认值 ] ,...列名称 类型 [DEFAULT 默认值 ] )…

JS直接量及其相关对象

什么是直接量 直接量是指不需要创建对象就可以直接使用的变量。ES中的直接量主要有三种类型&#xff1a;表示字符串的string类型、表示数字的number类型和表示true/false的boolean类型。当我们直接将值赋给变量后&#xff0c;ES就会自动判断其类型&#xff0c;而且当参数发生变…