html5企业网站模板,企业网站建设方案有那些,wordpress 明月浩空,乐峰网网站是谁做的文章目录 分级聚类理论分级聚类的详细说明1. 定义2. 算法3. 计算4. 例子5. 例题 皮尔逊相关系数 julia实现 参考文献 分级聚类
理论
分级聚类的详细说明
1. 定义
分级聚类#xff08;Hierarchical Clustering#xff09;#xff0c;又称为层次聚类#xff0c;是一种通过… 文章目录 分级聚类理论分级聚类的详细说明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)。使用分级聚类算法以最小距离法为例进行聚类过程可能如下 初始化每个数据点被视为一个单独的群组。计算距离计算每两个数据点之间的距离得到距离矩阵。合并群组选择距离最近的两个点如A和B合并成一个新的群组。更新距离矩阵计算新群组AB与其他数据点C、D、E之间的距离并更新距离矩阵。重复迭代继续选择距离最近的两个群组合并直到所有数据点都被合并成一个群组或达到预设的群组数量。 5. 例题 由于例题通常涉及具体的数学运算和详细的步骤这里提供一个简化的示例问题 问题给定一组二维数据点使用分级聚类算法以最小距离法进行聚类并描述聚类过程。 解答 读取数据假设数据点已给出如前面例子中的A、B、C、D、E。计算距离计算每两个数据点之间的距离并确定哪两个点距离最近。合并群组将距离最近的两个点合并为一个新的群组并更新群组列表。重复迭代继续计算新群组与其他群组之间的距离并选择距离最近的两个群组合并直到所有群组合并为一个或达到预设条件。 皮尔逊相关系数
皮尔逊相似度在更严谨的学术表述中通常被称为皮尔逊相关系数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_{i1}^{n} (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i1}^{n} (x_i - \bar{x})^2} \sqrt{\sum_{i1}^{n} (y_i - \bar{y})^2}} r∑i1n(xi−xˉ)2 ∑i1n(yi−yˉ)2 ∑i1n(xi−xˉ)(yi−yˉ)
其中 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 的平均值即样本均值。
计算步骤可以归纳为
计算两个变量的平均值。计算每个观测值与平均值的差。计算这些差的乘积的和。计算每个变量差的平方和并开方得到标准差。将步骤3的结果除以步骤4中两个标准差的乘积得到皮尔逊相关系数。
julia实现
using Statistics
# 定义二叉树节点
struct TreeNode val :: Vector{Float64}left :: Union{TreeNode, Nothing} right :: Union{TreeNode, Nothing} function TreeNode(value, leftnothing, rightnothing) new(value, left, right) end
end function addLeftNode(a,b,parent_node)parent_node.leftTreeNode((a,b))
end
function addRightNode(a,b,parent_node)parent_node.rightTreeNode((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_bgetMean(a,b)cha_a,cha_bgetCha(a,b,mean_a,mean_b)cha_sumgetChaSum(cha_a,cha_b)Cha_a_sumsqrt,Cha_b_sumsqrtgetChaSumSqrt(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_matrixfill(1.5,length(lst),length(lst))for d_r in ab_r_lsti,j,rd_rab_r_matrix[i,j]rendmin_r_val, id_r findmin(ab_r_matrix) min_a_id id_r[1]min_b_idid_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_idgetBestR(lst)right_nodenode_lst[min_b_id]left_nodenode_lst[min_a_id]root_node_value((left_node.val).right_node.val)/2.0root_nodeTreeNode(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
endrootgroupNode(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.文心一言