@floatsd
2016-04-12T13:12:31.000000Z
字数 4353
阅读 1437
人工智能导论实验报告
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,:)];
end
end
%分别取聚类坐标均值
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_seed
seed(i,2:3)=data.feature(seed(i,1),:);
end
dis=zeros([1 num_seed]);
nucleus=zeros([num_seed 2]);
diff=zeros([1 num_seed]);
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%k_Means
plot(0,0);
hold on;
for k=1:n
for i=1:n
for j=1:num_seed
dis(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_seed
nucleus(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))>3
for j=1:num_seed
seed(j,1)=nucleus(j,1);
plot(seed(j,2),seed(j,3),'g*');
hold on;
end
else
break;
end
end
%绘制结果
for i=1:n
for j=1:num_seed
if(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))]);
end
end
end
和k-means不同,层次聚类(Hierarchical Clustering)一开始不需要知道样本待聚类数目,假设有N个待聚类的样本,基本步骤为:
其中相似度的计算方法有许多种,举例如下:
方法 | 公式 |
---|---|
欧氏距离 | |
欧氏距离的平方 | |
曼哈顿距离 | |
最大距离 |
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%使用欧式距离计算
dis=ones([n n]);min_v=0;
for k=1:inf
for i=1:n
for 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));
end
end
end
%函数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;
end
end
%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
%查看剩余标签值
counter=zeros([n 1])
for i=1:n
counter(data.Label(i,1),1)=counter(data.Label(i,1),1)+1;
end
a=find(counter);
本次实验测试了最基本的k-means算法和层次算法聚类,其中k-means图心选取直接取的坐标均值,层次算法相似度使用欧氏距离,可以调节k-means初始点个数和层次算法的阈值。