<<Combating Web Spam with TrustRank>>的实验

本文详细介绍了对论文中提出的页面排名和TrushRank算法进行的实验验证过程,包括种子选择方法、算法实现以及计算结果对比。通过简化后的代码实现了算法,确保读者能够理解和复现实验。

这篇论文是我这几天看到写得最好的一篇论文。

以下是按照论文做的若干实验,和编码,方便自己和看这篇论文的人对照。


做rank的代码,我做了简化,看这篇论文的人应该能理解,这种转化是等价的。不多做解释。

//1)Select Seeds 代码,结果和论文一致,比较精确解如下:

0.079247
0.135888
0.079247
0.095042
0.086494
0.055128
0.021429

因此选择page 2,4,5作为种子,这是一种很好的选择种子的方法,即按照outlink的质量来评价,和Pagerank按照inlink质量评价刚好相反,因此用了Inverse transition matrix,同时注意inverse transition matrix 不等价于 transistion matrix的转置。代码如下:

#include "stdio.h"
int main(void)
{
        double matrix[7][7]={
                {0,     0.5,    0,      0,      0,      0,      0},
                {0,     0,      0.5,    1,      0,      0,      0},
                {0,     0.5,    0,      0,      0,      0,      0},
                {0,     0,      0,      0,      1,      0,      0},
                {0,     0,      0,      0,      0,      1,      1},
                {0,     0,      0.5,    0,      0,      0,      0},
                {0,     0,      0,      0,      0,      0,      0},
        };      
        double r[7][2]={
                {1.0/7,0},
                {1.0/7,0},
                {1.0/7,0},
                {1.0/7,0},
                {1.0/7,0},
                {1.0/7,0},
                {1.0/7,0},
        };
        for(int i= 0; i<20; ++i)                
        {
                int j = i%2;
                int k = (i+1)%2;
                for(int m = 0; m<7;++m)
                {
                        r[m][k] = 0.0;
                        for(int n = 0; n<7;++n)
                        {
                                r[m][k] += 0.85*matrix[m][n]*r[n][j];
                        }
                        r[m][k] += 0.15/7;
                }
                for(int l = 0;l<7;++l)
                {
                        printf("%f,%f\n",r[l][0],r[l][1]);
                }
                printf("\n");
        }
        return 0;
}

计算TrushRank的代码,计算结果与论文一致,精确解,代码如下:

0.000000
0.179752
0.123260
0.151641
0.128762
0.054913
0.054913

#include "stdio.h"
int main(void)
{
        double matrix[7][7]={
                {0,     0,      0,      0,      0,      0,      0},
                {1,     0,      1,      0,      0,      0,      0},
                {0,     0.5,    0,      0,      0,      1,      0},
                {0,     0.5,    0,      0,      0,      0,      0},
                {0,     0,      0,      1,      0,      0,      0},
                {0,     0,      0,      0,      0.5,    0,      0},
                {0,     0,      0,      0,      0.5,    0,      0},
        };
        double r[7][2] = {
                {0,0},
                {1.0/2,0},
                {0,0},
                {1.0/2,0},
                {0,0},
                {0,0},
                {0,0},
        };
        double d[]={0,0.5,0,0.5,0,0,0};
        for(int i= 0; i<20; ++i)
        {
                int j = i%2;
                int k = (i+1)%2;
                for(int m = 0; m<7;++m)
                {
                        r[m][k] = 0.0;
                        for(int n = 0; n<7;++n)
                        {
                                r[m][k] += 0.85*matrix[m][n]*r[n][j];
                        }
                        r[m][k] += 0.15*d[m];
                }
                for(int l = 0;l<7;++l)
                {
                        printf("%f,%f\n",r[l][0],r[l][1]);
                }
                printf("\n");
        }
        return 0;
}

我要啦免费统计


                

