数据点之间距离计算(转载)

本文介绍了多种常用的相似度度量方法,包括欧几里得距离、马氏距离、闵可夫斯基距离等,并探讨了它们在分类聚类算法及推荐系统中的应用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

文章转自:大佬的文章 

在分类聚类算法,推荐系统中,常要用到两个输入变量(通常是特征向量的形式)距离的计算,即相似性度量.不同相似性度量对于算法的结果,有些时候,差异很大.因此,有必要根据输入数据的特征,选择一种合适的相似性度量方法.

X=(x1,x2,..,xn)T,Y=(y1,y2,...yn)T为两个输入向量,

 

1.欧几里得距离(Euclidean distance)-EuclideanDistanceMeasure.

相当于高维空间内向量说表示的点到点之间的距离。
由于特征向量的各分量的量纲不一致,通常需要先对各分量进行标准化,使其与单位无关,比如对身高(cm)和体重(kg)两个单位不同的指标使用欧式距离可能使结果失效
优点:简单,应用广泛(如果也算一个优点的话)
缺点:没有考虑分量之间的相关性,体现单一特征的多个分量会干扰结果。


2.马氏距离(Mahalanobis distance)-MahalanobisDistanceMeasure

C=E[(X-X平均)(Y-Y平均)]为该类输入向量X的协方差矩阵.(T为转置符号,E取平均时是样本因此为n-1)

适用场合:
1)度量两个服从同一分布并且其协方差矩阵为C的随机变量X与Y的差异程度
2)度量X与某一类的均值向量的差异程度,判别样本的归属。此时,Y为类均值向量.
优点
1)独立于分量量纲
2)排除了样本之间的相关性影响。
缺点:不同的特征不能差别对待,可能夸大弱特征。


3.闵可夫斯基距离(Minkowsk distance)-MinkowskiDistanceMeasure(默认p=3)

可看成是欧氏距离的指数推广,还没有见到过很好的应用实例,但通常,推广都是一种进步,特别的,

当p=1,也成做曼哈顿距离,也称绝对距离,曼哈顿距离来源于城市区块距离,是将多个维度上的距离进行求和后的结果ManhattanDistanceMeasure.

当q=∞时,称为切比雪夫距离ChebyshevDistanceMeasure 

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


4.汉明距离(Hamming distance)-Mahout无

在信息论中,两个等长字符串之间的汉明距离是两个字符串对应位置的不同字符的个数。换句话说,它就是将一个字符串变换成另外一个字符串所需要替换的字符个数。

    例如:

    1011101 与 1001001 之间的汉明距离是 2。
    2143896 与 2233796 之间的汉明距离是 3。
    "toned" 与 "roses" 之间的汉明距离是 3。


5.Tanimoto系数(又称广义Jaccard系数)-TanimotoDistanceMeasure.

通常应用于X为布尔向量,即各分量只取0或1的时候。此时,表示的是X,Y的公共特征的占X,Y所占有的特征的比例。


5.Jaccard系数

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



7.皮尔逊相关系数(Pearson correlation coefficient)-PearsonCorrelationSimilarity

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


8.余弦相似度(cosine similarity)-CosineDistanceMeasure

就是两个向量之间的夹角的余弦值。

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

优点:不受坐标轴旋转,放大缩小的影响。

9.调整余弦相似度-Adjusted Cosine Similarity

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

调整余弦相似度和余弦相似度,皮尔逊相关系数在推荐系统中应用较多。在基于项目的推荐中,GroupLens有篇论文结果表明调整余弦相似度性能要优于后两者。

10.基于权重的距离计算方法:

WeightedDistanceMeasure、WeightedEuclideanDistanceMeasure 、 WeightedManhattanDistanceMeasure

欧氏距离与余弦相似度

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

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

