DPC密度峰值聚类算法原理详解二

1、计算数据点两两之间的距离

在数学世界中,任何维度上两点之间的最短距离称为欧几里得距离。它是两点之差的平方和的平方根。
Alt
在python中我们常用的计算欧几里得距离的方法有三种:
在 Python 中,numpy、scipy 模块配备了执行数学运算并计算两点之间的线段的功能。

1.使用 Numpy 模块查找两点之间的欧几里得距离;

当坐标为数组形式时 , 可以使用 numpy 模块查找所需的距离。它具有 norm() 函数,可以返回数组的 向量范数 。可以帮助计算两个坐标之间的欧几里得距离,如下所示。
在这里插入图片描述
https://pic3.zhimg.com/v2-0b4da3552d53cffa97d5f7bb7f305d8a_r.jpg
当坐标为数组形式时,可以使用 numpy 模块查找所需的距离。它具有 norm() 函数,可以返回数组的向量范数。可以帮助计算两个坐标之间的欧几里得距离,如下所示。

import numpy as np
a = np.array((1, 2, 3))
b = np.array((4, 5, 6))
dist = np.linalg.norm(a-b)
print(dist)
输出结果:
5.196152422706632

在这里插入图片描述

  • np.linalg.norm()用于求范数,linalg本意为linear(线性) + algebra(代数),norm则表示范数。
  • np.linalg.norm(x, ord=None, axis=None, keepdims=False) 【x: 表示矩阵(一维数据也是可以的~).ord: 表示范数类型】
    在这里插入图片描述
  • ord=1:表示求列和的最大值
  • ord=2:|λE-ATA|=0,求特征值,然后求最大特征值得算术平方根
  • ord=∞:表示求行和的最大值
  • ord=None:表示求整体的矩阵元素平方和,再开根号
参数含义
0表示按列向量来进行处理求多个列向量的范数
1表示按行向量来进行处理,求多个行向量的范数
None表示整个矩阵的范数
4.keepdims:表示是否保持矩阵的二位特性,True表示保持,False表示不保持,默认为False

我们还可以使用 numpy 模块直接实现数学公式。对于此方法,我们将使用 numpy.sum() 函数,该函数返回元素的总和,而 numpy.square() 函数将返回元素的平方。

import numpy as np
a = np.array((1, 2, 3))
b = np.array((4, 5, 6))
dist = np.sqrt(np.sum(np.square(a-b)))
print(dist)
输出结果:
5.196152422706632

实现欧几里得距离公式的另一种方法是使用 dot() 函数。我们可以找到点差及其转置的点积,返回平方和。

import numpy as np
a = np.array((1, 2, 3))
b = np.array((4, 5, 6))
temp = a-b
dist = np.sqrt(np.dot(temp.T, temp))
print(dist)
输出结果:
5.196152422706632
2.使用 distance.euclidean() 函数查找两点之间的欧式距离;

我们讨论了使用 numpy 模块计算欧几里得距离的不同方法。但是,这些方法可能会有点慢,因此我们有较快的替代方法。

scipy 库具有许多用于数学和科学计算的功能。distance.euclidean() 函数返回两点之间的欧几里得距离。

from scipy.spatial import distance
a = (1, 2, 3)
b = (4, 5, 6)
print(distance.euclidean(a, b))
输出结果:
5.196152422706632
3.使用 math.dist() 函数查找两点之间的欧几里得距离;

math 模块也可以用作替代。该模块的 dist() 函数可以返回两点之间的线段。

from math import dist
a = (1, 2, 3)
b = (4, 5, 6)
print(dist(a,b))
输出结果:
5.196152422706632
总结:DPC密度峰值两两之间距离计算

下面展示一些 python欧氏距离计算

def getDistanceMatrix(datas):
    N,D = np.shape(datas)  # datas NxD
    dists = np.zeros([N,N])
    //不太懂
    for i in range(N):
        for j in range(N):
            vi = datas[i,:]
            vj = datas[j,:]
            dists[i,j]= np.sqrt(np.dot((vi-vj),(vi-vj)))
    return dists
  #这里的距离指的是欧式距离,得到的结果为一个N*N的矩阵。

代码仔细解读:
在这里插入图片描述

  • 一、np.zeros()函数的作用:
    np.zeros()函数返回一个元素全为0且给定形状和类型的数组:
    zeros(shape, dtype=float, order=‘C’)
    1.shape:形状
    2.dtype:数据类型,可选参数,默认numpy.float64
    3.order:可选参数,c代表与c语言类似,行优先;F代表列优先
  • ans[i,:]表示选取ans的ith“行”及其所有的“列”。
  • 2.C=dot(A,B)
  • 若A与B为向量,返回A与B的内积。若A与B为矩阵,对每列计算A、B的内积。若A、B为多维数组,则沿着第一个长度不为1的维度进行计算。
    在这里插入图片描述
待解答
 for i in range(N):
        for j in range(N):
            vi = datas[i,:]
            vj = datas[j,:]
            dists[i,j]= np.sqrt(np.dot((vi-vj),(vi-vj)))
    return dists

更新于2023年2月9日

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值