常用相似度计算方法总总结

一、欧几里得相似度

1、欧几里得相似度

公式如下所示:

 2、自定义代码实现


import numpy as np
def EuclideanDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.sqrt(np.sum(np.square(x-y)))

# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

euclidean_distance = EuclideanDistance(x, y)
print(f"euclidean distance is: {euclidean_distance}")

二、皮尔森相关性系数

1、皮尔森相关性系数

       相关系数:考察两个事物(在数据里我们称之为变量)之间的相关程度。

公式如下所示:

       如果有两个变量:X、Y,最终计算出的相关系数的含义可以有如下理解:

(1)、当相关系数为0时,X和Y两变量无关系。

(2)、当X的值增大(减小),Y值增大(减小),两个变量为正相关,相关系数在0.00与1.00之间。

(3)、当X的值增大(减小),Y值减小(增大),两个变量为负相关,相关系数在-1.00与0.00之间。

       相关系数的绝对值越大,相关性越强,相关系数越接近于1或-1,相关度越强,相关系数越接近于0,相关度越弱。

        通常情况下通过以下取值范围判断变量的相关强度:
        相关系数     0.8-1.0     极强相关
                            0.6-0.8     强相关
                            0.4-0.6     中等程度相关
                            0.2-0.4     弱相关
                            0.0-0.2     极弱相关或无相关

 2、代码实现过程

  自定义实现过程

import numpy as np

def pearson_correlation(x, y):
    n = len(x)
    # 计算平均值
    x_bar = np.sum(x) / n
#     y_bar = np.sum(y) / n
    # 计算协方差
    cov_xy = np.sum((x - x_bar) * (y - y_bar))
    # 计算标准差
    std_dev_x = np.sqrt(np.sum((x - x_bar) ** 2) / (n - 1))
    std_dev_y = np.sqrt(np.sum((y - y_bar) ** 2) / (n - 1))

    # 计算皮尔逊相似系数
    r = cov_xy / (std_dev_x * std_dev_y)
    return r


# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

# 计算皮尔逊相似系数
pearson_coefficient = pearson_correlation(x, y)
print(f"Pearson correlation coefficient: {pearson_coefficient}")

 numpy中的corrcpef()封装实现

import numpy as np

# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]

x=np.array([3.3,6.5,2.8,3.4,5.5])
y=np.array([3.5,5.8,3.1,3.6,5.1])

pc=np.corrcoef(x,y)

print(pc)

3、适用范围

      当两个变量的标准差都不为零时,相关系数才有定义,皮尔逊相关系数适用于:

      (1)、两个变量之间是线性关系,都是连续数据。

      (2)、两个变量的总体是正态分布,或接近正态的单峰分布。

      (3)、两个变量的观测值是成对的,每对观测值之间相互独立。

三、余弦相似度

1、余弦相似度

公式如下所示:

 2、自定义代码实现 

import numpy as np
def moreCos(a,b):
    sum_fenzi = 0.0
    sum_fenmu_1,sum_fenmu_2 = 0,0
    for i in range(len(a)):
        sum_fenzi += a[i]*b[i]
        sum_fenmu_1 += a[i]**2
        sum_fenmu_2 += b[i]**2

    return sum_fenzi/(np.sqrt(sum_fenmu_1) * np.sqrt(sum_fenmu_2) )


# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

cos = moreCos(x, y)
print(f"cos is: {cos}")

四、曼哈顿相似度

1、曼哈顿相似度

公式如下所示:

 2、自定义代码实现 

import numpy as np
def ManhattanDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.sum(np.abs(x-y))



# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

manhattan_distance = ManhattanDistance(x, y)
print(f"manhattan distance is: {manhattan_distance}")

五、切比雪夫距离

1、切比雪夫距离

公式如下所示:

       切比雪夫距离(Chebyshev Distance)的定义为:max( | x2-x1 | , |y2-y1 | , … ), 切比雪夫距离用的时候数据的维度必须是三个以上。

 2、自定义代码实现 

import numpy as np
def ChebyshevDistance(x, y):
    import numpy as np
    x = np.array(x)
    y = np.array(y)
    return np.max(np.abs(x-y))



# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

chebyshev_istance = ChebyshevDistance(x, y)
print(f"manhattan distance is: {chebyshev_istance}")

六、马氏距离

1、马氏距离

公式如下所示:

        M个样本向量X1~Xm,协方差矩阵记为S,均值记为向量μ,则其中样本向量X到u的马氏距离表示为

 2、自定义代码实现 

def MahalanobisDistance(x, y):
    '''
    马氏居立中的(x,y)与欧几里得距离的(x,y)不同,欧几里得距离中的(x,y)指2个样本,每个样本的维数为x或y的维数;这里的(x,y)指向量是2维的,样本个数为x或y的维数,若要计算n维变量间的马氏距离则需要改变输入的参数如(x,y,z)为3维变量。
    '''
    import numpy as np
    x = np.array(x)
    y = np.array(y)

    X = np.vstack([x, y])
    X_T = X.T
    sigma = np.cov(X)
    sigma_inverse = np.linalg.inv(sigma)

    d1 = []
    for i in range(0, X_T.shape[0]):
        for j in range(i + 1, X_T.shape[0]):
            delta = X_T[i] - X_T[j]
            d = np.sqrt(np.dot(np.dot(delta, sigma_inverse), delta.T))
            d1.append(d)

    return d1


# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3,6.5,2.8,3.4,5.5])
y = np.array([3.5,5.8,3.1,3.6,5.1])

mahalanobis_istance = MahalanobisDistance(x, y)
print(f"mahalanobis distance is: {mahalanobis_istance}")

七、闵可夫斯基距离

1、闵可夫斯基距离

公式如下所示:

当p=1时,就是曼哈顿距离

当p=2时,就是欧氏距离

当p→∞时,就是切比雪夫距离

 2、自定义代码实现 

import numpy as np


def MinkowskiDistance(x, y, p):
    import math
    import numpy as np
    zipped_coordinate = zip(x, y)
    return math.pow(np.sum([math.pow(np.abs(i[0] - i[1]), p) for i in zipped_coordinate]), 1 / p)


# 示例数据
# 用户1 的A B C D E商品数据 [3.3,6.5,2.8,3.4,5.5]
# 用户2 的A B C D E商品数据 [3.5,5.8,3.1,3.6,5.1]
x = np.array([3.3, 6.5, 2.8, 3.4, 5.5])
y = np.array([3.5, 5.8, 3.1, 3.6, 5.1])

# minkowski_istance = MinkowskiDistance(x, y,1)
# minkowski_istance = MinkowskiDistance(x, y,2)
minkowski_istance = MinkowskiDistance(x, y,3)
print(f"minkowski_ distance is: {minkowski_istance}")

八、信息熵

1、 信息熵

         衡量分布的混乱程度或分散程度的一种度量.

         熵的值就越大,样本一致性越低,越代表分之样本种类越多,越混乱,不确定性越强。

         熵的值就越小,样本一致性越高,样本越倾向于某一类。

         熵的值就为0,代表样本完全属于同一类。

公式如下所示:

 2、自定义代码实现 

import numpy as np

# 示例数据

data=np.array(['a','b','c','a','a','b'])

data1=np.array(['中国','中国','中国','中国','中国','中国','中国','中国','人民',])

#计算信息熵的方法
def calc_ent(x):
    """
        calculate shanno ent of x
    """

    x_value_list = set([x[i] for i in range(x.shape[0])])
    ent = 0.0
    for x_value in x_value_list:
        p = float(x[x == x_value].shape[0]) / x.shape[0]
        logp = np.log2(p)
        ent -= p * logp

    return ent

ent = calc_ent(data)
ent1= calc_ent(data1)

print(f"ent  is: {ent}")
print(f"ent  is: {ent1}")

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

自己的博客阵地(互联网核心之一 DNS)

DNS(Domain Name System)是一种用于将易记的域名映射到计算机网络中的 IP 地址的系统。它充当互联网上计算机和网络设备的地址簿,使人们可以使用便于记忆的域名来访问网站,而不必记住复杂的数字IP地址。(完全合格域名) 名字号联系…

卡尔曼滤波跟踪自由落体的高度程序,带MATLAB例程

背景 已知一物体做自由落体运动,对其高度进行20次测量,测量值如下表:(g=9.80m/s2). 设高度的测量误差分布为: N(0, 1),该物体的初始高度h0和速度v0分布也为高斯分布,且: 试求该物体高度和速度的随时间变化的最优估计(matlab Kalman filters)。N(0, 1),该物体的初始高…

vs2019新建Qt工程中双击 .ui 文件无法打开

vs2019 中创建的 Qt 工程,在使用的过程中,经常会有:双击 .ui 文件,闪退的情况,也即 .ui 文件无法打开! 针对该问题的详细解决步骤如下: 1、右击该 .ui 文件,选择“打开方式” 2、…

GuLi商城-商品服务-API-三级分类-网关统一配置跨域

参考文档: https://tangzhi.blog.csdn.net/article/details/126754515 https://github.com/OYCodeSite/gulimall-learning/blob/master/docs/%E8%B0%B7%E7%B2%92%E5%95%86%E5%9F%8E%E2%80%94%E5%88%86%E5%B8%83%E5%BC%8F%E5%9F%BA%E7%A1%80.md 谷粒商城-day04-完…

LabVIEW比例流量阀自动测试系统

LabVIEW比例流量阀自动测试系统 开发了一套基于LabVIEW编程和PLC控制的比例流量阀自动测试系统。通过引入改进的FCMAC算法至测试回路的压力控制系统,有效提升了压力控制效果,展现了系统的设计理念和实现方法。 项目背景: 比例流量阀在液压…

在存在代理的主机上,为docker容器配置代理

