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

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\)是一个很小的正数,表示簇中心变化的阈值。当簇中心的变化小于该阈值时,算法停止迭代。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM RAG系统中消除数据幻觉的几个绝招-OPENAI公司内称的“大招”

前言-什么是数据幻觉&#xff1f;它到底有什么危害呢 我们直接来举例&#xff1a; 我是金银花一区的&#xff0c;附近有什么小学&#xff1f; 此时RAG带出如下信息&#xff1a; 金银花小区一区、二区、三区附近教育资源有&#xff1a;银树大学、建设小学金银花校区、金树高…

IMX8MM -- Yocto构建遇见的错误及解决方法:

IMX8MM Yocto构建遇见的错误及解决方法&#xff1a; 1 bison-3.0.4 error2 Opencv BB_NO_NETWORK Error &#xff1a;3 Yocto构建时出现U-boot 问题4 Yocto构建时出现Linux kernel编译问题5 wayland-native6 cross-localedef-native7 wayland-protocols8 mesa 硬件&#xff1a;…

React Navite环境搭建

React Navite官网地址 React Native 中文网 使用React来编写原生应用的框架 创建React Navite项目命令&#xff08;目录必须是英文&#xff09; npx react-nativelatest init AwesomeProject 如果你是想把 React Native 集成到现有的原生项目中&#xff0c;则步骤完全不同…

多项式回归算法模拟

import numpy as np import matplotlib.pyplot as plt from sklearn.linear_model import LinearRegression from sklearn.preprocessing import PolynomialFeatures# 生成随机数作为x变量&#xff0c;范围在-5到5之间&#xff0c;共500个样本 x np.random.uniform(-5, 5, siz…

Java开发从入门到精通(一):Java的进阶语法知识

Java大数据开发和安全开发 Java的方法1.1 方法是什么1.1.1 方法的定义1.1.2 方法如何执行?1.1.3 方法定义时注意点1.1.4 使用方法的好处是? 1.2 方法的多种形式1.2.1 无参数 无返回值1.2.2 有参数 无返回值 1.3 方法使用时的常见问题1.4 方法的设计案例1.4.1 计算1-n的和1.4.…

[C/C++]string类常用接口介绍及模拟实现string类

一&#xff1a;Cstring类的由来 在C语言中&#xff0c;字符串是以\0结尾的一些字符的集合&#xff0c;为了操作方便&#xff0c;C标准库中提供了一些str系列的库函数&#xff0c;但是这些库函数与字符串是分离开的&#xff0c;不太符合OOP的思想&#xff0c;而且底层空间需要用…

【CSS面试题】高度塌陷问题及解决

