人工智能与机器学习原理精解【12】

文章目录

  • 分级聚类
    • 理论
      • 分级聚类的详细说明
        • 1. 定义
        • 2. 算法
        • 3. 计算
        • 4. 例子
        • 5. 例题
      • 皮尔逊相关系数
    • julia实现
  • 参考文献

分级聚类

理论

分级聚类的详细说明

1. 定义

分级聚类(Hierarchical Clustering),又称为层次聚类,是一种通过连续不断地将最为相似的群组两两合并,来构造出一个群组的层级结构的聚类方法。分级聚类是一种无监督学习算法,它不依赖于带有正确答案的样本数据进行训练,而是直接在一组数据中找寻某种结构。在分级聚类中,每个群组都是从单一元素开始的,通过不断合并,最终形成一个树状的层次结构。
在这里插入图片描述

2. 算法

分级聚类的基本算法过程如下:

  • 初始化:每个数据点被视为一个单独的群组。
  • 计算距离:计算每两个群组之间的距离或相似度。这通常基于数据点之间的距离度量,如欧氏距离、曼哈顿距离或皮尔逊相关系数等。
  • 合并群组:选择距离最近(或相似度最高)的两个群组合并成一个新的群组。
  • 重复迭代:重复上述步骤,直到所有的数据点都被合并成一个群组,或者达到某个预设的停止条件(如群组数量达到预设值)。

在分级聚类中,群组之间的距离有多种计算方式,包括但不限于:

  • 最小距离法:群组之间的距离定义为两个群组中最近的两个数据点之间的距离。
  • 最大距离法:群组之间的距离定义为两个群组中最远的两个数据点之间的距离。
  • 平均距离法:群组之间的距离定义为两个群组中所有数据点对的平均距离。
  • 重心法:群组之间的距离定义为两个群组的重心(或均值)之间的距离。
3. 计算

以皮尔逊相关系数为例,分级聚类的计算过程可能涉及以下步骤:

  • 读取数据:从文件或数据库中读取待聚类的数据。
  • 计算相关系数:使用皮尔逊相关系数公式计算每两个数据点之间的相似度。
  • 构建距离矩阵:将相关系数转换为距离(或相似度)矩阵,其中每个元素表示两个数据点之间的距离(或相似度)。
  • 合并群组:根据距离矩阵,选择距离最近(或相似度最高)的两个群组合并。
  • 更新距离矩阵:合并后,需要重新计算新群组与其他群组之间的距离,并更新距离矩阵。
  • 重复迭代:重复上述步骤,直到满足停止条件。
4. 例子

假设有以下五个数据点(以二维坐标表示):A(1,2)、B(2,3)、C(8,7)、D(6,5)、E(7,6)。使用分级聚类算法(以最小距离法为例)进行聚类,过程可能如下:

  1. 初始化:每个数据点被视为一个单独的群组。
  2. 计算距离:计算每两个数据点之间的距离,得到距离矩阵。
  3. 合并群组:选择距离最近的两个点(如A和B)合并成一个新的群组。
  4. 更新距离矩阵:计算新群组(AB)与其他数据点(C、D、E)之间的距离,并更新距离矩阵。
  5. 重复迭代:继续选择距离最近的两个群组合并,直到所有数据点都被合并成一个群组或达到预设的群组数量。
5. 例题

由于例题通常涉及具体的数学运算和详细的步骤,这里提供一个简化的示例问题:

问题:给定一组二维数据点,使用分级聚类算法(以最小距离法)进行聚类,并描述聚类过程。

解答

  1. 读取数据:假设数据点已给出,如前面例子中的A、B、C、D、E。
  2. 计算距离:计算每两个数据点之间的距离,并确定哪两个点距离最近。
  3. 合并群组:将距离最近的两个点合并为一个新的群组,并更新群组列表。
  4. 重复迭代:继续计算新群组与其他群组之间的距离,并选择距离最近的两个群组合并,直到所有群组合并为一个或达到预设条件。

皮尔逊相关系数