1、配置Firefox的代理 (只配置域名或者ip,前面不加http://) 2、为容器中的Git配置代理 git config --global http.proxy http://qingteng:8080 3、Git下载时忽略证书校验 env GIT_SSL_NO_VERIFYtrue git clone https://github.com/nginx/nginx.git 4、docker的…

Qt 窗口(MainWindow) 上

Qt 窗口是通过 QMainWindow 类来实现的。 QMainWindow 是一个为用户提供主窗口程序的类,继承自 QWidget 类,并且提供了⼀个预定义的布局。QMainWindow 包含一个菜单栏(menubar)、多个工具栏(toolbars)、多个浮动窗口(…

yolov6实现遥感影像目标识别|以DIOR数据集为例

1 目标检测是计算机视觉领域中的一项重要任务,它的目标是在图像或视频中检测出物体的位置和类别。YOLO(You Only Look Once)是一系列经典的目标检测算法,最初由Joseph Redmon等人于2016年提出。YOLO算法具有快速、简单、端到端的特…

【机器学习之---统计】统计学基础概念

every blog every motto: You can do more than you think. https://blog.csdn.net/weixin_39190382?typeblog 0. 前言 统计学基础 1. 频率派 频率学派(传统学派)认为样本信息来自总体,通过对样本信息的研究可以合理地推断和估计总体信息…

深入理解MySQL中的JOIN算法

码到三十五 : 个人主页 心中有诗画,指尖舞代码,目光览世界,步履越千山,人间尽值得 ! 目录 一、引言二、嵌套循环连接(Nested-Loop Join)2.1 工作原理2.2 性能考虑2.3 优化策略 三、块嵌套循环…

如何在iOS系统抓取log

前言:因为作者目前工作领域和苹果智能家居有关,然后发现一些bug其实是apple sdk原生code的问题,所以需要给apple提radar单,就需要抓ios端Log充当证据给apple看,其实ios抓log非常简单,大家感兴趣可以学习下哦…

谈谈synchronized关键字

synchronized是什么? synchronized为同步之意,可保证在同一时刻,被它修饰的方法或代码块只能有一个线程执行,它的使用解决了并发多线程中的三大问题:原子性、可见性、顺序性。 有的书籍中可能会看到说synchronized是…

用vscode调试cpp程序相关操作记录

需要在服务器上用vscode调试cpp程序,写此记录launch.json配置和相关步骤错误导致的问题 1.在需要运行程序的服务器上安装C/C Extension Pack(之前只在本地装了),可以支持调试C/C应用程序(设置断点,单步执行&#xff0c…

【计算机视觉】Gaussian Splatting源码解读补充(二)

第一部分 本文是对学习笔记之——3D Gaussian Splatting源码解读的补充,并订正了一些错误。 目录 三、相机相关scene/cameras.py:class Camera 四、前向传播(渲染):submodules/diff-gaussian-rasterization/cuda_rast…

【java数据结构】基于java提供的ArrayList实现的扑克牌游戏-(附源码~)

【Java数据结构】基于java泛型实现的二维数组完成三人扑克游戏 基本框架的实现创建一副牌如何进行洗牌:每个人抓的牌放到哪里: 源码具体实现cardcardsTest 个人简介:努力学编程 每日鸡汤:stay foolish,stay hungry-史蒂芬.乔布斯斯…

springboot+vue 的图书个性化推荐系统的设计与实现

图书个性化推荐系统的主要使用者分为管理员和学生,实现功能包括管理员:首页、个人中心、学生管理、图书分类管理、图书信息管理、图书预约管理、退换图书管理、管理员管理、留言板管理、系统管理,学生:首页、个人中心、图书预约管…

适用于 Windows PC 的 6 款最佳照片恢复软件

您想向您的朋友展示您上个月访问迈阿密海滩的照片。可惜!您的 Windows 计算机中不再有照片文件夹。不仅是这个文件夹,您还发现您的许多重要和有趣时刻的照片都丢失了!这意味着您丢失了许多家庭成员、可爱宝宝的珍贵照片或毕业典礼等难忘活动的…

利用Base64加密算法将数据加密解密

1. Base64加密算法 Base64准确来说并不像是一种加密算法,而更像是一种编码标准。 我们知道现在最为流行的编码标准就是ASCLL,它用八个二进制位(一个char的大小)表示了127个字符,任何二进制序列都可以用这127个字符表…

chap验证实验

一、添加接口 在每个路由器里添加2SA接口 二、配IP 进入serial接口配置IP R1: R2: ppp mp Mp-group 0/0/0 R3: 查看: 三、aaa认证,chap验证 创建一个新用户: R2进入3/0/0接口: R1进入3/0/0接口&a…

制作一个RISC-V的操作系统六-bootstrap program(risv 引导程序)

文章目录 硬件基本概念qemu-virt地址映射系统引导CSR![在这里插入图片描述](https://img-blog.csdnimg.cn/direct/86461c434e7f4b1b982afba7fad0256c.png)machine模式下的csr对应的csr指令csrrwcsrrs mhartid引导程序做的事情判断当前hart是不是第一个hart初始化栈跳转到c语言的…