k互近邻

定义 N ( p , k ) N\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right) N(p,k) p p p k k k 近邻(即与目标最接近的前 k k k个样本):

N ( p , k ) = { g 1 0 , g 2 0 , ⋯ , g k 0 } , ∣ N ( p , k ) ∣ = k N\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right){\rm{ = }}\left\{ {{\mathop{\rm g}\nolimits} _{\rm{1}}^{\rm{0}} , {\mathop{\rm g}\nolimits} _{\rm{2}}^{\rm{0}}, \cdots , {\mathop{\rm g}\nolimits} _{\rm{k}}^{\rm{0}}} \right\}, \left| {N\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right)} \right| = {\rm{k}} N(p,k)={g10g20gk0},N(p,k)=k

显而易见,如果A与B相似,那么B与A也一定相似。因此可以定义目标 p p p k k k互近邻 R ( p , k ) R\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right) R(p,k)为:

R ( p , k ) = { g i ∣ ( g i ∈ N ( p , k ) ) ∩ ( p ∈ N ( g i , k ) ) } R\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right){\rm{ = }}\left\{ {{{\mathop{\rm g}\nolimits} _{\rm{i}}}{\rm{|}}\left( {{{\mathop{\rm g}\nolimits} _{\rm{i}}} \in N\left( {{\mathop{\rm p}\nolimits} {\rm{, k}}} \right)} \right) \cap \left( {{\mathop{\rm p}\nolimits} \in N\left( {{{\mathop{\rm g}\nolimits} _{\rm{i}}}{\rm{, k}}} \right)} \right)} \right\} R(p,k)={gi(giN(p,k))(pN(gi,k))}

p p p g i g_i gi互为近邻。显然, k k k互近邻比 k k k近邻更加接近于 p p p

### 使用 MATLAB 实现 K 近邻信息计算 为了在 MATLAB 中实现基于 K 近邻信息计算,可以借鉴 Kozachenko-Leonenko 估计量的思想。该方法通过评估数据点之间距离来估算概率密度函数,并进而推导出熵和信息。 #### 主要步骤概述: 1. **加载并准备数据** 加载待分析的数据集,确保其格式适合后续处理。 2. **定义辅助函数用于计算距离** 创建一个函数 `compute_distances` 来计算每一对观测值间的欧几里得距离矩阵[^5]。 3. **寻找第 k 个最近邻居的距离** 对每一个样本点,在其余所有样本中查找第 k 小的距离作为该点对应的 knn_distance。 4. **构建局部体积估计器** 根据上述得到的距离 r_knn 构建球体 V(r),其中包含刚好有 k 个其他样本落在内部或边界上。 5. **应用伽玛函数调整** 利用 Gamma 函数修正由于有限样本造成的偏差影响。 6. **求解边缘分布与联合分布下的期望值** 分别针对单变量 X 和 Y 及双变量 (X,Y) 计算各自的平均 log(Volume)。 7. **得出最终信息 I(X;Y)** 以下是具体的 MATLAB 代码示例: ```matlab function MI = compute_MI_KNN(data_X, data_Y, k) % 输入参数说明: % data_X - 特征向量集合 A 的 n×m 维数组形式表示; % data_Y - 特征向量集合 B 的 n×l 维数组形式表示; % k - 定义使用的近邻数量,默认设为3. %% Step 1: Prepare Data combined_data = [data_X, data_Y]; %% Step 2 & 3: Compute Distances and Find Kth Nearest Neighbor Distance D = pdist(combined_data,'euclidean'); D_squareform = squareform(D); [~, idx] = sort(D_squareform, 'ascend'); knn_dist = diag(D_squareform(idx(:,k+1)),0); %% Step 4 to 7: Estimate Entropy Terms Using K-Nearest Neighbor Approach psi_N = gammaln(size(combined_data,1)); termXY = mean(log(knn_dist)) + psi_N; separate_dists_X = pdist(data_X,'euclidean'); separate_dists_Y = pdist(data_Y,'euclidean'); seprate_D_sqfrm_X = squareform(separate_dists_X); seprate_D_sqfrm_Y = squareform(separate_dists_Y); [~,idx_x] = sort(seprate_D_sqfrm_X,'ascend'); [~,idx_y] = sort(seprate_D_sqfrm_Y,'ascend'); knn_dist_x = diag(seprate_D_sqfrm_X(idx_x(:,k+1)),0); knn_dist_y = diag(seprate_D_sqfrm_Y(idx_y(:,k+1)),0); termX = mean(log(knn_dist_x)) + psi_N; termY = mean(log(knn_dist_y)) + psi_N; %% Calculate Mutual Information MI = -(termXY-termX-termY); end ``` 此段程序实现了两个随机变量间信息的无参估计过程。注意这里假设输入的是数值型特征列向量组成的矩阵,对于分类属性可能需要先转换成独热编码等形式再做进一步处理。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值