欧几里得 皮尔逊 归一化 加权 求和
时间: 2025-01-04 14:14:36 浏览: 6
### 实现欧几里得距离与皮尔逊相关系数的归一化加权求和
为了实现欧几里得距离与皮尔逊相关系数的归一化加权求和,需要先理解这两种度量方法的特点以及它们各自的取值范围。
#### 欧几里得距离
欧几里得距离用于衡量多维空间中两点之间的直线距离。其计算公式如下:
\[ d_{\text{Euclidean}}(A,B) = \sqrt{\sum (a_i - b_i)^2} \]
其中 \( a_i \) 和 \( b_i \) 是 A 和 B 对应维度上的坐标值[^2]。
对于不同的数据集,欧几里得距离可能具有非常大的动态范围,因此在与其他指标组合之前应当对其进行标准化处理。
#### 皮尔逊相关系数
皮尔逊相关系数用来评估两组变量间线性关系强度的一个统计测量工具,它能够反映两者变化趋势的一致性程度。该系数介于 -1 到 +1 之间,当接近±1时表示强正负关联;靠近0则意味着几乎没有线性联系存在[^1]。
由于皮尔逊相关性的定义域已经限定好了(-1到+1),所以在大多数情况下不需要额外做缩放变换即可参与后续运算操作。
#### 归一化过程
为了让两种度量能够在相同的尺度下比较并融合起来,有必要对原始得分实施某种形式的标准转换。常用的做法是对每一个分数组件分别执行最小最大规范化(min-max normalization):
\[ s'=\frac{s-\min(s)}{\max(s)-\min(s)} \]
这里 \(s'\) 表示经过映射后的分数,\(s\) 是待调整的数据序列中的某个具体观测值。
针对本案例而言,则需单独考虑每种测距方式的最大最小边界条件:
- **欧几里得距离**: 计算所有样本间的欧式间距得到一系列数值作为输入给上述公式;
- **皮尔逊相关系数**: 考虑到此参数天然具备良好的分布特性(即[-1,+1]),可以直接跳过这一步骤或仅简单平移至非负区间内再继续下一步工作流程。
最后通过引入权重因子 w 来控制各自贡献比例完成最终合成评分构建:
\[ S=w_1\times s'_d+(1-w_1)\times s'_p \]
此处 \(w_1\) 控制着欧氏距离的影响力度大小,而剩余部分自然对应的就是皮尔森指数所占份额了。
下面是Python代码片段展示这一逻辑的具体实现方式:
```python
import numpy as np
from scipy.spatial.distance import euclidean, pdist, squareform
from scipy.stats import pearsonr
def normalize_scores(scores):
"""Apply min-max scaling to scores."""
return (scores - np.min(scores)) / (np.max(scores) - np.min(scores))
def combined_metric(data_points, weight_euclid=0.5):
"""
Calculate weighted sum of normalized Euclidean distances and Pearson correlations.
Parameters:
data_points : array-like, shape=(n_samples, n_features)
Input dataset containing multiple observations with features.
weight_euclid : float, default=0.5
Weight assigned to the Euclidean distance component.
Returns:
ndarray: Combined metric values between all pairs of points.
"""
# Compute pairwise Euclidean distances
dist_matrix = squareform(pdist(data_points))
# Normalize these distances into range [0, 1]
norm_dist = normalize_scores(dist_matrix)
# Initialize matrix for storing correlation coefficients
corr_matrix = np.zeros_like(norm_dist)
# Fill upper triangle only since lower will be symmetric anyway
for i in range(len(data_points)):
for j in range(i+1, len(data_points)):
r, _ = pearsonr(data_points[i], data_points[j])
corr_matrix[i][j] = abs(r)+1 # Shifted up by one unit
# Mirror across diagonal so that whole thing becomes symmetrical again
corr_matrix += corr_matrix.T - np.diag(np.diag(corr_matrix))
# Apply same normalization scheme here too but remember we've shifted ranges already!
norm_corr = normalize_scores(corr_matrix)
# Combine both metrics according to specified weights
result = weight_euclid * norm_dist + (1-weight_euclid)*norm_corr
return result
# Example usage
data = [[1, 2], [4, 6], [7, 8]]
result = combined_metric(data, weight_euclid=0.7)
print(result)
```
阅读全文