Python scipy.spatial.distance.squareform() 函数的用法

scipy.spatial.distance.squareform

  • 调用方法
  • 注意
  • 示例1

调用方法

from scipy.spatial.distance import pdist, squareformscipy.spatial.distance.squareform(X, force='no', checks=True)

各个参数意义:
X:一个压缩或冗余的距离矩阵。
force:可以被设定为 "tovector" 或者 "tomatrix",输入将会被看作是一个距离矩阵或者距离矢量。
checks:如果被设定为 False,如果已知 X - X.T1 很小且 diag(X) 接近于
Y:返回值,如果传递进入一个压缩距离矩阵,冗余的矩阵就会被返回,如果传递进入一个冗余的矩阵,压缩距离矩阵会被返回。

注意

v = squareform(X)

如果我们给予 squareform() 一个 n × n n\times n n×n 的对称距离矩阵 X。比如二项式系数选择为 2,那么 squareform(X) 就会返回一个 n ∗ ( n − 1 ) / 2 n * \left(n-1\right) / 2 n(n1)/2 大小的矢量 v v v,其中:
D i s t a n c e i , j = v [ ( n 2 ) − ( n − i 2 ) + ( j − i − 1 ) ] \mathrm{Distance}_{i, j} =v\left [ \begin{pmatrix} n \\ 2 \end{pmatrix} -\begin{pmatrix} n-i \\ 2 \end{pmatrix}+\left ( j-i-1 \right ) \right ] Distancei,j=v[(n2)(ni2)+(ji1)]
上式表示不同点 ij 之间的距离。
如果 x 是非正方形或者非对称的,就会报错。
如果给定一个 n ∗ ( n − 1 ) / 2 n * \left(n-1\right) / 2 n(n1)/2 大小的矢量 v v v,对于某些整数 n > = 1 n>=1 n>=1的编码距离,X=squareform(v) 返回一个 n × n n\times n n×n 距离矩阵 X。 X [ i , j ] X\left [ i, j \right ] X[i,j] X [ j , i ] X\left [ j, i \right ] X[j,i] 的值被设定为:
D i s t a n c e i , j = v [ ( n 2 ) − ( n − i 2 ) + ( j − i − 1 ) ] \mathrm{Distance}_{i, j} =v\left [ \begin{pmatrix} n \\ 2 \end{pmatrix} -\begin{pmatrix} n-i \\ 2 \end{pmatrix}+\left ( j-i-1 \right ) \right ] Distancei,j=v[(n2)(ni2)+(ji1)]
同时对角线上的元素均被设置为 0。

上面这个表达式相信大家看到都会比较懵,这里我来解释一下。矢量 D i s t a n c e i , j \mathrm{Distance}_{i, j} Distancei,j 描述了一个长度为 n n n 的线性空间中, i i i j j j 之间的距离。具体来说, D i s t a n c e i , j \mathrm{Distance}_{i, j} Distancei,j 表示从向量空间中第 i i i 个向量到第 j j j 个向量所需要的步数。其中,每一步可以沿着向量空间中的任意一个向量移动,但是每个向量只能被经过一次。这里的 v v v 表示每一步的代价,也可以理解为移动单位长度所需花费的代价。

第一项 ( n 2 ) \begin{pmatrix} n \\ 2 \end{pmatrix} (n2) 表示向量空间中总共有多少个向量对,即任意两个向量之间都需要进行移动。
第二项 ( n − i 2 ) \begin{pmatrix} n-i \\ 2 \end{pmatrix} (ni2) 表示从第 i i i 个向量开始,已经有多少对向量已经被移动过了,即已经不需要再移动。
第三项 ( j − i − 1 ) \left ( j-i-1 \right ) (ji1) 表示在第二项的基础上,从第 i i i 个向量到第 j j j 个向量之间还需要经过多少对向量。将这三个部分加起来,就能得到从第 i i i 个向量到第 j j j 个向量所需的步数。

依然很抽象,那么我们来看一个示例,在阅读示例之前推荐优先阅读------Python scipy.spatial.distance.pdist() 函数的用法。

示例1

import numpy as np
from scipy.spatial.distance import pdist, squareformx = np.array([[0, 10], [10, 10], [20, 20]])
result = pdist(x)
print(result)square_matrix = squareform(pdist(x))
print(square_matrix)
"""
result:
[10.         22.36067977 14.14213562]
[[ 0.         10.         22.36067977][10.          0.         14.14213562][22.36067977 14.14213562  0.        ]]
"""

