机器学习<聚类>—matlab代码#2

样本数据

% 西瓜数据样本
% 密度,含糖量
D=[0.697 0.460;
    0.774 0.376;
    0.634 0.264;
    0.608 0.318;
    0.556 0.215;
    0.403 0.237;
    0.481 0.149;
    0.437 0.211;
    0.666 0.091;
    0.243 0.267;
    0.245 0.057;
    0.343 0.099;
    0.639 0.161;
    0.657 0.198;
    0.360 0.370;
    0.593 0.042;
    0.719 0.103;
    0.359 0.188;
    0.339 0.241;
    0.282 0.257;
    0.748 0.232;
    0.714 0.346;
    0.483 0.312;
    0.478 0.437;
    0.525 0.369;
    0.751 0.489;
    0.532 0.472;
    0.473 0.376;
    0.725 0.445;
    0.446 0.459;];
y=[zeros(length(1:8),1);
   ones(length(9:21),1);
   zeros(length(22:30),1);];
% 样本图像
figure(1)
plot(D(y==1,1),D(y==1,2),'o','LineWidth',2);
hold on
plot(D(y==0,1),D(y==0,2),'x','LineWidth',2);
title('样本分布图像')
legend('正样本','负样本')

机器学习周志华

K-mean:

聚类性能指标-外部指标
chap9_4.mlx文件
机器学习周志华