皮尔逊相似度,在更严谨的学术表述中,通常被称为皮尔逊相关系数(Pearson Correlation Coefficient),是衡量两个变量之间线性相关程度的一个统计指标。
它的值域为[-1, 1],其中1表示完全正相关,-1表示完全负相关,0表示没有线性相关关系。
皮尔逊相关系数的计算公式为:

r = ∑ i = 1 n ( x i − x ˉ ) ( y i − y ˉ ) ∑ i = 1 n ( x i − x ˉ ) 2 ∑ i = 1 n ( y i − y ˉ ) 2 r = \frac{\sum_{i=1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^{n} (x_i - \bar{x})^2} \sqrt{\sum_{i=1}^{n} (y_i - \bar{y})^2}} r=i=1n(xixˉ)2 i=1n(yiyˉ)2 i=1n(xixˉ)(yiyˉ)

其中:

  • n n n 是观测值的数量。
  • x i x_i xi y i y_i yi 分别是两个变量在第 i i i 个观测值上的取值。
  • x ˉ \bar{x} xˉ y ˉ \bar{y} yˉ 分别是 x x x y y y 的平均值(即样本均值)。

计算步骤可以归纳为:

  1. 计算两个变量的平均值。
  2. 计算每个观测值与平均值的差。
  3. 计算这些差的乘积的和。
  4. 计算每个变量差的平方和,并开方得到标准差。
  5. 将步骤3的结果除以步骤4中两个标准差的乘积,得到皮尔逊相关系数。

julia实现

using Statistics
# 定义二叉树节点  
struct TreeNode  val :: Vector{Float64}left  :: Union{TreeNode, Nothing}  right :: Union{TreeNode, Nothing}  function TreeNode(value, left=nothing, right=nothing)  new(value, left, right)  end  
end  function addLeftNode(a,b,parent_node)parent_node.left=TreeNode((a,b))
end
function addRightNode(a,b,parent_node)parent_node.right=TreeNode((a,b))
end#计算两个变量的平均值
function getMean(a,b)   return mean.([a,b])
end#计算每个观测值与平均值的差
function getCha(a,b,mean_a,mean_b)  return (a.-mean_a,b.-mean_b)
end#计算这些差的乘积的和
function getChaSum(cha_a,cha_b)return sum(cha_a.*cha_b)
end# 计算每个变量差的平方和,并开方得到标准差
function getChaSumSqrt(cha_a,cha_b)return (sqrt(sum(cha_a.^2)),sqrt(sum(cha_b.^2)))
end#得到皮尔逊相关系数
function getR(a,b)mean_a,mean_b=getMean(a,b)cha_a,cha_b=getCha(a,b,mean_a,mean_b)cha_sum=getChaSum(cha_a,cha_b)Cha_a_sumsqrt,Cha_b_sumsqrt=getChaSumSqrt(cha_a,cha_b)return cha_sum/(Cha_a_sumsqrt*Cha_b_sumsqrt)
end lst::Vector{Vector{Float64}}=[[20.,15.,124.],[73.,26.,71.],[99.,69.,132.],[33.,111.,128.],[241.,8.,71.],[19.,109.,41.]]
node_lst::Vector{TreeNode}=TreeNode.(lst)function getBestR(lst::Vector{Vector{Float64}}) ab_r_lst=[(i,j,1.0-abs(getR(lst[i],lst[j]))) for i in 1:length(lst) for j in 1:length(lst) if i != j]ab_r_matrix=fill(1.5,length(lst),length(lst))for d_r in ab_r_lsti,j,r=d_rab_r_matrix[i,j]=rendmin_r_val, id_r = findmin(ab_r_matrix)  min_a_id= id_r[1]min_b_id=id_r[2]return (min_a_id,min_b_id)
endfunction groupNode(lst::Vector{Vector{Float64}},node_lst::Vector{TreeNode})if length(lst)==1return node_lst[1]endmin_a_id,min_b_id=getBestR(lst)right_node=node_lst[min_b_id]left_node=node_lst[min_a_id]root_node_value=((left_node.val).+right_node.val)/2.0root_node=TreeNode(root_node_value,left_node,right_node) deleteat!(lst,sort([min_a_id,min_b_id]))deleteat!(node_lst,sort([min_a_id,min_b_id]))push!(lst,root_node_value)push!(node_lst,root_node)groupNode(lst,node_lst)
endfunction levelOrder(root::TreeNode)  if isnothing(root)  return []  end  # 使用 Vector 模拟队列  queue = [root]  result = []  while !isempty(queue)  # 当前层的节点数  level_size = length(queue)  # 当前层的值列表  level_values = []  for _ in 1:level_size  # 弹出队列的前端节点  node::TreeNode = popfirst!(queue)  # 注意:popfirst! 会移除并返回数组的第一个元素  push!(level_values, node.val)  # 如果左子节点存在,加入队列  if !isnothing(node.left)  push!(queue, node.left)  end  # 如果右子节点存在,加入队列  if !isnothing(node.right)  push!(queue, node.right)  end  end  # 将当前层的值列表添加到结果中  push!(result, level_values)  end  return result  
endroot=groupNode(lst,node_lst)
result = levelOrder(root)  
println(result)
Any[Any[[56.8125, 43.34375, 118.9375]], Any[[93.625, 71.6875, 113.875], [20.0, 15.0, 124.0]], Any[[88.25, 74.375, 95.75], [99.0, 69.0, 132.0]], Any[[143.5, 37.75, 63.5], [33.0, 111.0, 128.0]], Any[[46.0, 67.5, 56.0], [241.0, 8.0, 71.0]], Any[[19.0, 109.0, 41.0], [73.0, 26.0, 71.0]]]*  Terminal will be reused by tasks, press any key to close it.