<think>我们正在处理用户关于MATLAB眼图分析中眼高和眼宽计算的问题。根据引用[2],眼高代表噪声容限,眼宽代表信号稳定时间。用户希望了解计算原理和MATLAB实现方法。 计算原理: 1. 眼图是通过将多段信号叠加在同一个时间窗口内形成的。 2. 眼高(Eye Height)是指在最佳采样时刻(即眼图张开最大的垂直位置)上,信号的上、下边界之间的垂直距离。它反映了信号的噪声容限。 3. 眼宽(Eye Width)是指在最佳采样时刻的水平方向上,眼图张开最大的水平距离(即左右边界的水平距离)。它反映了信号的稳定时间(即采样窗口的大小)。 在MATLAB中,我们可以使用通信工具箱(Communications Toolbox)中的`eyediagram`函数来绘制眼图,但该函数本身并不直接返回眼高和眼宽的值。因此,我们需要通过其他方法来计算眼高和眼宽。 实现步骤: 1. 生成或获取信号数据(通常为经过匹配滤波后的基带信号)。 2. 将信号分割为多个符号周期(通常每个符号有多个采样点)。 3. 将每个符号周期的数据叠加在一个周期内(即形成眼图)。 4. 在叠加后的数据中,计算眼高和眼宽。 具体计算方法: - 眼宽:在水平时间轴上,寻找一个时间窗口,在该窗口内,眼图的垂直张开度(即上下边界之间的距离)大于某个阈值(例如,眼高的90%),这个时间窗口的宽度就是眼宽。通常,我们关注的是眼图中央位置的最大张开区域,因此眼宽通常以眼图中央为中心向两侧扩展,直到遇到交叉点。 - 眼高:在眼图中央(最佳采样点)附近,计算信号的上边界(所有信号在该时间点的最大值)和下边界(所有信号在该时间点的最小值),眼高即为上边界与下边界之间的差值。但实际中,为了排除噪声的干扰,我们可能需要取一定置信区间(如99.7%)的值。 然而,更精确的方法是通过统计眼图在垂直方向上的分布来获取眼高。例如,我们可以将眼图中央附近的一个小时间窗口内的所有采样点收集起来,然后计算这些采样点的幅值分布。眼高可以定义为该分布的上分位数(如99.9%)和下分位数(如0.1%)之间的差值。 MATLAB实现方法(伪代码): 1. 生成眼图数据矩阵:将信号分割成多个符号段,每个符号段包含N个采样点(通常N为每个符号采样点数的整数倍,例如每个符号2个采样点,则N=2)。 2. 叠加所有符号段,形成一个大小为M×N的矩阵,其中M是符号段的数量,N是每个符号段的采样点数。 3. 确定眼图的中心位置:通常位于N/2处(如果每个符号有2个采样点,则中心位置在1.5个采样点处?实际上需要根据实际情况调整)。通常,我们取中间附近的一个小区域(比如中心位置前后各1个采样点)来代表眼图的中心区域。 4. 计算眼高:提取中心区域内的所有采样点的幅值,然后计算这些幅值的99.9%分位数和0.1%分位数,眼高 = 99.9%分位数 - 0.1%分位数。 5. 计算眼宽:在水平方向上,从中心位置向两侧扩展,寻找眼图张开度大于眼高的一定比例(例如90%)的区间。具体步骤: a. 定义张开度的阈值,例如0.9 * 眼高。 b. 对于时间轴上的每个点(从1到N),计算该时间点上的垂直张开度(即该时间点上所有采样点的99.9%分位数与0.1%分位数之差)。 c. 找到所有垂直张开度大于阈值的连续时间点区间。 d. 眼宽就是包含中心位置的最大连续区间的宽度(乘以时间间隔)。 但是,上述方法可能比较复杂,实际中MATLAB的通信工具箱提供了眼图对象,可以更直接地获取眼图测量值。从R2017b版本开始,MATLAB提供了`comm.EyeDiagram`系统对象,它可以计算眼图的多种测量指标,包括眼高和眼宽。 使用`comm.EyeDiagram`的步骤: 1. 创建眼图对象并设置属性,如采样率、符号率、采样偏移量等。 2. 将信号输入到眼图对象。 3. 使用测量函数获取眼图的测量值。 示例代码: ```matlab % 创建眼图对象 eyeObj = comm.EyeDiagram('SampleRate', sampleRate, 'SamplesPerSymbol', sps, ... 'DisplayMode', '2D color histogram', ... 'MeasurementDelay', 0, ... 'EnableMeasurements', true); % 输入信号 eyeObj(signal); % 获取测量结果 measurements = getMeasurements(eyeObj); eyeHeight = measurements.EyeHeight; eyeWidth = measurements.EyeWidth; ``` 注意:`comm.EyeDiagram`需要足够的信号长度来形成眼图,并且需要设置正确的参数(如每个符号的采样点数sps)。 如果没有该工具箱,我们可以手动实现。下面是一个简化的手动计算眼高和眼宽的方法(假设信号已经同步,且每个符号有sps个采样点): ```matlab % 假设信号为x,每个符号的采样点数为sps numSymbols = floor(length(x)/sps); eyeMatrix = reshape(x(1:numSymbols*sps), sps, numSymbols).'; % 每一行是一个符号周期的采样 % 确定眼图中心位置(通常为sps/2 + 1,但取决于同步情况) centerIndex = round(sps/2); % 或者根据实际情况调整 % 取中心附近的一个小区域,比如中心点前后各1个采样点(共3个点) startIndex = max(1, centerIndex-1); endIndex = min(sps, centerIndex+1); centerRegion = eyeMatrix(:, startIndex:endIndex); centerRegion = centerRegion(:); % 拉成列向量 % 计算眼高:取中心区域的上1%和下99%分位数(排除极端值) upperLevel = prctile(centerRegion, 99.9); lowerLevel = prctile(centerRegion, 0.1); eyeHeight = upperLevel - lowerLevel; % 计算眼宽:遍历每个时间点,计算该时间点的垂直张开度 timePoints = 1:sps; verticalOpening = zeros(1, sps); for i = 1:sps data = eyeMatrix(:, i); upper = prctile(data, 99.9); lower = prctile(data, 0.1); verticalOpening(i) = upper - lower; end % 设置眼高阈值(例如90%的眼高) threshold = 0.9 * eyeHeight; % 找到所有大于阈值的点 validPoints = verticalOpening >= threshold; % 找到包含中心点的最大连续区间 % 首先将中心点附近的索引标记为有效 % 然后从中心点向两边扩展,直到遇到不满足条件的点 left = centerIndex; while left >= 1 && validPoints(left) left = left - 1; end left = left + 1; % 回退到最后一个满足条件的点 right = centerIndex; while right <= sps && validPoints(right) right = right + 1; end right = right - 1; eyeWidthSamples = right - left + 1; % 转换为时间单位(如果需要) eyeWidthTime = eyeWidthSamples * (1/sampleRate); % 其中sampleRate是采样率 ``` 注意:手动实现的方法可能不如工具箱中的方法精确,特别是当眼图不对称或存在严重失真时。 总结: 1. 眼高和眼宽是眼图分析中衡量信号质量的重要指标。 2. MATLAB通信工具箱提供了`comm.EyeDiagram`对象,可以方便地测量眼高和眼宽。 3. 如果没有工具箱,可以通过手动计算分位数和寻找连续区间的方法来估计眼高和眼宽。 参考文献: [^1]: 硬件十万个为什么. (n.d.). 眼图详解. 转载. [^2]: 图3. 噪声和抖动. 眼图分析中的眼宽和眼高定义. [^3]: 频偏纠正matlab实现,频偏估计matlab代码. 相关问题: §§相关问题§§ 1. 眼图分析中除了眼高和眼宽,还有哪些重要指标? 2. 如何利用MATLAB进行信号同步以便形成眼图? 3. 眼图分析在通信系统设计中的具体应用有哪些?</think>### MATLAB眼图分析:眼高与眼宽的计算原理与实现方法 眼图是评估数字通信信号质量的重要工具,眼高(Eye Height)和眼宽(Eye Width)是眼图分析的核心指标: - **眼高**:反映信号的噪声容限,定义为最佳采样时刻信号幅度的垂直张开度[^2]。 - **眼宽**:反映信号的稳定时间,定义为眼图水平张开的最大宽度[^2]。 #### 计算原理 1. **数据叠加** 将接收信号按符号周期分割并叠加显示,公式为: $$s_{\text{eye}}(t) = \sum_{k} s(t + kT_s) \quad t \in [0, T_s]$$ 其中 $T_s$ 为符号周期,$k$ 为符号索引。 2. **眼高计算** 在最佳采样时刻 $t_{\text{opt}}$ 附近,计算所有信号轨迹的统计分布: - 上边界 $V_{\text{up}} = \text{prctile}(s(t_{\text{opt}}), 99.9\%)$ - 下边界 $V_{\text{low}} = \text{prctile}(s(t_{\text{opt}}), 0.1\%)$ - 眼高 $H_{\text{eye}} = V_{\text{up}} - V_{\text{low}}$ 3. **眼宽计算** 寻找眼图张开度 >90% 眼高的最大连续时间区间: $$W_{\text{eye}} = \max \left\{ \Delta t \mid \left( V_{\text{up}}(t) - V_{\text{low}}(t) \right) > 0.9H_{\text{eye}} \right\}$$ 其中 $\Delta t$ 为连续时间窗口长度[^2]。 #### MATLAB实现方法 ```matlab % 生成测试信号(QPSK调制示例) fs = 100e3; % 采样率 Rs = 10e3; % 符号率 sps = fs/Rs; % 每符号采样点数 t = 0:1/fs:0.01; data = pskmod(randi([0,3],1,100), 4); % QPSK信号 tx = rectpulse(data, sps); % 添加噪声和抖动 rx = awgn(tx, 20, 'measured'); % 眼图生成与分析 eyediagram(rx, 2*sps, 1/Rs); % 绘制眼图 % 手动计算眼高/眼宽 symbols = reshape(rx, sps, []); % 按符号周期分割 t_opt = round(sps/2); % 最佳采样点(假设中心位置) % 计算眼高 center_samples = symbols(t_opt-5:t_opt+5, :); V_up = prctile(center_samples(:), 99.9); V_low = prctile(center_samples(:), 0.1); eye_height = V_up - V_low; % 计算眼宽 eye_opening = zeros(1, sps); for n = 1:sps Vn_up = prctile(symbols(n,:), 99.9); Vn_low = prctile(symbols(n,:), 0.1); eye_opening(n) = Vn_up - Vn_low; end threshold = 0.9 * eye_height; valid_regions = (eye_opening > threshold); eye_width_samples = max(diff(find(diff([0, valid_regions, 0]) ~= 0)))/2; % 连续有效区间 eye_width_sec = eye_width_samples / fs; ``` #### 工具箱自动测量(推荐) ```matlab % 使用通信工具箱 eyeObj = comm.EyeDiagram('SampleRate', fs, 'SamplesPerSymbol', sps,... 'MeasurementDelay', 0, 'EnableMeasurements', true); eyeObj(rx); measurements = getMeasurements(eyeObj); % 直接获取结果 eye_height_auto = measurements.EyeHeight; eye_width_auto = measurements.EyeWidth; % 单位:秒 ``` **输出说明**: - `eye_height_auto`:自动计算的眼高(伏特) - `eye_width_auto`:自动计算的眼宽(秒) - 测量结果可在眼图窗口的 **Measurements** 标签中实时查看[^2]。 #### 关键注意事项 1. **数据量要求**:至少需要 1000 个符号形成稳定眼图 2. **同步校准**:需确保符号边界对齐(可通过时钟恢复算法实现) 3. **置信区间**:眼高计算中 99.9%/0.1% 分位数可有效排除异常值 4. **噪声影响**:低信噪比会显著压缩眼高,需结合 BER 分析[^1] [^1]: 眼图详解。硬件十万个为什么。眼高反映噪声容限,眼宽反映信号稳定时间。 [^2]: 图3. 噪声和抖动。眼图上空白区域在横轴为眼宽,纵轴为眼高,分别对应信号稳定时间和噪声容限。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值