我们可以看到 squareform() 函数实际上将我们传递进入的以为距离数组变成了也给正方形矩阵,且矩阵对应索引位置上的元素值等于两点之间的距离,而这些位置的索引值与点的索引值一致,且关于主对角线对称,对角线上的元素全部为 0。如果我们此时将方形矩阵记作 S S S,比如,10. 此时位于 S 12 S_{12} S12 S 21 S_{21} S21 的位置,可以理解为原始数组 x 中第一个点和第二个点之间的距离。显然数组 x 中的第一个点坐标为 [0, 10],第二个点的坐标为 [10, 10],它们之间的距离也为 10.。我们的说法得到了验证。

根据之前 squareform() 函数的定义说明,如果此时我们将上面得到的 square_matrix 作为参数传递进去会得到什么呢?

import numpy as np
from scipy.spatial.distance import pdist, squareformx = np.array([[0, 10], [10, 10], [20, 20]])
result = pdist(x)
print(result)square_matrix = squareform(pdist(x))
print(square_matrix)print(squareform(square_matrix))
"""
result:
[10.         22.36067977 14.14213562]
[[ 0.         10.         22.36067977][10.          0.         14.14213562][22.36067977 14.14213562  0.        ]]
[10.         22.36067977 14.14213562] # 最终结果
"""

我们可以看到,最终的结果又变回了压缩矩阵(一维数组)的形式。这也与我们定义中叙述的情况一致。

如果大家觉得有用,就点个赞让更多的人看到吧~

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

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

相关文章

万字解析设计模式之 适配器模式

一、 适配器模式 1.1概述 将一个接口转换成客户希望的另一个接口,适配器模式使接口不兼容的那些类可以一起工作。 适配器模式分为类适配器模式和对象适配器模式,前者类之间的耦合度比后者高,且要求程序员了解现有组件库中的相关组件的内部结…

spring面试题合集介绍

订阅本合集,您将学习到一下内容: 一、Spring Framework 1.谈谈你对Spring的理解 2.Spring的优缺点是什么? 二、Spring IOC 3.什么是Spring IOC 容器?有什么作用? 4.Spring IoC 的实现机制是什么? 5.什么…

目标分割技术-语义分割总览

前言 博主现任高级人工智能工程师,曾发表多篇SCI且获得过多次国际竞赛奖项,理解各类模型原理以及每种模型的建模流程和各类题目分析方法。目的就是为了让零基础快速使用各类代码模型,每一篇文章都包含实战项目以及可运行代码。欢迎大家订阅一…

2023年度注册电气工程师(供配电)执业资格考试专业考试规范及设计手册

一.规程、规范: 1.《防止静电事故通用导则》GB 12158-2006; 2.《电能质量 供电电压偏差》GB/T 12325-2008; 3.《电能质量 电压波动和闪变》GB/T 12326-2008; 4.《电流…

录制第一个jmeter性能测试脚本2(http协议)——webtour

我们手工编写了一个测试计划,现在我们通过录制的方式来实现那个测试计划。也就是说‘’测试计划目标和上一节类似:让5个用户在2s内登录webtour,然后进入 页面进行查看。 目录 欢迎访问我的免费课程 PPT、安装包、视频应有尽有! …

C#类有析构函数吗

在C#中,类不具有析构函数(destructor)的概念,而是有一种叫做终结器(finalizer)的东西,这在某种程度上和C的析构函数相似。终结器在对象不再需要时由垃圾收集器自动调用,用于释放非托管资源。在C#中,你不能直接调用终结…

leetcode:交叉链表

题目描述 题目链接:160. 相交链表 - 力扣(LeetCode) 题目分析 我们先要搞清楚一个概念,单链表可以相交,但绝对不会交叉 原因如下: 单链表中,多个结点可以存一个结点的地址,但是一…

【算法挨揍日记】day22——面试题 17.16. 按摩师、213. 打家劫舍 II

面试题 17.16. 按摩师 面试题 17.16. 按摩师 题目描述: 一个有名的按摩师会收到源源不断的预约请求,每个预约都可以选择接或不接。在每次预约服务之间要有休息时间,因此她不能接受相邻的预约。给定一个预约请求序列,替按摩师找…

