资源简介
之前总结了一篇k-中心点算法的文章后,现给出Matlab代码实现,代码含有详细的注释便于读者理解。
代码片段和文件信息
clc;
clear;
%读取数据文件生成点矩阵
fileID = fopen(‘E:\MySoftware\matlabWorks\textK_Mediods\sample.txt‘);
C=textscan(fileID‘%f %f‘); %textscan函数读取数据
fclose(fileID); %关闭一个打开的fileID的文件
%显示数组结果
%celldisp(C);
%将cell类型转换为矩阵类型这里只假设原数据为二维属性,且是二维的坐标点
CC_init=cat(2C{1}C{2});%用来保存初始加载的值
CC=CC_init; %cat函数用于连接两个矩阵或数组
%获得对象的数量
num=length(C{1});
%显示初始分布图
grid on;%显示表格
scatter(C{1}C{2}‘filled‘); %filled为实心圆,该函数可以把C中所有坐标的点都画出来。
%%设置任意k个簇
k=4;
%临时存放k个中心点的数组
C_temp=zeros(k2);
%判断所设置的k值是否小于对象的数量
if k %产生随机的k个整数
randC=randperm(num);
randC=randC(1:k);
%从原数组中提出这三个点
for i=1:k
C_temp(i:)=CC(randC(1i):);
end
%将原数组中的这三个点清空
for j=1:k
CC(randC(1j):)=zeros(12);
end
idZero=find(CC(:1)==0);
%删除为零的行
[i1j1]=find(CC==0);
row=unique(i1);
CC(row:)=[];
%分配k个二维数组,用来存放聚类点
%分配行为k的存储单元
cluster=cell(k11);
%将剔除的三个点加入到对应的三个存储单元每个单元的第一行置为0,为了存储相对应的簇中心
for m=1:k
cluster{m}=C_temp(m:);
end
%计算其他点到这k个点的距离,然后分配这些点,第一次遍历
for i=1:num-k
%分别计算到三个点的距离
minValue=1000000;%最小值,要根据实际情况设定该值
minNum=-1;%最小值序号
for j=1:k
if minValue>sqrt((CC(i1)-C_temp(j1))*(CC(i1)-C_temp(j1))+(CC(i2)-C_temp(j2))*(CC(i2)-C_temp(j2)))
minValue=sqrt((CC(i1)-C_temp(j1))*(CC(i1)-C_temp(j1))+(CC(i2)-C_temp(j2))*(CC(i2)-C_temp(j2)));
minNum=j;
end
end
cluster{minNum}=cat(1cluster{minNum}CC(i:));
end
%随机选择p点
flag=1;
count=0;
while flag==1
randC=randperm(num-k);
randC=randC(1:1);
o_random=CC(randC:);
%找出该随机点所在的簇
recordN=0;
for i=1:k
for j=1:size(cluster{i}1)
cc=cluster{i}(j:);
cc=cc-o_random;
if cc==0
recordN=i;
break;
end
end
end
%将选择的随机点从点集中删除
CC(randC:)=[];
%计算替换代价
o=cluster{recordN}(1:);
o_rand_sum=0;
o_sum=0;
for i=1:length(CC)
o_rand_sum=o_rand_sum+sqrt((CC(i1)-o_random(11))*(CC(i1)-o_random(11))+(CC(i2)-o_random(12))*(CC(i2)-o_random(12)));
o_sum=o_sum+sqrt((CC(i1)-o(11))*(CC(i1)-o(11))+(CC(i2)-o(12))*(CC(i2)-o(12)));
end
%如果随机选择的点的代价小于原始代表点的代价,则替换该代表点,然后重新聚类
if o_rand_sum cluster{recordN}(1:)=o_random;
%将代表点放入对象集
CC=cat(1CCo);
%对所有对象重新进行聚类
%将cluster除第一行之外的数据全部清空
for i=1:k
c=cluster{i}(1:);
cluster{i}=[];
cluster{i}=c;
end
%重新聚类
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 4422 2018-06-14 22:00 textK_Mediods\k_medoids.m
文件 8976 2018-06-07 19:19 textK_Mediods\sample.txt
- 上一篇:分形维数MATLAB程序
- 下一篇:canny边缘检测算法的matlab实现
相关资源
- KCF加尺度matlab代码
- 基于DWT和SVD结合的水印嵌入MATLAB代码
- 层次聚类matlab代码
- 人工蜂群算法 matlab代码
- 三种传统去噪方法MATLAB代码
- 局部保持投影原文及matlab代码
- 无约束最优化的matlab代码
- 均值滤波MATLAB代码实现
- 自适应滤波matlab代码
- Gauss消去法:顺序高斯消去 matlab代码
- 常见纹理特征提取的MATLAB代码
- 经验模态分解Matlab代码
- sift配准 matlab代码
- adaboost算法Matlab代码及训练数据
- MIMO-OFDM不同信道估计的对比matlab代码
- SVM算法仿真matlab代码
- 遗传算法-matlab代码
- 用衍射追迹实现衍射受限透镜成像。
- DNA加法MATLAB代码
- 多层感知器解决异或问题MATLAB代码
- HOG特征matlab代码实现
- 信噪比matlab代码
- 二维码识别 matlab代码 内
- 不变矩Matlab代码
- 随机波束成型rbfmatlab代码
- 优化问题测试函数matlab代码
- BP神经网络预测模型MATLAB代码,亲测可
- 李纯明老师 水平集CV MATLAB代码
- 多尺度熵matlab代码
- RSSI定位算法MATLAB代码
评论
共有 条评论