[关闭]
@floatsd 2016-04-12T13:12:31.000000Z 字数 4353 阅读 1437

聚类算法实验报告

人工智能导论实验报告


1.K-means

1.1实验原理


1.2实验结果

1.3源代码

1.3.1 数据模拟

  1. clc;clear all;close all;
  2. %生成data1;
  3. num_data1=200;
  4. data1.feature(:,1)=2*randn(num_data1,1)+2;
  5. data1.feature(:,2)=2*randn(num_data1,1)+4;
  6. %生成data2;
  7. num_data2=250;
  8. data2.feature(:,1)=2*randn(num_data2,1)-2;
  9. data2.feature(:,2)=2*randn(num_data2,1)-4;
  10. plot(data1.feature(:,1),data1.feature(:,2),'bx');
  11. hold on;
  12. plot(data2.feature(:,1),data2.feature(:,2),'rx');
  13. %合并data,数据存储在data.feature矩阵一二列
  14. data.type=[ones([num_data1 1]);2*ones([num_data2 1])];
  15. data.feature=[data1.feature;data2.feature];

1.3.2 寻找图心

  1. function [ output ] = f_med( pos,label,cluster )
  2. % 使用均值计算中心要素
  3. % 输入点的位置矩阵(x,y),当前标签
  4. % 输出新中心点并更新标签
  5. n=length(pos);
  6. A=pos(1,:);
  7. for i=2:n
  8. %获取当前标签所有点
  9. if(label(i)==cluster)
  10. A=[A;pos(i,:)];
  11. end
  12. end
  13. %分别取聚类坐标均值
  14. v_medx=mean(A(:,1));
  15. v_medy=mean(A(:,2));
  16. output=[v_medx v_medy];
  17. end

1.3.3 K-means

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. n=length(data.feature); %得到数据个数
  3. %在数据中随机初始化种子num_seed个;
  4. %并获取对应数据feature
  5. num_seed=4;
  6. seed(:,1)=randi(n,num_seed,1);
  7. for i=1:num_seed
  8. seed(i,2:3)=data.feature(seed(i,1),:);
  9. end
  10. dis=zeros([1 num_seed]);
  11. nucleus=zeros([num_seed 2]);
  12. diff=zeros([1 num_seed]);
  13. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  14. %k_Means
  15. plot(0,0);
  16. hold on;
  17. for k=1:n
  18. for i=1:n
  19. for j=1:num_seed
  20. dis(j)=(data.feature(i,1)-seed(j,2))^2+...
  21. (data.feature(i,2)-seed(j,3))^2; %当前数据到各中心距离
  22. end
  23. [m0,n0]=find(dis==min(min(dis))); %得到最小距离是哪个并分配
  24. data.label(i,1)=n0;
  25. end
  26. %更新中心要素,函数f_med计算一个类群的坐标均值。
  27. for j=1:num_seed
  28. nucleus(j,:)=f_med(data.feature,data.label,j);
  29. diff(j)=sqrt((nucleus(j,1)-seed(j,2))^2)+sqrt((nucleus(j,2)-seed(j,3))^2);
  30. end
  31. %验证中心变化量;
  32. %当中心变化小于一定值得到局部最优解,跳出循环;
  33. if sqrt(sum(diff))>3
  34. for j=1:num_seed
  35. seed(j,1)=nucleus(j,1);
  36. plot(seed(j,2),seed(j,3),'g*');
  37. hold on;
  38. end
  39. else
  40. break;
  41. end
  42. end
  43. %绘制结果
  44. for i=1:n
  45. for j=1:num_seed
  46. if(data.label(i,1)==j)
  47. plot(data.feature(i,1),data.feature(i,2),...
  48. 'ks','MarkerFaceColor',...
  49. [abs(cos(j^6)) abs(0.7*cos(j^3)) abs(sin(j^2))]);
  50. end
  51. end
  52. end

2.Hierarchical Clustering

2.1 实验原理

方法 公式
欧氏距离
欧氏距离的平方
曼哈顿距离
最大距离

2.2 实验结果

2.3 实验代码

  1. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  2. %使用欧式距离计算
  3. dis=ones([n n]);min_v=0;
  4. for k=1:inf
  5. for i=1:n
  6. for j=1:n
  7. %计算类与类间相似度
  8. diffx=data.feature(i,1)-data.feature(j,1);
  9. diffy=data.feature(i,2)-data.feature(j,2);
  10. dis(i,j)=sqrt(diffx^2+diffy^2);
  11. if(dis(i,j)<=min_v)
  12. dis(i,j)=max(max(dis));
  13. end
  14. end
  15. end
  16. %函数f_min获得矩阵最小值的行列坐标和值
  17. %获取相似度矩阵的最大值(距离最短)
  18. [min_row,min_col,min_v]=f_min(dis);
  19. %得到相似度最大两类归并
  20. data.Label(min_row,1)=min_col;
  21. %阈值设定
  22. if(min_v>0.98*max(max(dis)))
  23. break;
  24. end
  25. end
  26. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
  27. %查看剩余标签值
  28. counter=zeros([n 1])
  29. for i=1:n
  30. counter(data.Label(i,1),1)=counter(data.Label(i,1),1)+1;
  31. end
  32. a=find(counter);

3.算法比较

本次实验测试了最基本的k-means算法和层次算法聚类,其中k-means图心选取直接取的坐标均值,层次算法相似度使用欧氏距离,可以调节k-means初始点个数和层次算法的阈值。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注