matlab下kmeans及pam算法对球型数据分类练习

clear all;
clc;

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%数据初始化
Data=zeros(3,20000);
%加噪声
for i=1:4000
    Data(1,i)=200;
    Data(2,i)=200;
    Data(3,i)=200;
end
for i=4001:12000
    p=unifrnd(0,50);
    a=unifrnd(0,2*pi);
    b=unifrnd(0,pi);
    Data(1,i)=p*sin(a)*cos(b);
    Data(2,i)=p*sin(a)*sin(b);
    Data(3,i)=p*cos(a);
end
for i=12001:20000
    p=unifrnd(50,100);
    a=unifrnd(0,2*pi);
    b=unifrnd(0,pi);
    Data(1,i)=p*sin(a)*cos(b);
    Data(2,i)=p*sin(a)*sin(b);
    Data(3,i)=p*cos(a);
end

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%样本数量
[d,N]=size(Data);
%聚类的数目
K=2;
%方法选择
method=‘kmeans‘;
%method=‘kmedoids‘;
%选取初始点
%max_Initial=max(20,N/(5*K));
max_Initial=20;

label=zeros(max_Initial,N);
center=zeros(d,K,max_Initial);
C=zeros(1,N);

%主循环
for initial_Case=1:max_Initial
    pointK=Initial_center(Data,K);
    iter=0;
    max_iter=1e+3;
    % xK = pointK;
    disp([‘------------KM进行第 ‘ num2str(initial_Case) ‘ 次重新选择初始中心-----------‘])
    %%每次初始化K个中心点后,进行的循环
    while iter < max_iter
        iter = iter+1;
        if mod(iter,50)==0
            disp([‘ 内部循环进行第 ‘ num2str(iter) ‘ 次迭代‘])
        end
        %%%根据数据矩阵P中每个点到中心点的距离(最小)确定所属分类
        for i=1:N
            dert = repmat(Data(:,i),1,K)-pointK;
            distK=sqrt(diag(dert‘*dert));
            [~,j] = min(distK);
            C(i) = j;
        end
        %%%重新计算K个中心点
        xK_=zeros(d,K);
        for i=1:K
            Pi=Data(:,find(C==i));
            Nk = size(Pi,2);
            % K-Means K-Medoids唯一不同的地方:选择中心点的方式
            switch lower(method)
                case ‘kmeans‘
                    xK_(:,i) = sum(Pi,2)/Nk;
                case ‘kmedoids‘
                    Dx2 = zeros(1,Nk);
                    for t=1:Nk
                        dx=Pi-Pi(:,t)*ones(1,Nk);
                        Dx2(t)=sum(sqrt(sum(dx.*dx,1)),2);
                    end
                    [~,min_ind] = min(Dx2);
                    xK_(:,i) = Pi(:,min_ind);
                otherwise
                    errordlg(‘请输入正确的方法:kmeans-OR-kmedoids‘,‘MATLAB error‘);
            end
        end
        %判断是否达到结束条件
        if xK_==pointK % & iter>50
            disp([‘###迭代 ‘ num2str(iter) ‘ 次得到收敛的解‘])
            label(initial_Case,:) = C;
            center(:,:,initial_Case) = xK_;
            % plot_Graph(C);
            break;
        end
        pointK=xK_;
        %xK = xK_;
    end
    if iter == max_iter
        disp(‘###达到内部最大迭代次数1000,未得到收敛的解‘);
        label(initial_Case,:) = C;
        center(:,:,initial_Case) = xK_;
        %plot_Graph(C);
        %break
    end
end

%%%%增加对聚类结果最优性的比较
%距离差
dist_N = zeros(max_Initial,K);
for initial_Case=1:max_Initial
    for k=1:K
        tem=find(label(initial_Case,:)==k);
        dx=Data(:,tem)-center(:,k,initial_Case)*ones(1,size(tem,2));
        dxk=sqrt(sum(dx.*dx,1));
        dist_N(initial_Case,k)=sum(dxk);
        %dist_N(initial_Case,k)=dxk;
    end
end

%%%%对于max_Initial次初始化中心点得到的分类错误
%%%%取错误最小的情况的Label作为最终分类
%求K类总的误差
dist_N_sum=sum(dist_N,2);
[distmin,best_ind]=min(dist_N_sum);
%最佳分组
best_Label=label(best_ind,:);
%最佳中心
best_Center=center(:,:,best_ind);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%三维散布图
figure();
scatter3(Data(1,:),Data(2,:),Data(3,:),‘filled‘,‘cdata‘,best_Label);
title(‘Data Distribution‘);
时间: 2024-10-07 05:34:39

matlab下kmeans及pam算法对球型数据分类练习的相关文章

matlab下二重积分的蒙特卡洛算法

%%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特卡洛计算二重积分function result=monte_carlo(a,b,c,d,n,m)%先y后x积分,a是x积分下限,b是x积分上限,c是y积分下限,d是y积分上限,n,m是蒙特卡洛参数 sumxff=0; for i=1:n sumyff=0; xff=a+(b-a)*rand(); f

K-means矢量量化算法介绍

K-means算法是最为经典的基于划分的聚类方法,是十大经典数据挖掘算法之一. K-means算法的基本思想是:以空间中k个点为中心进行聚类,对最靠近他们的对象归类.通过迭代的方法,逐次更新各聚类中心的值,直至得到最好的聚类结果.matlab中有kmeans聚类算法的函数可以调用,如[ldx,C,sumD,D]=kmeans(X,k)(详见matlab help kmeans).以下链接是一个用java写的聚类演示K-means demo. 对于该算法存在的缺点可以使用ISODATA(迭代自组织

Kmeans、Kmeans++和KNN算法比較

K-Means介绍 K-means算法是聚类分析中使用最广泛的算法之中的一个.它把n个对象依据他们的属性分为k个聚类以便使得所获得的聚类满足:同一聚类中的对象相似度较高:而不同聚类中的对象相似度较小.其聚类过程能够用下图表示: 如图所看到的.数据样本用圆点表示,每一个簇的中心点用叉叉表示.(a)刚開始时是原始数据.杂乱无章,没有label,看起来都一样.都是绿色的. (b)如果数据集能够分为两类.令K=2.随机在坐标上选两个点,作为两个类的中心点.(c-f)演示了聚类的两种迭代.先划分,把每一个

解密SVM系列(五):matlab下libsvm的简单使用

本节简单介绍一下libsvm的使用方法.关于libsvm似乎曾经使用过,那个时候主要用libsvm进行简单的人脸识别实验.当时还翻译过关于libsvm里面的matlab英文文档 那么现在最新版本的libsvm为3.2.0,下载地址如下: http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载下来的libsvm其实包含好多个平台的工具箱软件,c++,matlab,java,python都有.他们的函数使用方法是一样的. 那么在下载完以后,点击里面的matlab下平

HMM条件下的 前向算法 和 维特比解码

一.隐马尔科夫HMM假设: 有且只有3种天气:0晴天,1阴天,2雨天 各种天气间的隔天转化概率mp: mp[3][3] 晴天 阴天 雨天 晴天 0.33333 0.33333 0.33333 阴天 0.33333 0.33333 0.33333 雨天 0.33333 0.33333 0.33333 有2种活动:            0去公园,1不去公园 各种天气下进行各种活动的概率: w2a[3][2] 去公园 不去公园 晴天 0.75 0.25 阴天 0.4 0.6 雨天 0.25 0.75

解密SVM系列(五):matlab下libsvm的简单使用:分类与回归

本节简介一下libsvm的用法. 关于libsvm似乎以前使用过.那个时候主要用libsvm进行简单的人脸识别实验.当时还翻译过关于libsvm里面的matlab英文文档 介绍与分类实验 那么如今最新版本号的libsvm为3.2.0,下载地址例如以下: http://www.csie.ntu.edu.tw/~cjlin/libsvm/ 下载下来的libsvm事实上包括好多个平台的工具箱软件,c++.matlab,java,python都有. 他们的函数用法是一样的. 那么在下载完以后,点击里面的

Matlab下imwrite,Uint16的深度图像

Matlab下imwrite,Uint16的深度图像 1. 在Matlab命令窗口输入命令: help imwrite 会有如下解释: If the input array is of class uint16 and the format supports 16-bit data (JPEG, PNG, and TIFF), imwrite outputs the data as 16-bit values. If the format does not support 16-bit valu

iOS流布局UICollectionView系列七——三维中的球型布局

摘要: 类似标签云的球状布局,也类似与魔方的3D布局 iOS流布局UICollectionView系列七--三维中的球型布局 一.引言 通过6篇的博客,从平面上最简单的规则摆放的布局,到不规则的瀑布流布局,再到平面中的圆环布局,我们突破了线性布局的局限,在后面,我们将布局扩展到了空间,在Z轴上进行了平移,我们实现了一个类似UIPickerView的布局模型,其实我们还可以再进一步,类比于平面布局,picKerView只是线性排列布局在空间上的旋转与平移,这次,我们更加充分了利用一下空间的尺寸,来

[算法]一整型数组,除了0之外,其他不重复,判断数组元素是否相邻

数组元素是非负整数,0可以化为任意正整数,要求时间复杂度为O(n) 觉得很奇怪的题目,遍历一次找到最值相减得到极差就行了,如果极差小于数组长度n,则元素相邻,否则不相邻 bool is_adjacent(int* a, int n){ int min = 65535, max = 0; for(int i = 0; i < n; ++i){ if(!a[i] && a[i] < min){ min = a[i]; } else if(!a[i] && a[i]