clear all;
clc; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%数据初始化
Data=zeros(,);
%加噪声
for i=:
Data(,i)=;
Data(,i)=;
Data(,i)=;
end
for i=:
p=unifrnd(,);
a=unifrnd(,*pi);
b=unifrnd(,pi);
Data(,i)=p*sin(a)*cos(b);
Data(,i)=p*sin(a)*sin(b);
Data(,i)=p*cos(a);
end
for i=:
p=unifrnd(,);
a=unifrnd(,*pi);
b=unifrnd(,pi);
Data(,i)=p*sin(a)*cos(b);
Data(,i)=p*sin(a)*sin(b);
Data(,i)=p*cos(a);
end %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%样本数量
[d,N]=size(Data);
%聚类的数目
K=;
%方法选择
method='kmeans';
%method='kmedoids';
%选取初始点
%max_Initial=max(,N/(*K));
max_Initial=; label=zeros(max_Initial,N);
center=zeros(d,K,max_Initial);
C=zeros(,N); %主循环
for initial_Case=:max_Initial
pointK=Initial_center(Data,K);
iter=;
max_iter=1e+;
% xK = pointK;
disp(['------------KM进行第 ' num2str(initial_Case) ' 次重新选择初始中心-----------'])
%%每次初始化K个中心点后,进行的循环
while iter < max_iter
iter = iter+;
if mod(iter,)==
disp([' 内部循环进行第 ' num2str(iter) ' 次迭代'])
end
%%%根据数据矩阵P中每个点到中心点的距离(最小)确定所属分类
for i=:N
dert = repmat(Data(:,i),,K)-pointK;
distK=sqrt(diag(dert'*dert));
[~,j] = min(distK);
C(i) = j;
end
%%%重新计算K个中心点
xK_=zeros(d,K);
for i=:K
Pi=Data(:,find(C==i));
Nk = size(Pi,);
% K-Means K-Medoids唯一不同的地方:选择中心点的方式
switch lower(method)
case 'kmeans'
xK_(:,i) = sum(Pi,)/Nk;
case 'kmedoids'
Dx2 = zeros(,Nk);
for t=:Nk
dx=Pi-Pi(:,t)*ones(,Nk);
Dx2(t)=sum(sqrt(sum(dx.*dx,)),);
end
[~,min_ind] = min(Dx2);
xK_(:,i) = Pi(:,min_ind);
otherwise
errordlg('请输入正确的方法:kmeans-OR-kmedoids','MATLAB error');
end
end
%判断是否达到结束条件
if xK_==pointK % & iter>
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=:max_Initial
for k=:K
tem=find(label(initial_Case,:)==k);
dx=Data(:,tem)-center(:,k,initial_Case)*ones(,size(tem,));
dxk=sqrt(sum(dx.*dx,));
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,);
[distmin,best_ind]=min(dist_N_sum);
%最佳分组
best_Label=label(best_ind,:);
%最佳中心
best_Center=center(:,:,best_ind);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%三维散布图
figure();
scatter3(Data(,:),Data(,:),Data(,:),'filled','cdata',best_Label);
title('Data Distribution');
function center=Initial_center(X,K)
%选取初始中心
N=size(X,);
rnd_Idx = randperm(N);
center = X(:,rnd_Idx(:K));
end

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

  1. matlab下K-means Cluster 算法实现

    一.概念介绍 K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧 ...

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

    %%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特 ...

  3. [ZZ] 基于Matlab的标记分水岭分割算法

    基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...

  4. Matlab函数kmeans

    Matlab函数kmeans K-means聚类算法采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小. 使用方法:Idx=Kmeans(X,K)[Idx,C]=Km ...

  5. 【转】 MATLAB下如何指定GPU资源

    [转] MATLAB下如何指定GPU资源 原文链接

  6. MATLAB实例:Munkres指派算法

    MATLAB实例:Munkres指派算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 指派问题陈述 指派问题涉及将机器分配给任务,将工人分配给 ...

  7. Matlab下的文件执行路径

    Matlab下有时命令出错,源于Command窗口的路径不正确.快捷键的执行会受此影响.

  8. Matlab下imwrite,Uint16的深度图像

    Matlab下imwrite,Uint16的深度图像 1. 在Matlab命令窗口输入命令: help imwrite 会有如下解释: If the input array is of class u ...

  9. 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...

随机推荐

  1. python下载网页上公开数据集

    URL很简单,数据集分散开在一个URL页面上,单个用手下载很慢,这样可以用python辅助下载: 问题:很多国外的数据集,收到网络波动的影响很大,最好可以添加一个如果失败就继续请求的逻辑,这里还没有实 ...

  2. 爬虫之动态HTML处理(Selenium与PhantomJS )执行 JavaScript 语句

    执行 JavaScript 语句 1.隐藏百度图片 from selenium import webdriverimport time driver = webdriver.PhantomJS()dr ...

  3. HTML请求与相应

    HTTP的请求与响应 HTTP通信由两部分组成: 客户端请求消息 与 服务器响应消息 浏览器发送HTTP请求的过程: 当用户在浏览器的地址栏中输入一个URL并按回车键之后,浏览器会向HTTP服务器发送 ...

  4. PHP实体层基础类

    PHP实体层基础类 class BaseModel { private $tableName; private $fields=array(); function __construct() { $t ...

  5. C#忽略decimal多余的0

    decimal test=1.2000:test.ToString("0.####");

  6. flutter自定义View(CustomPainter) 之 canvas的方法总结

    画布canvas 画布是一个矩形区域,我们可以控制其每一像素来绘制我们想要的内容 canvas 拥有多种绘制点.线.路径.矩形.圆形.以及添加图像的方法,结合这些方法我们可以绘制出千变万化的画面. 虽 ...

  7. hadoop2.6.0集群配置

    1.修改机器名 集群的搭建最少需要三个节点,机器名分别修改为master,slave1,slave2.其中以master为主要操作系统. 修改hostname: sudo gedit /etc/hos ...

  8. 转载:Object的create方法文档

    源地址:https://developer.mozilla.org/zh-CN/docs/JavaScript/Reference/Global_Objects/Object/create#.E4.B ...

  9. 【转至nmap】nc命令

    什么是nc nc是netcat的简写,有着网络界的瑞士军刀美誉.因为它短小精悍.功能实用,被设计为一个简单.可靠的网络工具 nc的作用 (1)实现任意TCP/UDP端口的侦听,nc可以作为server ...

  10. VMware虚拟机创建安装之后不出现VMnet1和VMnet8虚拟网卡

    大家可能遇到过安装虚拟机之后,不出现这两张虚拟网卡,造成一系列的网络问题 VMware虚拟机无法将网络改为桥接状态 本人亲试可行的解决办法 首先把你之前安装的VMware虚拟机卸载,清理得一干二净: ...