图解机器学习第四部分第十二章——KL散度密度比估计法

在这里插入图片描述
在这里插入图片描述

n = 100;
x=randn(n,1);
y=randn(n,1);
y(n)=5 % 设置异常值
hhs=2*[1 5 10].^2;
m=5;
x2=x.^2;
xx=repmat(x2,1,n)+repmat(x2',n,1)-2*x*x';
y2=y.^2;
yx=repmat(y2,1,n)+repmat(x2',n,1)-2*y*x';
u=floor(m*[0:n-1]/n)+1;
u=u(randperm(n)); % 随机打乱一个数字序列

for hk=1:length(hhs)
    hh=hhs(hk);
    k=exp(-xx/hh);
    r=exp(-yx/hh);
    for i=1:m
        g(hk,i)=mean(k(u==i,:)*KLIEP(k(u~=i,:),r));
    end
end
[gh,ggh]=max(mean(g,2));
HH=hhs(ggh);
k=exp(-xx/HH);
r=exp(-yx/HH);
s=r*KLIEP(k,r);

figure(1);
clf;
hold on;
plot(y,s,'rx');

function a=KLIEP(k,r)
a0=rand(size(k,2),1);
b=mean(r)';
c=sum(b.^2);
for o=1:1000
    a=a0+0.01*k'*(1./k*a0);
    a=a+b*(1-sum(b.*a))/c;
    a=max(0,a);
    a=a/sum(b.*a);
    if norm(a-a0)<0.001,break,end
    a0=a;
end
end
首先,代码定义了一个数据点的数量 n,然后生成了两个服从标准正态分布的数据集 x 和 y,每个数据集包含 n 个数据点。接着,将 y 的最后一个数据点设置为异常值(值为 5)。

接下来,定义了一个带宽参数数组 hhs,包含了三个不同的带宽值。变量 m 表示划分数据点的数量,通过将 n 等分为 m 个区间来划分数据点的索引。然后,计算了 x 和 y 的平方和,以及它们之间的平方欧几里德距离。

接下来的代码是使用 KLIEP 算法计算 KL 散度密度比。在循环中,首先选择一个带宽值 hh,然后计算 x 和 y 的核函数 k 和 r,并进行迭代优化计算。通过迭代优化,计算出最佳的权重系数 a,使得 KL 散度最小化。这里的 KLIEP() 函数是用于计算 KLIEP 算法中的迭代优化过程。

在外层循环中,计算了每个带宽值对应的 KL 散度密度比,并找到具有最大 KL 散度密度比的带宽值 HH。最后,使用带宽值 HH 计算最终的 KL 散度密度比 s。

最后,代码绘制了异常值 y 和对应的 KL 散度密度比 s 的散点图。



详细解释计算 KLIEP 算法中的迭代优化过程的代码。这段代码实现了 KLIEP 算法中的迭代优化过程,用于计算最佳的权重系数 a。

让我们逐行解释这个代码段的功能:

a0=rand(size(k,2),1);: 初始化权重系数 a0 为一个与输入矩阵 k 列数相同大小的随机向量。

b=mean(r)';: 计算矩阵 r 每列的均值,并将结果转置为列向量。这里的 r 是核函数 r 的矩阵。

c=sum(b.^2);: 计算向量 b 的元素平方和。

for o=1:1000: 开始进行最大迭代次数为 1000 的迭代优化过程。

a=a0+0.01*k'*(1./k*a0);: 根据 KLIEP 算法的迭代更新规则,计算新的权重系数 a。其中,k 是核函数 k 的矩阵,k' 是 k 的转置。

a=a+b*(1-sum(b.*a))/c;: 根据 KLIEP 算法的迭代更新规则,计算新的权重系数 a。

a=max(0,a);: 将权重系数 a 中的负值设为零,以确保所有的权重都是非负的。

a=a/sum(b.*a);: 归一化权重系数 a,使得它们的和为 1if norm(a-a0)<0.001, break, end: 如果当前迭代的权重系数 a 与上一次迭代的 a0 之间的欧几里德距离小于 0.001,即达到收敛条件,跳出循环。

a0=a;: 将当前的权重系数 a 赋值给上一次迭代的 a0,为下一次迭代做准备。

end: 结束迭代循环。

end: 结束 KLIEP() 函数的定义。

总体而言,这段代码实现了 KLIEP 算法中的迭代优化过程,通过迭代更新权重系数 a,以最小化 KL 散度。在迭代过程中,根据算法规则更新 a 的值,直到满足收敛条件为止。

在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值