计算距离的几种方式汇总

欧氏距离,两点间或多点间的距离表示法,定义于欧几里得空间中,

如点 x = (x1,...,xn) 和 y = (y1,...,yn) 之间的距离为:

缺点:会将样本不同属性(即各指标或各变量量纲)之间的差别等同看待,欧氏距离适用于向量各分量的度量标准统一的情况。

标准化欧氏距离:针对简单欧氏距离的缺点的一种改进方案。先将各个分量都“标准化”到均值、方差相等。假设样本集X的数学期望或均值(mean)为m,标准差(standard deviation,方差开根)为s,X的“标准化变量”X*表示为:(X-m)/s,标准化变量的数学期望为0,方差为1;

即:标准化后的值 =  ( 标准化前的值  - 分量的均值 ) / 分量的标准差。

两个n维向量的标准化欧氏距离:

将方差的倒数看成是一个权重,可以看成是一种加权欧氏距离。

Python实现:

欧氏距离

n维空间中两个点之间的真实距离。在二维和三维空间中的欧氏距离就是两点之间的直线距离。
x = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
y = np.array([[5, 6, 7, 8],[1, 2, 3, 4]])
euclidean_distance=np.sqrt(np.sum(np.square(x-y)))
print(euclidean_distance)

标准欧氏距离:先将各个分量都先进行标准化,再求得标准化后的欧氏距离。
X = np.vstack([x,y])
sk=np.var(X,axis=0,ddof=1)
standardized_euclidean_distance=np.sqrt(((x - y) ** 2 /sk).sum())
print(standardized_euclidean_distance)

曼哈顿距离:计算两个点在标准坐标系上的绝对轴距总和。

Python实现:
x = np.array([[1, 2, 3, 4],[5, 6, 7, 8]])
y = np.array([[5, 6, 7, 8],[1, 2, 3, 4]])
manhattan_distance=np.sum(np.abs(x-y))
print(manhattan_distance)

马氏距离,一种有效的计算两个未知样本集的相似度的方法;不受量纲的影响,两点之间的马氏距离与原始数据的测量单位无关;

由标准化数据和中心化数据(即原始数据与均值之差)计算出的二点之间的马氏距离相同。

马氏距离还可以排除变量之间的相关性的干扰;缺点是夸大了变化微小的变量的作用。

兰氏距离

余弦距离:⼏何中夹⾓余弦可衡量两个向量⽅向的差异;

机器学习中可衡量样本向量间的差异。
夹⾓余弦取值范围为[-1,1],余弦越⼤两个向量的夹⾓越⼩,余弦越⼩两向量的夹⾓越⼤。

当两个向量的⽅向重合时余弦取最⼤值1,当两个向量的⽅向完全相反余弦取最⼩值-1。

余弦相似度与向量的幅值⽆关,只与向量的⽅向相关。
x = np.array([1, 2, 3, 4])
y = np.array([5, 6, 7, 8])
cosine_distance=np.dot(x,y)/(np.linalg.norm(x)*np.linalg.norm(y))
print(cosine_distance)

Tanimoto系数是Cosine相似度的拓展:

汉明距离:两个等长字符串s1与s2的汉明距离为将⼀个变为另外⼀个所需要作的最⼩替换次数。

x = np.array([1., 2., 3., 4.])
y = np.array([5., 6., 7., 8.])
x=np.asarray(x,np.int32)
y=np.asarray(y,np.int32)
hamming_distance=np.mean(x!=y)
print(hamming_distance)

交叉熵:熵描述了整个系统内部样本之间的距离,或称系统内样本分布的集中程度(⼀致程度)、分散程度、混乱程度(不⼀致程度)。系统内样本分布越分散(或者说分布越平均),信息熵就越⼤。分布越有序(或者说分布越集中),信息熵就越⼩。
欧⽒距离损失经常⽤在线性回归问题(求解的是连续问题)中,⽽交叉熵损失经常⽤在逻辑回归问题(求解的是离散的分类问题)上,⽤来作为预测值和真实标签值的距离度量。

经过卷积操作后,最后⼀层出来的特征经过softmax函数后会变成⼀个概率向量,可以看作为是概率分布q, ⽽真实标签可以看作是概率分布p, 真实分布p和预测分布q的交叉熵就是求的loss损失值。
x = np.array([1., 2., 3., 4.])
label=np.array([1,0,0,1])
def softmax(x=x):
    return np.exp(x)/np.sum(np.exp(x),axis=0)
