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

news2024/9/22 11:25:20

文章目录

  • 分级聚类
    • 理论
      • 分级聚类的详细说明
        • 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.]]

function getBestR(lst::Vector{Vector{Float64}})::Int64
    ab_r_lst=[(lst[1],b,1.0-abs(getR(lst[1],b))) for b in lst[2:end]]
    min_r=ab_r_lst[1][3]
    min_b_i=1
    for i in 1:length(ab_r_lst)
        d=ab_r_lst[i] 
        if min_r > d[3]
            min_r= d[3]
            min_b_i= i
        end
    end
    return min_b_i+1
end

function groupNode(lst::Vector{Vector{Float64}},root_node::TreeNode)
    if length(lst)==1
        return root_node
    end
    min_b_i=getBestR(lst)
    right_node=root_node
    left_node=TreeNode(lst[min_b_i],nothing,nothing)
    root_node_value=((left_node.val).+right_node.val)/2.0
    root_node=TreeNode(root_node_value,left_node,right_node) 
    deleteat!(lst,min_b_i)
    deleteat!(lst,1)
    pushfirst!(lst,root_node_value)
    groupNode(lst,root_node)
end


function 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  
end

root=groupNode(lst,TreeNode(lst[1],nothing,nothing))
result = levelOrder(root)  
println(result)
Any[Any[[139.40625, 49.625, 85.0625]], Any[[241.0, 8.0, 71.0], [37.8125, 91.25, 99.125]], Any[[33.0, 111.0, 128.0], [42.625, 71.5, 70.25]], Any[[19.0, 109.0, 41.0], [66.25, 34.0, 99.5]], Any[[73.0, 26.0, 71.0], [59.5, 42.0, 128.0]], Any[[99.0, 69.0, 132.0], [20.0, 15.0, 124.0]]] 
 *  Terminal will be reused by tasks, press any key to close it. 

参考文献

1.文心一言

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

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

相关文章

Java虚拟机:虚拟机介绍

大家好,我是栗筝i,这篇文章是我的 “栗筝i 的 Java 技术栈” 专栏的第 033 篇文章,在 “栗筝i 的 Java 技术栈” 这个专栏中我会持续为大家更新 Java 技术相关全套技术栈内容。专栏的主要目标是已经有一定 Java 开发经验,并希望进…

haproxy 原理+实战

haproxy 1 haproxy简介1.1 定义1.2 原理讲解1.3 HAProxy的优点: 2. haproxy的基本部署2.1 实验环境2.1.2 haproxy主机配置2.1.3 webserver1配置2.1.4 webserver2配置 3. haproxy的全局配置4. haproxy代理参数5. haporxy的热处理6.haproxy的算法6.1 静态算法6.1.1sta…

物联网HMI/网关搭载ARM+CODESYS实现软PLC+HMI一体化

物联网HMI/网关搭载CODESYS实现软PLCHMI一体化 硬件:ARM平台,支持STM32/全志T3/RK3568/树莓派等平台 软件:CODESYS V3.5、JMobile Studio CODESYS是一款功能强大的PLC软件编程工具,它支持IEC61131-3标准IL、ST、FBD、LD、CFC、…

数据结构之《二叉树》(下)

在二叉树(中)了解了堆的相关概念后还实现了堆,并且还实现了堆排序,以及解决了TOP-K问题。接下来在本篇中将继续学习二叉树中的链式结构,会学习二叉树中的前、中、后三种遍历并实现链式结构的二叉树,接下来就开始本篇的学习吧&…

LabVIEW开发多语言程序的实现

在全球化的背景下,软件开发中的多语言支持变得愈发重要。LabVIEW作为一种广泛应用于工程和科学领域的图形化编程语言,同样支持多语言应用的开发。实现一个多语言LabVIEW程序不仅能增强用户体验,还可以扩大应用的覆盖范围。本文将介绍在LabVIE…

算法复习(上)

数组复习 数组复习基本就是熟练使用数组,经常配合指针使用以及思维的使用 443. 压缩字符串 - 力扣(LeetCode) 使用双指针分别标志我们在字符串中读和写的位置,当读指针 read 位于字符串的末尾,或读指针 read 指向的…

Python3 第八十一课 -- urllib

目录 一. 前言 二. urllib.request 三. urllib.error 四. urllib.parse 五. urllib.robotparser 一. 前言 Python urllib 库用于操作网页 URL,并对网页的内容进行抓取处理。 本文主要介绍 Python3 的 urllib。 urllib 包 包含以下几个模块: url…

C# 利用自定义特性,动态拼接sql,查询数据库,动态新增datagridview 列

