@floatsd
2016-04-12T13:12:31.000000Z
字数 4353
阅读 1574
人工智能导论实验报告



clc;clear all;close all;%生成data1;num_data1=200;data1.feature(:,1)=2*randn(num_data1,1)+2;data1.feature(:,2)=2*randn(num_data1,1)+4;%生成data2;num_data2=250;data2.feature(:,1)=2*randn(num_data2,1)-2;data2.feature(:,2)=2*randn(num_data2,1)-4;plot(data1.feature(:,1),data1.feature(:,2),'bx');hold on;plot(data2.feature(:,1),data2.feature(:,2),'rx');%合并data,数据存储在data.feature矩阵一二列data.type=[ones([num_data1 1]);2*ones([num_data2 1])];data.feature=[data1.feature;data2.feature];
function [ output ] = f_med( pos,label,cluster )% 使用均值计算中心要素% 输入点的位置矩阵(x,y),当前标签% 输出新中心点并更新标签n=length(pos);A=pos(1,:);for i=2:n%获取当前标签所有点if(label(i)==cluster)A=[A;pos(i,:)];endend%分别取聚类坐标均值v_medx=mean(A(:,1));v_medy=mean(A(:,2));output=[v_medx v_medy];end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%n=length(data.feature); %得到数据个数%在数据中随机初始化种子num_seed个;%并获取对应数据feature值num_seed=4;seed(:,1)=randi(n,num_seed,1);for i=1:num_seedseed(i,2:3)=data.feature(seed(i,1),:);enddis=zeros([1 num_seed]);nucleus=zeros([num_seed 2]);diff=zeros([1 num_seed]);%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%k_Meansplot(0,0);hold on;for k=1:nfor i=1:nfor j=1:num_seeddis(j)=(data.feature(i,1)-seed(j,2))^2+...(data.feature(i,2)-seed(j,3))^2; %当前数据到各中心距离end[m0,n0]=find(dis==min(min(dis))); %得到最小距离是哪个并分配data.label(i,1)=n0;end%更新中心要素,函数f_med计算一个类群的坐标均值。for j=1:num_seednucleus(j,:)=f_med(data.feature,data.label,j);diff(j)=sqrt((nucleus(j,1)-seed(j,2))^2)+sqrt((nucleus(j,2)-seed(j,3))^2);end%验证中心变化量;%当中心变化小于一定值得到局部最优解,跳出循环;if sqrt(sum(diff))>3for j=1:num_seedseed(j,1)=nucleus(j,1);plot(seed(j,2),seed(j,3),'g*');hold on;endelsebreak;endend%绘制结果for i=1:nfor j=1:num_seedif(data.label(i,1)==j)plot(data.feature(i,1),data.feature(i,2),...'ks','MarkerFaceColor',...[abs(cos(j^6)) abs(0.7*cos(j^3)) abs(sin(j^2))]);endendend
和k-means不同,层次聚类(Hierarchical Clustering)一开始不需要知道样本待聚类数目,假设有N个待聚类的样本,基本步骤为:
其中相似度的计算方法有许多种,举例如下:
| 方法 | 公式 |
|---|---|
| 欧氏距离 | |
| 欧氏距离的平方 | |
| 曼哈顿距离 | |
| 最大距离 |


%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%使用欧式距离计算dis=ones([n n]);min_v=0;for k=1:inffor i=1:nfor j=1:n%计算类与类间相似度diffx=data.feature(i,1)-data.feature(j,1);diffy=data.feature(i,2)-data.feature(j,2);dis(i,j)=sqrt(diffx^2+diffy^2);if(dis(i,j)<=min_v)dis(i,j)=max(max(dis));endendend%函数f_min获得矩阵最小值的行列坐标和值%获取相似度矩阵的最大值(距离最短)[min_row,min_col,min_v]=f_min(dis);%得到相似度最大两类归并data.Label(min_row,1)=min_col;%阈值设定if(min_v>0.98*max(max(dis)))break;endend%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%查看剩余标签值counter=zeros([n 1])for i=1:ncounter(data.Label(i,1),1)=counter(data.Label(i,1),1)+1;enda=find(counter);
本次实验测试了最基本的k-means算法和层次算法聚类,其中k-means图心选取直接取的坐标均值,层次算法相似度使用欧氏距离,可以调节k-means初始点个数和层次算法的阈值。