什么情况下产生 (when 父盒子没有定义高度&#xff0c;但是子元素有高度&#xff0c;希望用子盒子撑起父盒子的高度&#xff0c;但是子盒子添加了浮动属性之后&#xff0c;父盒子高度为0 <template><div class"father"><div class"son"&…

Gitlab修改仓库权限为public、Internal、Private

Public&#xff08;公开&#xff09;&#xff1a;所有人都可以访问该仓库&#xff1b; Internal&#xff08;内部&#xff09;&#xff1a;同一个GitLab群组或实例内的所有用户都可以访问该仓库&#xff1b; Private&#xff08;私人&#xff09;&#xff1a;仅包括指定成员的用…

Dynamo处理Excel——调用Microsoft.Office.Interop.Excel教程

你好&#xff0c;这里是BIM的乐趣&#xff0c;我是九哥~ 今天我们来聊聊如何通过Dynamo处理Excel数据以及格式&#xff0c;Dynamo自带的节点肯定是不行&#xff0c;所以我们需要来用Python解决&#xff08;当然有个节点包 Bumblebee&#xff0c;我在案例百解教程里有过介绍&a…

pytorch实现分割模型TransUNet

TransUNet是一个非常经典的图像分割模型。该模型出现在Transformer引入图像领域的早期&#xff0c;所以结构比较简单&#xff0c;但是实际上效果却比很多后续花哨的模型更好。所以有必要捋一遍pytorch实现TransUNet的整体流程。 首先&#xff0c;按照惯例&#xff0c;先看一下…

Text Field文本输入框

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 Text Field文本输入框 一、最基本的本文输入框1、基础示例2、一些表单属性3、验证 二、多行文本 一、最基本的本文输入框 1、基础示例 import {Box, TextField} from "…

Java开发:对象间复制属性,方法归纳

在Java开发中&#xff0c;对象间复制属性是一项常见的任务&#xff0c;特别是在处理层&#xff08;如控制器层&#xff09;与服务层或数据传输对象&#xff08;DTOs&#xff09;之间的数据转换时。有多种方法可以实现User对象到UserDTO对象的属性复制&#xff0c;下面列举了几种…

搭建Android Studio开发环境

一、JDK 1、下载 2、安装 双击进行安装&#xff0c;修改安装路径为&#xff1a;D:\Java\jdk-17.0.4.1即可&#xff0c;安装完成后目录如下&#xff1a; 配置环境变量 3、测试 WinR&#xff0c;输入cmd&#xff0c;按Enter后&#xff0c;键入&#xff1a;java --version&…

分布式执行引擎ray入门--(3)Ray Train

Ray Train中包含4个部分 Training function: 包含训练模型逻辑的函数 Worker: 用来跑训练的 Scaling configuration: 配置 Trainer: 协调以上三个部分 Ray TrainPyTorch 这一块比较建议直接去官网看diff&#xff0c;官网色块标注的比较清晰&#xff0c;非常直观。 impor…

C语言学习--练习4(二维数组)

目录 1.统计有序数组中的负数 2.矩阵对角线元素和 3.最富有客户的资产总量 4.托普利兹矩阵 5.矩阵中的幸运数 6.二进制矩阵中的特殊位置 7.岛屿的周长 1.统计有序数组中的负数 //直接遍历二维数组即可 int countNegatives(int** grid, int gridSize, int* gridColSize) …

大厂面试-好未来一面算法之求最长无重复子串长度

目录指引 大厂面试-好未来一面算法之求最长无重复子串长度本文学习目标或巩固的知识点 3. 无重复字符的最长子串&#x1f7e1;&#x1f7e2;通过题目可知题解结果验证 大厂面试-好未来一面算法之求最长无重复子串长度 本文学习目标或巩固的知识点 学习如何处理经典题目《最长…

Java 中的 File 类常用方法介绍

Java 中的 File 类是 java.io 包的一部分&#xff0c;它提供了丰富的文件操作方法。File 类可以用来表示文件和目录路径名的抽象表示形式&#xff0c;即它可以用来获取文件或目录的属性&#xff0c;也可以用来创建、删除、重命名文件和目录。下面是一些常用的 File 类方法&…

OSPF Router-ID 实验简述

如果要运行OSPF协议&#xff0c;必须存在Router ID。Router ID是一个32比特无符号整数&#xff0c;是一台路由器在自治系统中的唯一标识。 在实际网络部署中&#xff0c;建议手工配置OSPF的Router ID&#xff0c;因为这关系到协议的稳定。 如果不指定&#xff0c;启运OSPF进程后…

【Web开发】深度学习HTML(超详细,一篇就够了)

&#x1f493; 博客主页&#xff1a;从零开始的-CodeNinja之路 ⏩ 收录文章&#xff1a;【Web开发】深度学习html(超详细,一篇就够了) &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 HTML1. HTML基础1.1 什么是HTML1.2 认识HTML标签1.3 HTML文件基本…

HTML使用

文章目录 一、简介二、HTML快速入门三、基础标签四、图片、音频、视频标签五、超链接标签六、列表标签七、表格标签八、布局标签九、表单标签十、表单向标签 一、简介 二、HTML快速入门 ​ <html><head><title>你好</title></head><body>再…