参考文献

1.文心一言

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

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

谷歌反垄断官司败诉后,或又面临被拆分风险?

KlipC报道:上周8月5日,美国法院裁定谷歌的搜索业务违反了美国反垄断法,非法垄断在线搜索和搜索文本广告市场。据悉,胜诉的美国司法部正在考虑拆分谷歌。其他选项包括强制谷歌与竞争对手分享更多数据,以及防止其在人工智…

【二叉树进阶】--- 根据二叉树创建字符串

Welcome to 9ilks Code World (๑•́ ₃ •̀๑) 个人主页: 9ilk (๑•́ ₃ •̀๑) 文章专栏: 数据结构 从本篇文章开始,博主将分享一些结合二叉树的进阶算法题。 🏠 根据二叉树创建字符串 📌 题目内容 根据二叉…

从行为面试问题(behavioral questions)看中美程序员差异。

中美程序员在职场中的工作状态和职能、福利等有很大区别,从面试中的BQ轮就可见一斑。 中美程序员的面试轮差异? 国内的面试轮在不同公司间差异很大,但总体的问题类型包含笔试面试(算法题、概念题、项目深挖、职业目标、职场文化…

FGUI+TS如何实现数字翻滚

FGUITS如何实现数字翻滚 实现效果如下: 实现步骤: fgui制作组件和特效 fgui制作组件,设置一条竖向数字包含1-9或者小数点符号等,可见区域为一个数字大小,最好可见区域紧贴数字,这样滚动的时候滚动区域范围…

深度学习------------------卷积神经网络(LeNet)

目录 LeNet网络手写的数字识别MNIST总结卷积神经网络(LeNet) 问题 LeNet网络 手写的数字识别 MNIST ①输入的是:3232的image ②放到一个55的卷积层里面(为什么是5?因为32-x128,∴x5)&#xff0c…

【教程】Ubuntu给pycharm添加侧边栏快捷方式

转载请注明出处:小锋学长生活大爆炸[xfxuezhagn.cn] 如果本文帮助到了你,欢迎[点赞、收藏、关注]哦~ 以下教程不仅限于pycharm,其他软件也是一样操作 1、进入到pycharm的目录,先通过命令行打开pycharm: ./bin/pycharm…

keepalived+haproxy高可用负载均衡集群

简介 使用haproxy制作负载均衡集群,keepalived通过状态检测脚本检测本机haproxy状态,若为离线状态,则会降低该节点的优先级。 实验准备 四台虚拟机:KA1、KA2为keepalivedhaproxy,web1、web2为后端服务器,均…

阿里云-java调用短信服务,第三方接口的开启(傻瓜式教程)

第一步:在浏览器中,搜索阿里云 第二步:打开aly的主页 第三步:在最上方的导航栏中,找到云市场,注意不要点击,会自动有触发悬浮框出现,在悬浮框中找到 短信 第四步:点击 短…

无人机之电池注意事项

1、外场作业时,电池一定要放置在阴凉处,避免太阳直射; 2、刚作业完的电池发热严重时,请降至室温再充电; 3、注意电池状态,一旦发现电池出现鼓包、漏液等现象,必须马上停止使用; 4…

UE5 C++项目的配置

创建项目 首先启动UE5,然后选择要创建的项目,选择c进行创建 创建项目完毕之后,会自动打开visual studio,页面如下图所示 点击总体配置状态的刷新按钮,会自动检测总体的配置状态 一般会在下图所示的两项出现警告 Unreal Engi…

舵机模块学习

舵机是一种根据输入PWM信号占空比来控制输出角度的装置 执行逻辑:PWM信号输入到控制板,给控制版一个指定的目标角度,然后电位器检测输出轴的当前角度,如果大于目标角度,电机反转,小于正转,最终使…

Linux--HTTP协议(http服务器构建)

目录 1.HTTP 协议 2.认识 URL 3.urlencode 和 urldecode(编码) urlencode(URL编码) urldecode(URL解码) 4.HTTP 协议请求与响应格式 4.1HTTP 常见方法(三种) 5.HTTP 的状态码…

去中心化技术的崛起:探索Web3的新时代

引言: Web3是互联网发展的新阶段,它通过去中心化技术重新定义了数字世界的运作方式。这一新时代不仅带来了技术上的突破,也为社会互动和数据管理开辟了新的前景。本文将深入探讨Web3的核心技术、应用领域、全球影响以及面临的挑战&#xff0…

React状态管理:react-redux和redux-saga(适合由vue转到react的同学)

注意:本文不会把所有知识点都写一遍,并不适合纯新手阅读 首先Redux是一种状态管理方案,本身和react并没有什么联系,redux也可以结合其他框架来用。 react-redux是基于react的一种状态管理实现,他不像vuex那样直接内置在…

Centos 7 升级GCC时遇到 mirrorlist.centos.org; Unknown error“

问题描述 在执行如下操作的时候, yum install devtoolset-9-gcc devtoolset-9-gcc-c devtoolset-9-binutils 出现: 14: curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error" 网上搜索了一下,原因是 mir…

全开源智慧停车场微信小程序源码/智能停车系统源码/停车自助缴费系统/停车场管理收费+物业管理+物联网+自助缴费功能

源码简介: 智慧停车场微信小程序源码,全开源智能停车系统源码,停车自助缴费系统,具有停车场管理、停车收费、物业管理、物联网、自助缴费等多种功能。 这是一个全开源的智能停车系统,功能强大。它不仅能帮你管理停车…

YOLO目标检测的单目(多目标测距),使用相机光学模型,支持目标检测模型训练,可输出目标位置和距离信息并可视化

本项目旨在开发一个基于YOLO的目标检测系统,该系统不仅能检测图像中的多个目标,还能利用单目摄像头的图像估计每个目标与摄像头之间的相对距离。系统的核心组成部分包括目标检测、距离估计、模型训练以及结果可视化。 主要功能 目标检测:使用…

后台管理权限自定义按钮指令v-hasPermi

第一步:在src下面建立一个自定义指令文件,放自定义指令方法 permission.js文件: /*** v-hasPermi 操作权限处理*/import store from "/store";export default {inserted(el, binding) {const { value } binding;//从仓库里面获取到后台给的数组const permission s…

【PGCCC】使用 Postgres 递归 CTE 进行图形检索

您是否知道可以将 Postgres 用作某些用例的图形数据库? 假设您有如下图表: 我们可以在 NetworkX 中构建此图: 1import networkx as nx23G nx.Graph()45G.add_edges_from([6 ("A", "B"),7 ("A", "…

Python 安装 PyTorch详细教程

本章教程,介绍如何安装PyTorch,介绍两种安装方式,一种是通过pip直接安装,一种是通过conda方式安装。 一、查看CUDA版本 二、安装PyTorch 1、pip安装方式 pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu1162、conda安装方式 …