n=100;
x=[(rand(n/2,2)-0.5)*20;randn(n/2,2)];
x(n,1)=14;
k=3;
x2=sum(x.^2,2);
[s,t]=sort(sqrt(repmat(x2,1,n)+repmat(x2',n,1)-2*x*x'),2);
for i=1:k+1
for j=1:k
RD(:,j)=max(s(t(t(:,i),j+1),k),s(t(:,i),j+1));
end
LRD(:,i)=1./mean(RD,2);
end
LOF=mean(LRD(:,2:k+1),2)./LRD(:,1);
figure(1);
clf;
hold on
plot(x(:,1),x(:,2),'rx');
for i=1:n
plot(x(i,1),x(i,2),'bo','MarkerSize',LOF(i)*10);
end
首先,代码中给定了数据的数量 n,并生成了一个二维数据集 x。数据集 x 包含了随机生成的两组数据,一组通过在 [-10, 10] 范围内生成随机数,并缩放到 [-0.5, 0.5] 范围内,另一组使用标准正态分布生成的随机数。最后,将第 n 个样本的第一个特征设置为 14,引入一个局部异常值。
接下来,代码中定义了一个参数 k,表示距离样本 x 第 k 近的样本。在这里,k 被设置为 3。
代码的下一部分是计算每个样本点的可达距离(Reachability Distance)。它通过计算样本点之间的欧几里德距离来实现。首先,计算每个样本点的平方和 x2,然后使用 repmat 函数将 x2 扩展为 n×n 的矩阵,并通过简单的矩阵操作计算样本点之间的欧几里德距离存储在矩阵 s 中。排序操作 t=sort(...) 用于获取每个样本点与其他样本点之间的距离从小到大的排列顺序。
接下来的循环用于计算局部可达密度(Local Reachability Density,LRD)。对于每个样本点,计算距离它第 k 近的样本点,并记录这些样本点的距离作为 RD(Reachability Distance)。然后,通过计算 RD 的均值的倒数得到局部可达密度 LRD。
最后,计算局部异常因子 LOF。LOF 是通过将每个样本点的局部可达密度与其 k 个最近邻的平均局部可达密度进行比较得到的。LOF 值越大,表示样本点越异常。
代码的最后部分用于可视化结果。它绘制了原始数据点(红色 x)和根据 LOF 值对每个数据点进行标记(蓝色圆圈大小表示 LOF 值的大小)。
注意:
i:代表外层循环中的迭代次数,用于迭代计算每个样本点的局部可达密度(LRD)和局部异常因子(LOF)。它的取值范围是从 1 到 k+1。
j:代表内层循环中的迭代次数,用于迭代计算每个样本点的可达距离(RD)。它的取值范围是从 1 到 k。
在代码的内层循环中,变量 j 控制着计算每个样本点的可达距离 RD 的迭代次数。在外层循环中,变量 i 控制着计算局部可达密度 LRD 和局部异常因子 LOF 的迭代次数。
在该代码中,表达式 s(t(t(:,i),j+1),k) 用于获取距离样本点 x 第 k 近的样本的距离值。让我们逐步解释这个表达式:
t(:, i):表示 t 矩阵的第 i 列,即表示第 i 个样本点与其他样本点之间的距离从小到大的排列顺序。
t(t(:, i), j+1):这里使用 t(:, i) 表示的排列顺序,再通过索引 j+1 获取距离样本点 x 第 j+1 近的样本在排列顺序中的索引。
s(t(t(:, i), j+1), k):通过将上一步得到的索引应用于矩阵 s,我们可以获取距离样本点 x 第 k 近的样本的距离值。这里 s(t(t(:, i), j+1), k) 表示矩阵 s 中第 t(t(:, i), j+1) 行、第 k 列的元素。
综合来说,该表达式用于获取距离样本点 x 第 k 近的样本的距离值,其中 t 矩阵用于存储样本点之间的距离从小到大的排列顺序,s 矩阵存储了样本点之间的欧几里德距离。
在该代码中,s(t(:, i), j+1) 表达式用于获取样本点 x 的第 i 个最近邻样本(基于距离排序)的第 j+1 近的距离值。让我们逐步解释这个表达式:
t(:, i):表示矩阵 t 的第 i 列,即表示样本点 x 与其他样本点之间的距离从小到大的排列顺序。
s(t(:, i), j+1):使用 t(:, i) 表示的排列顺序,并通过索引 j+1 获取第 j+1 近的样本的距离值。
具体而言,s(t(:, i), j+1) 表示矩阵 s 中第 t(:, i) 行的第 j+1 个元素,即样本点 x 的第 i 个最近邻样本的第 j+1 近的距离值。