国产高云FPGA:纯verilog实现视频图像缩放,提供6套Gowin工程源码和技术支持

目录 1、前言免责声明 2、相关方案推荐国产高云FPGA相关方案推荐国产高云FPGA基础教程 3、设计思路框架视频源选择OV5640摄像头配置及采集动态彩条跨时钟FIFO图像缩放模块详解设计框图代码框图2种插值算法的整合与选择 Video Frame Buffer 图像缓存DDR3 Memory Interface 4、Go…

Qml使用cpp文件的信号槽

文章目录 一、C文件Demo二、使用步骤1. 初始化C文件和QML文件,并建立信号槽2.在qml中调用 一、C文件Demo Q_INVOKABLE是一个Qt元对象系统中的宏,用于将C函数暴露给QML引擎。具体来说,它使得在QML代码中可以直接调用C类中被标记为Q_INVOKABLE的…

Rust8.2 Fearless Concurrency 无畏并发

Rust学习笔记 Rust编程语言入门教程课程笔记 参考教材: The Rust Programming Language (by Steve Klabnik and Carol Nichols, with contributions from the Rust Community) Lecture 16: Fearless Concurrency 无畏并发 src/main.rs use std::thread; use std::time::Du…

嵌入式Linux开发面试题和答案

熟练的编程语言: 问:“您在嵌入式系统开发中熟练使用哪些编程语言?”答:在嵌入式系统开发中,我熟练使用C、C和Python等编程语言。C语言因其接近硬件的操作和效率而被广泛应用;C则在需要面向对象编程时提供了…

某手机大厂员工爆料:40岁被裁,每月给88000补贴,连续给12个月,第二年减半,感觉废掉了!...

精彩回顾:进了央企,拿了户口,却感觉被困住了。 人生没有所谓的终点,只有不断再出发的起点,裁员只是人生的一个转角,而非尽头。 在时代的浪潮下,即使身处大厂,依然难逃被裁员的命运。…

【KingbaseES】sys_dump命令详解及示例

概述 sys_dump 是一个将 KingbaseES 数据库保存到一个脚本或者归档文件中的工具.这个脚本文件的格式是纯文本,它包含许多 SQL 命令, 这些 SQL 命令可以用于重建该数据库并将之恢复到保存成脚本的时候的状态.要恢复这些脚本&#…

NX二次开发UF_CAM_ask_lower_limit_plane_usage 函数介绍

文章作者:里海 来源网站:里海NX二次开发3000例专栏 UF_CAM_ask_lower_limit_plane_usage Defined in: uf_cam_planes.h int UF_CAM_ask_lower_limit_plane_usage(tag_t object_tag, UF_PARAM_lwplane_usage_t * usage ) overview 概述 Query the usa…

Shell脚本:Linux Shell脚本学习指南(第二部分Shell编程)一

第二部分:Shell编程(一) 这一章我们正式进入 Shell 脚本编程,重点讲解变量、字符串、数组、数学计算、选择结构、循环结构和函数。 Shell 的编程思想虽然和 C、Java、Python、C# 等其它编程语言类似,但是在语法细节方…

PaddleDetection训练目标检测模型

PaddleDetection训练目标检测模型 一,安装标注软件二,数据标注和清洗三,安装PaddleDetection环境四,修改配置文件,本文选择的是 PP-PicoDet算法五,训练模型六,训练完成之后导出模型七&#xff0…

php面向对象和面向过程区别

面向过程编程:是一种传统的编码风格,它将代码组织为一系列函数或过程。这些函数可以采用一系列参数和返回值,来完成特定的任务。面向过程编程侧重顺序和功能性。 面向对象编程:是一种编码风格,它将代码组织为对象&…

04_面向对象高级_final与常量

final 1. 基本介绍 final 关键字是最终的意思,可以修饰(类、方法、变量) 修饰类:该类被称为最终类,特点是不能被继承了修饰方法:该方法被称为最终方法,特点是不能被重写了修饰变量&#xff1…

深入探讨AJAX接口进度监控:实现步骤、代码示例与技术原理

AJAX(Asynchronous JavaScript and XML)是现代Web开发中常用的异步通信技术。本文将详细分析如何通过AJAX实现接口进度监控,提供实用的代码示例、技术原理解析以及优劣势评估,以帮助开发者更好地应用这一技术。 1. 引言 在复杂的…