学习记录 - 3

聚类是把相似的对象通过静态分类的方法分成不同的组别或者更多的子集(subset),这样让在同一个子集中的成员对象都有相似的一些属性,常见的包括在坐标系中更加短的空间距离等。- 维基百科

聚类分析是数据挖掘中一种重要的分析方法。对大量数据进行聚类分析,从未知中找到有意义的分类,挖掘每一类的特点和内在联系,加强对于事物本质关系的理解,这样有助于可以提高效率。比如应用于分析用户、顾客需求等等。
著名的“啤酒与尿布”的案例,属于购物篮分析,也是一个典型的商品聚类的问题。(据说此案例是编出来的,不过用来说明聚类的效益还是很好的)

smartbi的节点库也有聚类分析节点,包括k-means、层次聚类方法、模糊C均值、异常、类分配器、相似搜索。
聚类分析节点

k-means就是一种聚类算法,它可以把杂乱无章的、无标记的数据中自行分为k类。它的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类。通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果。
假设要把样本集分为k个类别,算法描述如下:

  1. 适当选择k个类的初始中心;
  2. 在第n次迭代中,对任意一个样本,求其到k个中心的距离,将该样本归到距离最短的中心所在的类;
  3. 利用均值等方法更新该类的中心值;
  4. 对于所有的k个聚类中心,如果利用(2)(3)的迭代法更新后,值保持不变,则迭代结束,否则继续迭代。

以前接触过k-means算法,对H&E image应用k-means聚类,左图为原图像,右图为聚类后的图像。
k=5
在图像压缩中应用,这样对k-means算法形成一个直观印象。

层次聚类算法,通过对数据集按照某种方法进行层次分解,直到满足某种条件为止。按照分类原理的不同,可以分为凝聚和分裂两种方法。

凝聚的层次聚类是一种自底向上的策略,首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终结条件被满足,绝大多数层次聚类方法属于这一类,它们只是在簇间相似度的定义上有所不同。
分裂的层次聚类与凝聚的层次聚类相反,采用自顶向下的策略,它首先将所有对象置于同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。

例如,凝聚的层次聚类

对abcdef进行层次聚类

假如上图层次聚类时在第二层就满足了终止条件,则会得到下面的结果。

聚类结果

其他的下次再看:)

附 对H&E image应用k-means聚类的matlab代码
以前简单粗暴的实现,尚未优化

%读取图片
I0=imread('kmeans_image.png');
I=im2double(I0);
I2=zeros(size(I));
%imshow(I);
%参数
k=5;%中心的个数
N=size(I);%图片大小
eps=1e-4;
cls=zeros(N(1),N(2));%类别
a=zeros(k,1);
center_rgb=zeros(k,3);
new_center=zeros(k,3);
temp=zeros(N(1),N(2),k);%存储每个点到k个中心的距离
sum=zeros(k,3);
%随机选择k个中心,存储其color值
center=[randi(N(1),k,1) randi(N(2),k,1)];%center(i,:)表示第i个中心
for j=1:k
center_rgb(j,:)=I(center(j,1),center(j,2),:);
end
for times=1:20
%求每个像素的值到k个中心值的欧氏距离
for i=1:N(1)
    for j=1:N(2)
        for m=1:k
          a=[I(i,j,1) I(i,j,2) I(i,j,3)];
          temp(i,j,m)=norm(a-center_rgb(m,:));
        end
    end
end
%找到每个像素最小的距离并记录其类别
for i=1:N(1)
    for j=1:N(2)
        for m=1:k
          a(m)=temp(i,j,m);
        end
        [minv cls(i,j)]=min(a);
    end
end
%计算每一类别的中心
sum=sum*0;
for i=1:N(1)
    for j=1:N(2)
        sum(cls(i,j),:)=sum(cls(i,j),:)+[I(i,j,1) I(i,j,2) I(i,j,3)];
    end
end
for m=1:k
new_center(m,:)=sum(m,:)/length(find(cls==m));
end
index=norm(new_center-center_rgb);
if index<eps
    break;
else
    center_rgb=new_center;
end
%I(1:3,4:6,:)
end
%对图片进行聚类
for i=1:N(1)
    for j=1:N(2)
        m=cls(i,j);
        I2(i,j,1)=new_center(m,1); 
        I2(i,j,2)=new_center(m,2);
        I2(i,j,3)=new_center(m,3);
    end
end
imshow(I2);
%imwrite(I2,'after_kmeans.png','png');

%%灰度
%读取图片
I0=imread('kmeans_image.png');
I=rgb2gray(I0);
I=im2double(I);
I2=zeros(size(I));
J=zeros(10,1);
%imshow(I);
%参数
% for k=1:10
k=8;%中心的个数
N=size(I);%图片大小
eps=1e-6;
cls=zeros(N(1),N(2));%类别
a=zeros(k,1);
center_rgb=zeros(k,1);
new_center=zeros(k,1);
%适当选择k个中心,存储其灰度值
center=[randi(N(1),k,1) randi(N(2),k,1)];%center(i,:)表示第i个中心
for j=1:k
center_rgb(j)=I(center(j,1),center(j,2));
end
for times=1:50
%找到每个像素最小的灰度距离记录其类别
for i=1:N(1)
    for j=1:N(2)
         a=abs(I(i,j)-center_rgb);
        [minv cls(i,j)]=min(a);
    end
end
%计算每一类别的中心
a=a*0;
for i=1:N(1)
    for j=1:N(2)
        a(cls(i,j))=a(cls(i,j))+I(i,j);
    end
end
for m=1:k
    new_center(m)=a(m)/length(find(cls==m));
end
index=norm(new_center-center_rgb);
if index<eps
    break;
else
    center_rgb=new_center;
end
end
%对图片进行聚类
for i=1:N(1)
    for j=1:N(2)
        m=cls(i,j);
        I2(i,j)=new_center(m); 
    end
end
imshow(I2);
% for m=1:k
% for i=1:N(1)
%     for j=1:N(2)
%         J(k)=J(k)+(I(i,j)-new_center(cls(i,j)))^2;
%     end
% end
% end
% k
% end
% p=polyfit(x,J',3);
% xi=linspace(1,10);
% yi=polyval(p,xi);
% plot(x,J','o',xi,yi);
% imwrite(I2,'after_kmeans_gray.png','png');
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值