当前位置:   article > 正文

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

密度峰值聚类算法 python

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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

在这里插入图片描述

  • 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

实现欧几里得距离公式的另一种方法是使用 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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
3.使用 math.dist() 函数查找两点之间的欧几里得距离;

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

from math import dist
a = (1, 2, 3)
b = (4, 5, 6)
print(dist(a,b))
输出结果:
5.196152422706632
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
总结: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的矩阵。

  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

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

  • 一、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
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7

更新于2023年2月9日

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/我家小花儿/article/detail/518442
推荐阅读
相关标签
  

闽ICP备14008679号