%% 1.随机生成聚类簇类
k=3;% 假设聚类簇类=3
index_u=randperm(size(D,1),k);
u=D(index_u,:);% 均值向量
echo=1000;
flag_exit=zeros(k,1);
while(echo~=0)
    for i=1:k
        C{i}=[];
    end
    %% 2.计算样本与均值向量的距离,并划分簇类
    for j=1:size(D,1)
        x=D(j,:);
        distance_x=zeros(k,1);
        for numk=1:k
            distance_x(numk,:)=norm(x-u(numk,:),2);
        end
        [min_distance_x,index_minu]=min(distance_x);
        temp=[j;x'];
        C{index_minu}=[C{index_minu},temp];
    end
    %% 3.更新均值向量
    dot_u=[];
    for numC=1:k
        absC=size(C{numC},2);
        dot_u(numC,:)=sum(C{numC}(2:end,:)')/absC;
        if dot_u(numC,:)~=u(numC,:)
            u(numC,:)=dot_u(numC,:);
        elseif dot_u(numC,:)==u(numC,:)
            flag_exit(numC,:)=1;
        end
    end
    if flag_exit==ones(k,1)
        disp('簇类中点找到');
        break;
    end
    echo=echo-1;
end% 循环终结
%% 显示
C1=C{1}(2:end,:)';
C2=C{2}(2:end,:)';
C3=C{3}(2:end,:)';
figure(1)
hold on
plot(C1(:,1),C1(:,2),'ko','LineWidth',2,'MarkerSize',12);
plot(C2(:,1),C2(:,2),'gx','LineWidth',2,'MarkerSize',12);
plot(C3(:,1),C3(:,2),'b^','LineWidth',2,'MarkerSize',12)

机器学习周志华
机器学习周志华
机器学习周志华

性能指标:

% 学习分类
indexc1=C{1}(1,:)'; % 分类为0
indexc2=C{2}(1,:)'; % 分类为1
yc=-1.*ones(length(indexc2)+length(indexc1),1);
yc(indexc1,:)=zeros(length(indexc1),1);
yc(indexc2,:)=ones(length(indexc2),1);

indexy1=find(y==0);
indexy2=find(y==1);

a=length(find(y(indexc1)==0))+length(find(y(indexc2)==1))
b=length(find(y(indexc1)~=0))+length(find(y(indexc2)~=1))
c=length(find(yc(indexy2)==0))+length(find(yc(indexy1)==1))
d=length(find(yc(indexy2)~=0))+length(find(yc(indexy1)~=1))
%% 三个指标
Jc=a/(a+b+c)
FMI=sqrt(a^2/((a+b)*(a+c)))
RI=2*(a+d)/(size(D,1)*(size(D,1)-1))

学习向量量化(Learning Vector Quantization)

伪代码:
机器学习周志华

% 西瓜数据样本
% 密度,含糖量
D=[0.697 0.460;0.774 0.376;0.634 0.264;0.608 0.318;0.556 0.215;
0.403 0.237;0.481 0.149;0.437 0.211;0.666 0.091;0.243 0.267;0.245 0.057;
0.343 0.099;0.639 0.161;0.657 0.198;0.360 0.370;0.593 0.042;0.719 0.103;
0.359 0.188;0.339 0.241;0.282 0.257;0.748 0.232;0.714 0.346;0.483 0.312;
0.478 0.437;0.525 0.369;0.751 0.489;0.532 0.472;0.473 0.376;0.725 0.445;0.446 0.459;];
y=[2*ones(length(1:8),1);
   ones(length(9:21),1);
   2*ones(length(22:30),1);];% 注意分类的标签
[m,n]=size(D);
%% LVQd 目标是学习一组n维原型的向量{p1,...pq}
% 1.初始化原型向量p={p1,.....pq}
q=5;% 聚类簇的个数
yita=0.3;%学习率
index_p=randperm(m,q);
p=D(index_p,:);
mark=2;% 样本分类标签
C=randi([1,mark],1,q);% 划分类别(假标签)
echo=1000;
% 2.LVQ算法循环-学习原型向量p
while(echo~=0)
    y_index=randperm(m,1);  %真实标签序列
    y_flag=y(y_index,:);% 真实类别标签
    xrand=D(y_index,:);     %随机抽取样本
    distance_xp=-ones(q,1);
    for i=1:q
        distance_xp(i,:)=norm(xrand-p(i,:),2);
    end
    [min_p_distance,min_p_index]=min(distance_xp);
    p_flag=C(min_p_index);%假标签类别标签
    if p_flag==y_flag
        p(min_p_index,:)=p(min_p_index,:)+yita.*(xrand-p(min_p_index,:));
    else
        p(min_p_index,:)=p(min_p_index,:)-yita.*(xrand-p(min_p_index,:));
    end
    
    echo=echo-1;
end
% 3.划分数据-Voronoi剖分
indexR=[1:q];
disxp2=-ones(q-1,1);
flag=[];
for ii=1:q
    R{ii}=[];
end
for i=1:m
    x=D(i,:);
    for numR=1:q
        pi=p(numR,:);
        pi_=p(indexR~=numR,:);
        % 判断当前数据是否小于其他原型向量距离
        disxp1=norm(x-pi,2);
        for j=1:size(pi_,1)
            disxp2(j,:)=norm(x-pi_(j,:),2);
            if disxp1<disxp2(j,:)
                flag(j,:)=1;
            else
                flag(j,:)=0;
            end
        end
        if sum(flag)==(q-1)
            R{numR}=[R{numR};x];
        end
        flag=[];
    end
end
% 检查空簇类
for j=1:q
    if isempty(R(j))==1
        if j~=q
            R{j}=R{q};
            R{q}=[];
        elseif j==q
            break;
        end
    end
end
Color={'ro','gx','b+','k^','yv'};
%显示
hold on
plot(R{1}(:,1),R{1}(:,2),'ro','LineWidth',2,'Markersize',15)
plot(R{2}(:,1),R{2}(:,2),'gx','LineWidth',2,'Markersize',15)
plot(R{3}(:,1),R{3}(:,2),'b+','LineWidth',2,'Markersize',15)
plot(R{4}(:,1),R{4}(:,2),'k^','LineWidth',2,'Markersize',15)

在这里插入图片描述


高斯混合聚类:

伪代码
机器学习周志华

% 随机变量 z
k=3;% 簇类个数
echo=50;% 迭代次数
% 高斯混合分布参数初始化
% 初始均值,选取初始的簇类中心点
gauss(1).mu=D(6,:);
gauss(2).mu=D(22,:);
gauss(3).mu=D(27,:);
for i=1:k
    gauss(i).sigma=0.1.*eye(n,n);
    gauss(i).a=1/k;
end
while(echo~=0)
    % 1.计算后验概率
    for j=1:m
        pz_den=0;% 求和后验概率的项先清零
        x=D(j,:);
        for i=1:k
            % 先验概率
            px(j,i)=mypro(x,gauss(i));
            % 全概率
            pz_den=pz_den+gauss(i).a*px(j,i);
        end
        % 后验概率
        for i=1:k
            pz(j,i)=(gauss(i).a*px(j,i))/pz_den;
        end
    end
    sum_pz=sum(pz);
    % 2.更新高斯分布参数
    for i=1:k
        % 更新新的均值向量
        gauss(i).mu=pz(:,i)'*D./sum_pz(:,i);
        % 更新新的协方差矩阵
        gauss(i).sigma=(pz(:,i).*(D-gauss(i).mu))'*(D-gauss(i).mu)/(sum_pz(:,i));
        % 更新新的混合系数
        gauss(i).a=sum_pz(:,i)/m;
    end
    echo=echo-1;
end
[gamma_m,~]=size(pz);
for j=1:k
    C{j}=[];
end
for i=1:gamma_m
    [~,index_max]=max(pz(i,:));
    x=D(i,:);
    C{index_max}=[C{index_max};x];
end
marksize=12;
figure(1)
hold on
plot(D(y==1,1),D(y==1,2),'r+','LineWidth',2,'MarkerSize',marksize)
plot(D(y==2,1),D(y==2,2),'r_','LineWidth',2,'MarkerSize',marksize)
plot(C{1}(:,1),C{1}(:,2),'g^','LineWidth',2,'MarkerSize',marksize)
plot(C{2}(:,1),C{2}(:,2),'bo','LineWidth',2,'MarkerSize',marksize)
plot(C{3}(:,1),C{3}(:,2),'kx','LineWidth',2,'MarkerSize',marksize)
legend('正样本','负样本','C1类','C2类','C3类')
title('密度特征量高斯混合分类')
%% 先验函数
function p=mypro(x,gauss)
    [~,n]=size(gauss.mu);
    nem=((2*pi)^(n/2))*sqrt(det(gauss.sigma));
    den=exp(-0.5*((x-gauss.mu)*pinv(gauss.sigma)*(x-gauss.mu)'));
    p=den/nem;
end

在这里插入图片描述


DBSCAN算法:

待续
机器学习周志华

AGNES算法

待续
机器学习周志华

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值