loss1=-np.sum(label*np.log(softmax(x)

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

用于计算两个定距向量间联系的紧密程度,取值[−1, 1];相关系数的绝对值越大,则表明X与Y相关度越高。当X与Y线性相关时,相关系数取值为1(正线性相关)或−1(负线性相关)

集合相似度

杰卡德相似系数

两个集合A和B的交集元素在A、B的并集中所占的比例,称为两个集合的杰卡德相似系数,

用符号J(A,B)表示,,衡量两个集合的相似度。

杰卡德距离:与杰卡德相似系数相反的概念,杰卡德距离用两个集合中不同元素占所有元素的比例来衡量两个集合的区分度。

 

参考:

欧氏距离缺点及改进及马氏距离_sinat_27652257的博客-CSDN博客_欧式距离缺点

马氏距离通俗理解_lzhf1122的博客-CSDN博客

几个常用的计算两个概率分布之间距离的方法以及python实现 - 百度文库 (baidu.com)

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,这里是一些大致的解决方案: 1. 加载水稻种子图像并进行处理。 你可以使用MATLAB的Image Processing Toolbox来加载和处理图像。首先,你需要将图像转换为灰度图像: ``` img = imread('rice_seeds.jpg'); gray_img = rgb2gray(img); ``` 然后,你可以对图像进行二值化处理,将水稻种子和背景分离开来: ``` bw_img = imbinarize(gray_img); ``` 接下来,你可以使用形态学运算来去除噪点和小的物体: ``` se = strel('disk', 5); bw_img = imclose(bw_img, se); bw_img = imfill(bw_img, 'holes'); bw_img = bwareaopen(bw_img, 50); ``` 2. 标记并计数水稻种子。 使用`bwlabel`函数来标记每个水稻种子并计数: ``` [labeled_img, num] = bwlabel(bw_img); ``` 这将返回一个标记过的图像和水稻种子的数量。 3. 画出相近的水稻种子的框。 使用`regionprops`函数来计算每个水稻种子的中心点和面积,然后根据中心点的距离将相近的水稻种子分组。对于每个组,使用`rectangle`函数来画出一个包含所有水稻种子的框: ``` props = regionprops(labeled_img, 'Centroid', 'Area'); centers = cat(1, props.Centroid); areas = cat(1, props.Area); distances = pdist2(centers, centers); group_idx = arrayfun(@(x)find(distances(x,:) < threshold), 1:size(distances,1), 'UniformOutput', false); for i = 1:length(group_idx) group_centers = centers(group_idx{i},:); group_box = [min(group_centers(:,1))-10, min(group_centers(:,2))-10, max(group_centers(:,1))-min(group_centers(:,1))+20, max(group_centers(:,2))-min(group_centers(:,2))+20]; rectangle('Position', group_box, 'EdgeColor', 'r', 'LineWidth', 2); end ``` 这里的`threshold`是用来定义相近的水稻种子的距离阈值的参数。 4. 计算两个框之间的距离。 使用`pdist`函数来计算所有框之间的距离: ``` box_centers = [group_box(:,1)+group_box(:,3)/2, group_box(:,2)+group_box(:,4)/2]; box_distances = pdist(box_centers); ``` 这将返回一个距离矩阵`box_distances`,其中第i行第j列的元素表示第i个框和第j个框之间的距离。 5. 将处理后的图像放在一个专门文件夹,信息汇总成表格。 使用`imwrite`函数将处理后的图像保存在一个专门的文件夹中: ``` imwrite(labeled_img, 'output_folder/output_image.jpg'); ``` 使用MATLAB的Table数据类型来汇总处理后的信息: ``` results_table = table(props.Centroid(:,1), props.Centroid(:,2), areas, 'VariableNames', {'X', 'Y', 'Area'}); writetable(results_table, 'output_folder/results_table.csv'); ``` 这将保存一个CSV文件`results_table.csv`,其中包含每个水稻种子的中心点坐标和面积。 希望这些代码可以帮助你解决问题。需要注意的是,这些代码只是一个大致的解决方案,你需要根据具体情况进行调整和优化。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值