`

近似度计算-欧几里得和皮尔逊

阅读更多

在数据挖掘中经常会计算相似度,用java实现了欧几里得和皮尔逊算法

1、欧几里得

找出可以作为衡量物品或人的数,作为坐标,最后计算坐标之间的距离L

最后计算: r = 1/(1 + L) r属于[0, 1]   1表示完全相似, 0代表没有共同点

java的实现:

package com.euclid.sosop;

import java.util.HashMap;
import java.util.Map;
import java.util.Map.Entry;
/**
 * 
 * @author sosop
 * euclid approximate  欧几里得距离计算,相似度算法之一
 *
 */

public class EuclidApproximate {
	
	/**
	 * Map的key为label,value为坐标值
	 * 只有相同的label才参与计算
	 */
	public static double distance(Map<String, Double> map1, Map<String, Double> map2) {
		
		//平方和
		double sum = 0;
		
		int common = 0;
		
		for (Entry<String, Double> entry : map1.entrySet()) {
			//判断是否具有共同处
			if(map2.containsKey(entry.getKey())) {
				//(x-y)的平方和
				sum += Math.pow(entry.getValue() - map2.get(entry.getKey()), 2);
				common ++;
			}
		}
		
		//没有共同处
		if(common == 0) return 0;
		
		//近似度 [0, 1]  1:完全近似
		//较简单的计算相似度,朴素相似度
		// double sim = 1 / (Math.sqrt(sum) + 1);
		
		//较精确的计算
		double sim = Math.sqrt(sum/(double) common);
		sim = 1.0 - Math.tanh(sim);
		int max = Math.min(map1.size(), map2.size());
		sim = sim * ((double)common / (double)max);
		
		return sim;
	}
	
	public static void main(String[] args) {
		Map<String, Double> map1 = new HashMap<>();
		map1.put("a", 10.88);
		map1.put("b", 2.5);
		map1.put("c", 0.9);
		map1.put("d", 20.76);
		map1.put("e", 6.3);
		
		Map<String, Double> map2 = new HashMap<>();
		map2.put("a", 10.5);
		map2.put("b", 2.1);
		map2.put("c", 0.9);
		map2.put("d", 20.22);
		map2.put("e", 6.1);
		
		System.out.println(distance(map1, map2));
	}
}

 2、皮尔逊

关键在于一条拟合直线。

将所有作为衡量的数在坐标上标记出来,画一条离所有坐标最近的直线就是拟合直线。

最佳拟合线的优势在于不会受到噪声的影响很小

计算相对于欧几里得较复杂

取值范围:[-1, 1]     小于0, 负相关的 ; 大于0,正相关;取绝对值找相似度 |r|越大, 相似度越高

下面是java实现的算法:

package com.pearson.sosop;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;


/**
 * 
 * @author sosop
 * pearson approximate 皮尔逊相似度算法
 *
 */
public class Pearson {
	public static double coefficient(Map<String, Double> map1, Map<String, Double> map2) {
	
		//找到共同之处,保存于List
		List<String> same = new ArrayList<>();
		for (Entry<String, Double> entry : map1.entrySet()) {
			if (map2.containsKey(entry.getKey())) {
				same.add(entry.getKey());
			}
		}
		
		//共同数目
		int items = same.size();
		if(items == 0) return 0;
		
		double sum1 = 0, sum2 = 0, sqrtSum1 = 0, sqrtSum2 = 0, pSum = 0;
		for (String label : same) {
			sum1 += map1.get(label);
			sum2 += map2.get(label);
			sqrtSum1 += Math.pow(map1.get(label), 2);
			sqrtSum2 += Math.pow(map2.get(label), 2);
			pSum += (map1.get(label) * map2.get(label));
		}
		
		double num, den;
		
		num = pSum - (sum1 * sum2 / items);
		
		den = Math.sqrt((sqrtSum1 - Math.pow(sum1, 2) / items) * (sqrtSum2 - Math.pow(sum2, 2) / items));
		
		if(den == 0) return 0;
		
		return num / den;
	}
	
	public static void main(String[] args) {
		Map<String, Double> map1 = new HashMap<>();
		map1.put("a", 0.5);
		map1.put("b", 3.1);
		map1.put("c", 7.9);
		map1.put("d", 0.22);
		map1.put("e", 0.1);
		
		Map<String, Double> map2 = new HashMap<>();
		map2.put("a", 10.88);
		map2.put("b", 2.5);
		map2.put("c", 0.9);
		map2.put("d", 20.76);
		map2.put("e", 6.3);
		
		
		System.out.println(coefficient(map1, map2));
	}
}

 

 

分享到:
评论

相关推荐

    OpenCV---基于欧几里得距离计算公式的图像二值化实现

    在本主题“OpenCV---基于欧几里得距离计算公式的图像二值化实现”中,我们将深入探讨如何利用OpenCV库,结合欧几里得距离的概念,对图像进行二值化处理。 OpenCV(Open Source Computer Vision Library)是一个开源...

    基于对数-欧几里得距离的地面红外图像云分类

    在实验中选取了七个红外云图像的维度特征进行分类,这些特征包括均值、标准差、平滑度、三阶矩、一致性、熵和与清晰图像的相关性。这些特征的选择是依据Calbó的方法推荐的。研究人员随机选取了每种类别的50%、60%...

    近似熵程序-近似熵程序.rar

    6. **计算近似熵**:ApEn定义为: \[ ApEn = -\log\left(\frac{C(m, r)}{C(m+1, r)}\right) \] 通过对不同m值下的ApEn值进行平均,可以得到最终的近似熵。 7. **结果解释**:较小的ApEn值通常表示系统更有序,更...

    python计算皮尔逊系数

    先定义欧几里得距离函数;先定义皮尔逊系数函数,利用for循环把皮尔逊系数公式的各个组成部分算出来,计算皮尔逊系数,调用函数计算皮尔逊系数。

    Myfloyd.zip_皮尔逊_皮尔逊相关_皮尔逊系数_相关性计算_相关系数

    这个压缩包文件包含了一些与皮尔逊相关系数计算相关的MATLAB代码,如`distance.m`, `distancee.m`, `Myfloydw.m` 和 `Myfloyd.m`,这些脚本可能用于执行实际的计算。 首先,让我们深入了解皮尔逊相关系数的定义和...

    matlab开发-QAM的欧几里得距离最小值

    在二维空间中,两个点\( (x_1, y_1) \)和\( (x_2, y_2) \)之间的欧几里得距离计算公式为: \[ d = \sqrt{(x_2 - x_1)^2 + (y_2 - y_1)^2} \] 在QAM中,每个信号点代表一对幅度和相位,因此计算的是复数之间的距离。 ...

    扩展欧几里得求逆-扩展欧几里得算法求乘法逆元

    扩展欧几里得算法是数论中的一个经典算法,它主要用于求解线性同余方程,例如找寻满足\( ax \equiv b \mod m \)的x值。...在编程竞赛和实际项目中,熟练使用扩展欧几里得算法可以提高问题解决的效率和质量。

    近似熵:此函数计算数据系列的近似熵。-matlab开发

    在计算近似熵时,我们需要将这些数值按照时间顺序排列,形成一个一维的时间序列。 2. **窗口大小**(m): 窗口大小是计算近似熵时的关键参数,它决定了我们比较相邻数据点的子序列长度。通常,选择的m值应该足够...

    设计郑宗汉郑晓明近似算法PPT学习教案.pptx

    - 完全多项式近似方案更进一步,计算时间同时与1/ε和n成多项式关系,ε是允许的误差范围。 5. 实际问题的应用举例:欧几里得旅行商问题 - 给定平面上的顶点和它们之间的欧几里得距离,旅行商问题要求找出经过每...

    近似熵函数_matlab近似熵_近似熵_

    近似熵(Approximate Entropy, ApEn)是一种复杂性度量方法,常用于时间序列分析,特别是医学信号处理和金融数据分析等领域。...通过学习和理解近似熵的计算过程,我们可以更好地理解和处理各种复杂数据集。

    crowding_distance_distance_拥挤度计算_

    在多目标优化问题中,拥挤度计算是一种常用的技术,它被用于评估和比较解空间中的个体,特别是在进化算法如NSGA-II(非支配排序遗传算法第二代)中。"crowding_distance_distance_拥挤度计算_"这个标题暗示我们将...

    欧几里得算法的应用 欧几里得算法的应用 欧几里得算法的应用

    从最基本的数论问题到复杂的工程和科学计算,欧几里得算法及其拓展版本都在扮演着不可或缺的角色。通过对这一算法的深入理解,我们不仅能更加熟练地掌握数论的基础,也能在众多领域中发现更多创新的解决方案。

    欧几里得算法及扩展的欧几里得算法的C++实现

    在压缩包中的`EuclideanAlgorithm.cpp`和`extend_Eulid.cpp`文件可能分别包含了基本欧几里得算法和扩展欧几里得算法的实现。`.exe`文件则是编译后的可执行程序,用户可以直接运行查看算法的执行结果,这对于初学者...

    利用扩展欧几里得算法快速计算组合数取模

    利用扩展欧几里得方法,进行快速的计算C(n,m)%P;

    扩展欧几里得算法-python版

    当a,b,且a互质时,计算ax+by=1的值, 是计算RSA密钥的基本步骤之一。

    数学笔记19-什么是欧几里得算法?

    欧几里得算法,源于古希腊数学家欧几里得的一项发现,是一种高效计算两个正整数最大公约数(Greatest Common Divisor, GCD)的方法,通常被称为辗转相除法。算法的核心在于通过连续的除法步骤,将大数不断除以小数,...

    欧几里得算法的简单概述

    通过这个例子可以看出,欧几里得算法通过不断地替换和计算余数,最终能够高效地找到两个数的最大公约数。 #### 总结 欧几里得算法是一种高效、简洁的方法,用于计算两个正整数的最大公约数。它基于递归性质和分解...

    无线传感器网络的欧几里得定位算法

    `compnw.pdf`可能是一份关于WSNs中计算网络层面的详细文档,可能涵盖了如何在实际网络中实现欧几里得定位算法的细节,包括通信协议、数据包格式和误差处理等内容。 `Sensor Positioning.pdf`可能包含了无线传感器...

    使用扩展欧几里得算法求乘法逆元

    扩展欧几里得算法是欧几里得算法的一种扩展,不仅能够找到两个整数的最大公约数(GCD),还能同时计算出它们的贝祖等式解。贝祖等式是这样的形式:ax + by = gcd(a, b),其中x和y是求解的系数。当a和b互质时,即gcd...

Global site tag (gtag.js) - Google Analytics