之前在给一个工厂客户开发一套“售后包装防错系统”的时候,由于业务比较复杂, 每个表的字段基本都保持在10-20个字段区间,如下截图(可向右滑动滚动条) 正常的做法,肯定是一顿卡卡操作,新建列&…

Java——反射(1/4):认识反射(反射(Reflection)、反射学什么 )、获取类(获取Class对象的三种方式、代码演示)

目录 认识反射 反射(Reflection) 反射学什么 获取类 获取Class对象的三种方式 代码演示 认识反射 反射(Reflection) 反射就是:加载类,并允许以编程的方式解剖类中的各种成分(成员变量、…

基于BP神经网络的苦瓜生长含水量预测模型matlab仿真

目录 1.算法运行效果图预览 2.算法运行软件版本 3.部分核心程序 4.算法理论概述 5.算法完整程序工程 1.算法运行效果图预览 (完整程序运行后无水印) T表示温度,v表示风速,h表示模型厚度 2.算法运行软件版本 matlab2022a 3.部分核心程序 &#…

RocketMQ5.0消费者负载均衡实战-顺序消息负载均衡

在看本篇文章之前可以看一下非顺序消息消息负载均衡相关 RocketMQ5.0消费者负载均衡实战-CSDN博客 顺序消息消息粒度负载均衡 顺序消息的负载均衡主要是针对顺序消息特性进行负载,强遵循顺序消息的特性 RocketMQ 非顺序消息粒度负载均衡 RocketMQ 顺序消息粒度负载…

开发笔记:uniapp+vue+微信小程序 picker +后端 省市区三级联动

写在前面 未采用: 前端放置js 或者 json文件进行 省市区三级联动 采用: 前端组件 后端接口实现三级联动 原因:首先微信小程序有大小限制,能省则省,其次:方便后台维护省市区数据,完整省市区每年更新好像…

HR招聘测评,什么样的候选人无法通过面试

当下企业招聘普遍采用在线人才测评的方式,比传统的面试更加深入,也更加全面的掌握候选人的各方面信息,尤其是综合素质方面,是传统面试所无法比拟的。 在线人才测评的环节,往往安排在面试前,或者是在面试后…

Canvas:二次贝塞曲线

目录 1. 含义2. 方法说明3. 绘制对号4. 绘制聊天框 1. 含义 二次贝塞尔曲线是从起始点开始,通过控制点影响,最终到达终点的平滑曲线。 控制点虽然不在曲线上,但它决定了曲线的形状。 通过调整控制点的位置,可以改变曲线的弯曲方向…

苍穹外卖项目DAY02

苍穹外卖项目Day02 1、员工管理 1.1、新增员工 1.1.1、需求分析和设计 产品原型: 接口设计: 数据库设计(employee表): 1.1.2、代码开发 根据新增员工接口设计对应的DTO: 注意:当前端提交的…

(javaweb)分层解耦

目录 一.三层架构 二.分层解耦 三.IOC&DI入门 四.IOC详解 五. DI详解 一.三层架构 复用性差,难以维护和管理 前端发起请求,先会到达controller,再调用service进行逻辑处理,逻辑处理的前提是先拿到数据,到dao…

模拟电子技术(上海交大 郑益慧)

概述 深入学习基础器件、然后基于基础器件做应用电路设计, 然后做放大电路设计,在这做多级放大电路 最后 构成了集成放大器 改善电路性能、让电路稳定,最终要的思想,就是引入反馈 如何学习 多练习、多实践增加感性(sumulink) 仿真 本征半导体与杂质半导体 二极管 单向导…

Java Facade 模式(外观模式)增强您的架构

通过我们的深入解释和实际示例揭示 Java Facade 模式的简单性 - 简化您的代码并增强您的架构。 您是否厌倦了让您头疼的乱七八糟的代码?您是否在为难以操作和维护的复杂软件而苦恼?那么让我们来谈谈外观 — — 不,不是建筑物的正面&#xff0…

Ceph分布式存储系统的搭建与使用

目录 一. 环境准备 二. 安装Docker 三. admin节点安装cephadm 四. admin节点给另外四个主机导入镜像 五. 向集群中添加节点 六. Ceph使用 列出可用设备 清除设备数据---针对有数据的设备 检查 OSD 状态 Ceph 集群中添加一个新的 OSD 查看集群的健康状态 指定MDS 列…

Javascript 基本引用类型

思维导图 Javascript基本引用类型思维导图 1:date的简单使用 let date new Date() // 获取当前的时间 年月日时分秒 获取时间 getTime() // 返回日期的毫秒表示;与 valueOf()相同 getFullYear() // 返回 4 位数年(即 2019 而不是 19) ge…