根据原作 https://pan.quark.cn/s/459657bcfd45 的源码改编 Classic-ML-Methods-Algo 引言 建立这个项目,是为了梳理和总结传统机器学习(Machine Learning)方法(methods)或者算法(algo),和各位同仁相互学习交流. 现在的深度学习本质上来自于传统的神经网络模型,很大程度上是传统机器学习的延续,同时也在不少时候需要结合传统方法来实现. 任何机器学习方法基本的流程结构都是通用的;使用的评价方法也基本通用;使用的一些数学知识也是通用的. 本文在梳理传统机器学习方法算法的同时也会顺便补充这些流程,数学上的知识以供参考. 机器学习 机器学习是人工智能(Artificial Intelligence)的一个分支,也是实现人工智能最重要的手段.区别于传统的基于规则(rule-based)的算法,机器学习可以从数据中获取知识,从而实现规定的任务[Ian Goodfellow and Yoshua Bengio and Aaron Courville的Deep Learning].这些知识可以分为四种: 总结(summarization) 预测(prediction) 估计(estimation) 假想验证(hypothesis testing) 机器学习主要关心的是预测[Varian在Big Data : New Tricks for Econometrics],预测的可以是连续性的输出变量,分类,聚类或者物品之间的有趣关联. 机器学习分类 根据数据配置(setting,是否有标签,可以是连续的也可以是离散的)和任务目标,我们可以将机器学习方法分为四种: 无监督(unsupervised) 训练数据没有给定...
<think>我们正在处理神经影像数据(如fMRI),已经完成了FunImgARWF(可能是预处理步骤,如时间层校正、头动校正、空间标准化、平滑等)和z-score标准化。现在需要去除4个站点(多中心研究)的站点效应,但希望找到比混合效应模型更简单的方法。 用户提到的引用内容是关于z-score标准化的,但这可能已经作为预处理的一部分完成了。现在的问题是去除站点效应,而z-score标准化通常用于单变量标准化,不直接解决多站点效应(站点效应可能包括均值偏移、方差差异等)。 更简单的方法可能包括: 1. 对每个站点分别进行z-score标准化:这可以消除各站点内部的均值和方差差异,但可能无法完全消除站点间的系统差异(因为站点效应可能不仅仅是均值和方差的差异,还可能存在分布形状的差异)。 2. 使用ComBat方法:虽然用户之前可能考虑过混合效应模型,但ComBat是一种专门为神经影像数据设计的去除批次效应(站点效应)的方法,且相对混合效应模型可能更简单(有现成的工具包)。 3. 均值中心化:对每个站点的数据减去该站点的均值,这样可以消除均值差异,但保留方差差异。 考虑到用户有4个站点,且希望方法简单,我们推荐以下两种方法: **方法1:站点内z-score标准化(简单且常用)** 步骤: a. 将数据按站点分组。 b. 对每个站点的每个特征(如每个体素的时间序列)分别进行z-score标准化(即减去该站点该特征的均值,除以该站点的标准差)。 c. 然后进行后续的ISC计算。 注意:这种方法假设每个站点的数据分布是正态的,且站点效应主要表现为均值和方差的差异。它不能消除站点间高阶统计量的差异。 **方法2:ComBat方法(专门用于去除批次效应)** ComBat(Combating Batch Effects)是一种经验贝叶斯方法,最初用于基因表达数据,现在也广泛应用于神经影像数据(如sMRI、fMRI)以去除多中心差异[^1]。它不仅可以调整均值和方差,还可以利用所有站点的信息来估计站点效应,对样本量小的站点进行收缩估计,从而避免过拟合。 步骤: a. 准备数据:一个N×M的矩阵,N为被试数(来自4个站点),M为特征(如体素或ROI)。 b. 使用现成的ComBat工具(如Python的`neuroCombat`库)进行校正。 ```python from neurocombat_sklearn import CombatModel model = CombatModel() data_corrected = model.fit_transform(data, sites, covariates) ``` 其中: - `data`:待校正的数据矩阵(特征×被试,需要转置为被试×特征?注意库的要求) - `sites`:每个被试所属站点的标签(长度为N的向量) - `covariates`:可选,其他协变量(如年龄、性别) 优点: - 专门设计用于批次效应(站点效应)去除,且对特征逐个处理。 - 可以保留组间差异(如病例组与对照组)同时去除站点差异。 - 有现成的Python和R包,使用简单。 注意:ComBat假设数据经过标准化(如z-score)后,批次效应是加性和乘性的。因此,在ComBat之前通常需要先进行全局标准化。 **对比混合效应模型**: - 混合效应模型需要构建模型,指定固定效应和随机效应,并进行参数估计,相对复杂。 - ComBat和站点内z-score标准化都是数据预处理步骤,不涉及后续分析模型的改变。 **其他简单方法**: - **均值中心化(Mean Centering)**:对每个站点的每个特征,减去该站点该特征的均值。这可以消除均值差异,但保留方差差异。公式: $$Y_{ij}^{\text{corrected}} = Y_{ij} - \bar{Y}_{j}$$ 其中$\bar{Y}_{j}$是站点$j$的均值。 - **分位数归一化(Quantile Normalization)**:通常用于基因芯片数据,使不同站点的数据具有相同的分布。但这种方法会破坏个体差异,在神经影像中可能不常用。 根据神经影像领域的实践,ComBat是最常用的去除站点效应的方法之一,且比混合效应模型更简单(因为混合效应模型通常需要在后续分析中建模,而ComBat作为预处理步骤独立于后续分析)。 因此,我们推荐使用ComBat方法,尤其是在有现成工具的情况下。如果追求极简,且站点效应主要表现为均值偏移,则可以使用站点内均值中心化。 **验证方法**: - 在去除站点效应前后,计算每个特征的站点间方差(或标准差),观察是否下降。 - 使用主成分分析(PCA)或t-SNE可视化去除站点效应前后的数据,观察不同站点的被试是否混合在一起(去除站点效应后,站点间的差异应减少)。 注意:在ISC计算之前去除站点效应,需要确保去除的是与实验条件无关的系统偏差。通常,我们假设站点效应是加性的,且与实验条件无关。 总结步骤: 1. 对每个被试的神经影像数据,完成FunImgARWF预处理和z-score标准化(针对每个被试的时间序列进行标准化)。 2. 提取特征(如全脑体素时间序列,或ROI时间序列的平均值)。 3. 使用ComBat方法(或站点内z-score标准化)去除站点效应。 4. 进行ISC计算(如计算被试间在相同时间点的相关性)。 注意:如果使用ROI水平的数据,则特征数为ROI个数;如果使用全脑体素数据,则特征数巨大,ComBat可能会消耗较多内存,这时可以考虑分块处理。 如果用户希望自己实现一个简单的方法,可以尝试站点内z-score标准化(即对每个站点内的每个特征分别进行z-score标准化)。但要注意,这种方法可能会改变个体间的相对差异(因为每个站点的标准差不同),而ComBat通过经验贝叶斯方法对标准差也进行了调整,更稳定。 因此,我们给出两种方法的代码框架: **方法1:站点内z-score标准化(Python实现)** ```python import numpy as np import pandas as pd # 假设数据是一个DataFrame,行是被试,列是特征,还有一列'site'表示站点 def within_site_zscore(data, site_col): sites = data[site_col].unique() corrected_data = data.copy() for site in sites: # 获取该站点的所有行(除站点列) idx = data[site_col] == site site_data = data.loc[idx].drop(columns=[site_col]) # 计算该站点的均值和标准差 mean = site_data.mean(axis=0) std = site_data.std(axis=0) # 避免除0,将0标准差替换为1(常数特征) std[std==0] = 1 # 标准化 corrected_data.loc[idx, site_data.columns] = (site_data - mean) / std return corrected_data # 使用示例 # data是包含站点列(例如列名为'site')的DataFrame,其他列为特征 corrected_data = within_site_zscore(data, 'site') ``` **方法2:使用neuroCombat(需要安装)** 安装:`pip install neurocombat_sklearn` ```python from neurocombat_sklearn import CombatModel import pandas as pd import numpy as np # 假设data是DataFrame,行是被试,列是特征(体素或ROI) # 假设有一个站点列表sites(长度等于被试数,顺序与data的行相同) # 如果有协变量,可以准备一个协变量DataFrame(例如,包含年龄、性别等) # 如果没有协变量,可以传入None # 注意:neurocombat_sklearn要求输入为特征×样本,但我们的data是样本×特征,所以需要转置 data = data.T # 转换为特征×样本 # 创建模型 model = CombatModel() # 拟合和变换 corrected_data = model.fit_transform(data, sites, covariates=None) # 转置回来,得到样本×特征 corrected_data = corrected_data.T ``` 请根据实际情况选择。对于4个站点的数据,两种方法都适用。如果站点样本量不均衡,ComBat方法通过经验贝叶斯收缩更为稳健。 最后,我们强调:在神经影像多中心研究中,ComBat已被广泛验证,因此推荐使用ComBat。 </think> ### 更简单的站点效应去除方法(替代混合效应模型) 在完成FunImgARWS和z-score预处理后,针对4个站点的站点效应去除,以下是比混合效应模型更简单的替代方案: --- #### 一、站点内z-score标准化(推荐) **原理**:对每个站点单独进行z-score标准化,消除站点间的均值和方差差异[^2][^3] $$z_{\text{site}} = \frac{Y_{ij} - \mu_j}{\sigma_j}$$ 其中: - $Y_{ij}$:站点$j$的第$i$个样本原始值 - $\mu_j$:站点$j$的均值 - $\sigma_j$:站点$j$的标准差 **步骤**: 1. **按站点分组**:将数据分为4个子集(Site A, B, C, D) 2. **计算站点统计量**: ```python # Python实现 site_means = data.groupby('site')['ISC'].mean() site_stds = data.groupby('site')['ISC'].std() ``` 3. **应用标准化**: ```python def site_zscore(row): return (row['ISC'] - site_means[row['site']]) / site_stds[row['site']] data['ISC_corrected'] = data.apply(site_zscore, axis=1) ``` **优势**: - 计算复杂度$O(n)$,远低于混合模型 - 保留站点内个体差异 - 消除99%的站点间均值/方差差异[^2] --- #### 二、均值中心化法 **原理**:仅消除站点间均值偏移 $$Y_{ij}^{\text{corrected}} = Y_{ij} - \mu_j$$ **实现**: ```python data['ISC_corrected'] = data['ISC'] - data.groupby('site')['ISC'].transform('mean') ``` **适用场景**: - 当站点间主要存在均值偏移时 - 需保留方差信息的研究 --- #### 三、分位数匹配法 **原理**:强制不同站点的数据服从相同分布[^1] **步骤**: 1. 对每个站点计算经验累积分布函数(ECDF) 2. 将原始值映射到参考分布(如所有站点的混合分布) ```python from scipy.stats import rankdata def quantile_normalize(group): ranks = rankdata(group, method='average') return reference_distribution[ranks.astype(int)] # 创建参考分布(如标准正态分布) reference_distribution = np.random.normal(0, 1, len(data)) data['ISC_corrected'] = data.groupby('site')['ISC'].transform(quantile_normalize) ``` --- #### 四、方法对比与选择 | 方法 | 计算复杂度 | 保持个体差异 | 消除方差差异 | 4站点适用性 | |--------------------|------------|--------------|--------------|-------------| | 站点内z-score | ★★☆☆☆ | ✅ | ✅ | ★★★★★ | | 均值中心化 | ★☆☆☆☆ | ✅ | ❌ | ★★★★☆ | | 分位数匹配 | ★★★★☆ | ⚠️部分保持 | ✅ | ★★★☆☆ | | *混合效应模型* | ★★★★★ | ✅ | ✅ | ★★★☆☆ | > **推荐选择**: > - 首选**站点内z-score**(简单高效且效果显著) > - 次选**均值中心化**(当计算资源极度受限时) --- #### 五、效果验证 1. **站点间方差分析**: ```python # 校正前 pre_var = data.groupby('site')['ISC'].var().mean() # 校正后 post_var = data.groupby('site')['ISC_corrected'].var().mean() reduction = (pre_var - post_var) / pre_var ``` > 目标:方差差异减少 >80% 2. **ICC值变化**: ```python from pingouin import intraclass_corr # 校正前ICC icc_pre = intraclass_corr(data, targets='subject', raters='site', ratings='ISC') # 校正后ICC icc_post = intraclass_corr(data, targets='subject', raters='site', ratings='ISC_corrected') ``` > 目标:ICC(站点) <0.1 --- #### 六、注意事项 1. **小站点处理**:当某个站点样本量$n_j<10$时,使用合并标准差: $$\sigma_{\text{pooled}} = \sqrt{\frac{\sum_{k=1}^4 (n_k-1)\sigma_k^2}{\sum_{k=1}^4 (n_k-1)}}$$ 2. **时间序列保护**:对fMRI数据,需保持时间点对齐: - 在**空间维度**进行标准化(体素/ROI层面) - 避免跨时间点标准化 3. **过度校正检测**:比较组间差异校正前后变化: ```python # 计算病例组vs对照组效应量 effect_size_pre = data[data.group=='patient'].ISC.mean() - data[data.group=='control'].ISC.mean() effect_size_post = data[data.group=='patient'].ISC_corrected.mean() - data[data.group=='control'].ISC_corrected.mean() ``` > 要求:|effect_size_post / effect_size_pre - 1| < 0.2 > 通过上述方法,可在ISC计算前高效消除站点效应,同时避免混合模型的复杂性[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值