matlab下kmeans及pam算法对球型数据分类练习
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算法对球型数据分类练习的更多相关文章
- matlab下K-means Cluster 算法实现
一.概念介绍 K-means算法是硬聚类算法,是典型的局域原型的目标函数聚类方法的代表,它是数据点到原型的某种距离作为优化的目标函数,利用函数求极值的方法得到迭代运算的调整规则.K-means算法以欧 ...
- matlab下二重积分的蒙特卡洛算法
%%monte_carlo_ff.m %被积函数(二重) function ff=monte_carlo_ff(x,y) ff=x*y^2;%函数定义处 end %%monte_carlo.m %蒙特 ...
- [ZZ] 基于Matlab的标记分水岭分割算法
基于Matlab的标记分水岭分割算法 http://blog.sina.com.cn/s/blog_725866260100rz7x.html 1 综述 Separating touching obj ...
- Matlab函数kmeans
Matlab函数kmeans K-means聚类算法采用的是将N*P的矩阵X划分为K个类,使得类内对象之间的距离最大,而类之间的距离最小. 使用方法:Idx=Kmeans(X,K)[Idx,C]=Km ...
- 【转】 MATLAB下如何指定GPU资源
[转] MATLAB下如何指定GPU资源 原文链接
- MATLAB实例:Munkres指派算法
MATLAB实例:Munkres指派算法 作者:凯鲁嘎吉 - 博客园 http://www.cnblogs.com/kailugaji/ 1. 指派问题陈述 指派问题涉及将机器分配给任务,将工人分配给 ...
- Matlab下的文件执行路径
Matlab下有时命令出错,源于Command窗口的路径不正确.快捷键的执行会受此影响.
- Matlab下imwrite,Uint16的深度图像
Matlab下imwrite,Uint16的深度图像 1. 在Matlab命令窗口输入命令: help imwrite 会有如下解释: If the input array is of class u ...
- 痞子衡嵌入式:MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项(i.MXRT500为例)
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是MCUXpresso IDE下使用J-Link下载算法在Flash调试注意事项. 痞子衡前段时间写过一篇小文<为i.MXRT设计更 ...
随机推荐
- Spring Boot CRUD+分页(基于JPA规范)
步骤一:JPA概念 JPA(Java Persistence API)是Sun官方提出的Java持久化规范,用来方便大家操作数据库. 真正干活的可能是Hibernate,TopLink等等实现了JPA ...
- 微服务(一)eureka
Eureka概述 一个简单的服务注册,服务发现架构 在CAP理论中,eureka选择了ap,作为注册中心,数据可用比数据不一致更重要 逻辑架构图 Eureka特性 1.当注册中心挂了,客户端之间依然可 ...
- Java单链表反转 详细过程
版权声明:本文为博主原创文章,未经博主允许不得转载. https://blog.csdn.net/guyuealian/article/details/51119499 Java单链表反转 Java实 ...
- php+mysql中文无法检索出数据
将数据库字符集设置为latin,并将字符转码成gb2312 将字符长度打印出来发现:因为latin中一个字符占用2个字节,utf-8中一个字符占用3个字节,这样一来检索的时候就会出现错误 实验过程: ...
- 简单搭建FastDFS分布式文件系统(简单易懂)
一.什么是FastDFS FastDFS一个开源的轻量级分布式文件系统,它对文件进行管理,充分考虑了冗余备份.负载均衡.线性扩容等机制,并注重高可用.高性能等指标,功能包括:文件存储.文件同步.文件访 ...
- IDEA 中使用 Vue 提示 namespace is not bound
今天在 IDEA 中使用 vue.js 时提示我如下错误信息 解决方法: 把这个校验项目去掉就可以了.
- 算法总结1:K-邻近算法
1. 算法原理: K-邻近算法的原理很简单,就是用你的“邻居”来推断出你的类别.用于离散型数据分析处理. 例子1:如下图有ABCD四个用于参考的样本点,都已知晓自己的坐标位置,这时E来了,不清楚自己的 ...
- 局部标签(gcc对c的扩展)
每个语句内嵌表达式都是一个可以声明局部跳转标签的域.一个局部标签只是一个标识符:你可以使用通常的goto语句跳到它--但是只能在它所属的域内这么做.一个局部标签的申明如下:__label__ labe ...
- Struts2异常处理配置
<package name="lee" extends="struts-default"> <!--定义全局结构映射 --> <g ...
- 使用群晖NAS:配置Git server
1.首先在群晖的DSM的控制面板中创建一个用户例如是Git_test(我给了管理员权限) 2.在套件中心安装 Git server 3.打开Git server 勾选用户 Git_test 4.在控制 ...