`
liyonghui160com
  • 浏览: 777409 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

knn距离公式比较

阅读更多

 

      在数据分析和数据挖掘的过程中,我们经常需要知道个体间差异的大小,进而评价个体的相似性和类别。最常见的是数据分析中的相关分析,数据挖掘中的分类和聚类算法,如K最近邻(KNN)和K均值(K-Means)。当然衡量个体差异的方法有很多,最近查阅了相关的资料,这里整理罗列下。

为了方便下面的解释和举例,先设定我们要比较X个体和Y个体间的差异,它们都包含了N个维的特征,即X=(x1, x2, x3, … xn),Y=(y1, y2, y3, … yn)。下面来看看主要可以用哪些方法来衡量两者的差异,主要分为距离度量和相似度度量。

距离度量

距离度量(Distance)用于衡量个体在空间上存在的距离,距离越远说明个体间的差异越大。

欧几里得距离(Euclidean Distance)

欧氏距离是最常见的距离度量,衡量的是多维空间中各个点之间的绝对距离。公式如下:




因为计算是基于各维度特征的绝对数值,所以欧氏度量需要保证各维度指标在相同的刻度级别,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效。

明可夫斯基距离(Minkowski Distance)

明氏距离是欧氏距离的推广,是对多个距离度量公式的概括性的表述。公式如下:


 
这里的p值是一个变量,当p=2的时候就得到了上面的欧氏距离。

曼哈顿距离(Manhattan Distance)

曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果,即当上面的明氏距离中p=1时得到的距离度量公式,如下:


 
切比雪夫距离(Chebyshev Distance)

切比雪夫距离起源于国际象棋中国王的走法,我们知道国际象棋国王每次只能往周围的8格中走一步,那么如果要从棋盘中A格(x1, y1)走到B格(x2, y2)最少需要走几步?扩展到多维空间,其实切比雪夫距离就是当p趋向于无穷大时的明氏距离:


 
其实上面的曼哈顿距离、欧氏距离和切比雪夫距离都是明可夫斯基距离在特殊条件下的应用。

马哈拉诺比斯距离(Mahalanobis Distance)

既然欧几里得距离无法忽略指标度量的差异,所以在使用欧氏距离之前需要对底层指标进行数据的标准化,而基于各指标维度进行标准化后再使用欧氏距离就衍生出来另外一个距离度量——马哈拉诺比斯距离(Mahalanobis Distance),简称马氏距离。

相似度度量

相似度度量(Similarity),即计算个体间的相似程度,与距离度量相反,相似度度量的值越小,说明个体间相似度越小,差异越大。

向量空间余弦相似度(Cosine Similarity)

余弦相似度用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小。相比距离度量,余弦相似度更加注重两个向量在方向上的差异,而非距离或长度上。公式如下:


 
皮尔森相关系数(Pearson Correlation Coefficient)

即相关分析中的相关系数r,分别对X和Y基于自身总体标准化后计算空间向量的余弦夹角。公式如下:



 
Jaccard相似系数(Jaccard Coefficient)

Jaccard系数主要用于计算符号度量或布尔值度量的个体间的相似度,因为个体的特征属性都是由符号度量或者布尔值标识,因此无法衡量差异具体值的大小,只能获得“是否相同”这个结果,所以Jaccard系数只关心个体间共同具有的特征是否一致这个问题。如果比较X与Y的Jaccard相似系数,只比较xn和yn中相同的个数,公式如下:



 

调整余弦相似度(Adjusted Cosine Similarity)

虽然余弦相似度对个体间存在的偏见可以进行一定的修正,但是因为只能分辨个体在维之间的差异,没法衡量每个维数值的差异,会导致这样一个情况:比如用户对内容评分,5分制,X和Y两个用户对两个内容的评分分别为(1,2)和(4,5),使用余弦相似度得出的结果是0.98,两者极为相似,但从评分上看X似乎不喜欢这2个内容,而Y比较喜欢,余弦相似度对数值的不敏感导致了结果的误差,需要修正这种不合理性,就出现了调整余弦相似度,即所有维度上的数值都减去一个均值,比如X和Y的评分均值都是3,那么调整后为(-2,-1)和(1,2),再用余弦相似度计算,得到-0.8,相似度为负值并且差异不小,但显然更加符合现实。

欧氏距离与余弦相似度

欧氏距离是最常见的距离度量,而余弦相似度则是最常见的相似度度量,很多的距离度量和相似度度量都是基于这两者的变形和衍生,所以下面重点比较下两者在衡量个体差异时实现方式和应用环境上的区别。

借助三维坐标系来看下欧氏距离和余弦相似度的区别:



 
从图上可以看出距离度量衡量的是空间各点间的绝对距离,跟各个点所在的位置坐标(即个体特征维度的数值)直接相关;而余弦相似度衡量的是空间向量的夹角,更加的是体现在方向上的差异,而不是位置。如果保持A点的位置不变,B点朝原方向远离坐标轴原点,那么这个时候余弦相似度cosθ是保持不变的,因为夹角不变,而A、B两点的距离显然在发生改变,这就是欧氏距离和余弦相似度的不同之处。

根据欧氏距离和余弦相似度各自的计算方式和衡量特征,分别适用于不同的数据分析模型:欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异;而余弦相似度更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分用户兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦相似度对绝对数值不敏感)。

上面都是对距离度量和相似度度量的一些整理和汇总,在现实的使用中选择合适的距离度量或相似度度量可以完成很多的数据分析和数据挖掘的建模,后续会有相关的介绍。

 

1、欧式距离

   欧式距离是使用较多的相似性的度量方法,在kMeans中就使用到欧式距离作为相似项的发现。

2、皮尔逊相关系数(Pearson Correlation)

   在欧氏距离的计算中,不同特征之间的量级对欧氏距离的影响比较大,例如,我们就不能很好的利用欧式距离判断之间的相似性的大小。而皮尔逊相似性的度量对量级不敏感:

其中表示向量和向量内积,表示向量的二范数。

3、余弦相似度(Cosine Similarity)

   余弦相似度有着与皮尔逊相似度同样的性质,对量级不敏感,是计算两个向量的夹角。在吴军老师的《数学之美》上,在计算文本相似性的过程中,大量使用了余弦相似性的度量方法。
  • 大小: 2.5 KB
  • 大小: 2.2 KB
  • 大小: 1.9 KB
  • 大小: 3 KB
  • 大小: 1.9 KB
  • 大小: 2.9 KB
  • 大小: 1.6 KB
  • 大小: 18.6 KB
分享到:
评论

相关推荐

    knn距离评估

    标题"KNN距离评估"指的是对KNN算法中不同距离度量方式的分析和比较。描述提到的是四种不同的距离评估方法在KNN kernel邻近关系中的应用。下面我们将详细探讨KNN算法,以及可能的四种距离评估方法。 首先,KNN算法的...

    Java实现kNN算法

    3. **计算距离**:实现距离度量函数,例如欧几里得距离公式:`sqrt(sum((x_i - y_i)^2))`,其中x和y是两个样本的特征向量,i是特征索引。 4. **选择k个最近邻居**:使用排序算法(如快速排序或堆排序)找出训练集中...

    knn的完整c++实现

    距离公式如下: - 欧氏距离:`sqrt(sum((x1_i - x2_i)^2))` - 曼哈顿距离:`sum(|x1_i - x2_i|)` - 切比雪夫距离:`max(|x1_i - x2_i|)` 3. **选择K个最近邻**:对每个测试样本,计算其与所有训练样本的距离,...

    kNN.zip_K._KNN 分类_knn_python欧氏距离_欧氏距离

    欧氏距离公式为:`d = sqrt(sum((x1 - x2)^2))`,其中x1和x2是两个样本的特征向量。 3. **选择邻居**:选取距离新样本最近的k个训练样本作为邻居。 4. **投票决策**:根据这k个邻居的类别进行投票,选择出现频率...

    knn.ipynb_deeplearning_knn.ipynb_

    在这个案例中,我们可以期待看到KNN算法的实现步骤,包括数据加载、预处理、模型构建、训练、测试和评估等环节,同时可能还会有与深度学习相关的实验或比较。 在KNN算法中,核心思想是每个样本的类别由其最近的K个...

    KNN多类分类

    - 定义一个方法计算两个样本之间的欧几里得距离,公式为:`sqrt(sum((x_i - y_i)^2))`,其中x和y是两个样本的特征向量。 3. **KNN分类**: - 接收一个新样本,计算其与训练集中所有样本的距离。 - 选取最近的K个...

    knn代码库用于三维空间

    在三维空间中,最常用的距离度量是欧几里得距离(Euclidean Distance),公式为: \[ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2 + (z_2 - z_1)^2} \] 其中,(x_1, y_1, z_1) 和 (x_2, y_2, z_2) 分别代表两个数据...

    kNN(python实现)

    欧氏距离是最常用的,计算公式为`sqrt(sum((x1 - x2)^2))`,其中x1和x2是两个样本的特征向量。 3. **确定k值**:k值是kNN的重要参数,表示邻居的数量。k值的选择会影响模型的复杂度和泛化能力。较小的k值可能导致过...

    C语言实现的KNN算法

    这里通常选择欧氏距离,公式为:`d = sqrt(sum((x1 - x2)^2))`,其中x1和x2是两个数据点的特征向量。 3. **寻找最近邻**:对每一个待分类点,计算其与训练集中所有点的距离,然后找到最近的K个点。可以使用优先队列...

    KNN算法C++

    可以使用欧氏距离公式:`sqrt(sum((x1 - x2)^2))`,其中x1和x2分别代表两个样本的特征向量。 3. K近邻搜索:找到测试样本的K个最近邻,这通常通过构建空间索引结构,如kd树或球树来提高效率。如果没有索引,可以...

    Knn分类器java代码

    例如,欧氏距离公式为:`d = sqrt(sum((x_i - y_i)^2))`,其中x和y分别代表两个样本,i表示特征维度。 4. **选择K个最近邻**: 根据计算出的距离,选择K个最近的邻居。这里可以使用优先队列(如Java的...

    简单的knn练习

    在这个例子中,很可能使用的是欧氏距离,它是最常见的距离计算方式,公式为:`sqrt(sum((x1 - x2)^2))`,其中x1和x2是两个样本的特征向量。 3. **确定K值**:K值代表最近邻的数量,其选择对结果有很大影响。较小的K...

    用KNN算法诊断乳腺癌

    距离度量方式通常采用欧氏距离,公式为: \[ d(x, y) = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} \] #### 实验实施 1. **选择合适的k值**:通过交叉验证等方法确定最佳的k值。 2. **模型训练与测试**:将数据集分为...

    knn.zip_KNN java_classification java_java KNN_knn_knn分类

    - **距离计算**:编写函数计算两个样本之间的距离,如欧几里得距离公式:`sqrt(sum((xi-xj)^2))`,其中xi和xj是特征向量的对应元素。 - **搜索邻居**:利用排序算法(如快速排序或优先队列)找出最近的K个邻居。 ...

    机器学习C++源码解析-KNN算法-源码+数据

    欧氏距离公式为: \[ \text{Distance} = \sqrt{\sum_{i=1}^{n}(x_i - y_i)^2} \] 其中,\( n \)是特征的数量,\( x_i \)和\( y_i \)是两个样本在第\( i \)个特征上的值。 其次,KNN中的K值选择也至关重要。K值小...

    基于python实现KNN分类算法

    这里使用的是欧氏距离(Euclidean Distance),公式为 sqrt((x1-y1)**2+(x2-y2)**2)。在Python中,可以利用numpy库计算两个样本之间的欧氏距离。 3. 寻找最近邻:`distSquareMat`计算了每个样本到测试点的距离平方...

    KNN源码,一个比较新开发的代码

    1. **距离度量**:KNN算法中,样本之间的相似性通常通过欧氏距离(Euclidean Distance)来衡量,但也可能使用曼哈顿距离、切比雪夫距离或其他距离度量方式。距离越小,表示两个样本越相似。 2. **选择K值**:K值...

    KNN详细算法以及数据集

    对于n维数据,欧氏距离公式为:`sqrt(sum((x_i - y_i)^2))`,其中x和y是两个样本点,i为特征维度。 - 曼哈顿距离:在各坐标轴上分别计算两个点的距离之和,适用于城市街区问题。公式为:`sum(|x_i - y_i|)`。 - ...

    手动KNN算法的实现.zip

    2. **距离计算**:使用欧几里得距离是最常见的方法,计算公式为:`sqrt(sum((x1 - x2)²))`,其中x1和x2是两个样本向量。Numpy的`linalg`模块提供`norm`函数可以方便地计算这个距离。 3. **选择K值**:K值是KNN算法...

    一个噗噗KNN.pdf

    KNN算法中计算距离或相似度的公式有很多,如闵可夫斯基距离、曼哈顿距离、欧氏距离和切比雪夫距离等。欧氏距离是最常用的一种,它是两点之间直线距离的度量。而余弦距离则从几何角度度量两个非零向量间的夹角,用于...

Global site tag (gtag.js) - Google Analytics