生物数据挖掘聚类分析实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验三 聚类分析
一、实验目的
1. 了解典型聚类算法
2. 熟悉聚类分析算法的思路与步骤
3. 掌握运用Matlab 对数据集做聚类分析的方法
二、实验内容
1. 运用Matlab 对数据集做K 均值聚类分析
2. 运用Matlab 对数据集做基于密度的聚类分析
三、实验步骤
1.写出对聚类算法的理解
聚类分析又称群分析,它是研究(样品或指标)分类问题的一种统计分析方法,同时也是数据挖掘的一个重要算法。聚类(Cluster )分析是由若干模式(Pattern )组成的,通常,模式是一个度量(Measurement )的向量,或者是多维空间中的一个点。聚类分析以相似性为基础,在一个聚类中的模式之间比不在同一聚类中的模式之间具有更多的相似性。在数据中发现数据对象之间的关系,将数据进行分组,组内的相似性越大,组间的差别越大,则聚类效果越好。在进行聚类分析时,出于不同的目的和要求,可以选择不同的统计量和聚类方法。
2.写出K-means 算法步骤
通过迭代把数据对象划分到不同的簇中,以求目标函数最大化,从而使生成的簇尽可能地紧凑和独立。具体步骤如下:
(1)首先,随机选取k 个对象作为初始的k 个簇的质心;
(2)然后,将其余对象根据其与各个簇质心的距离分配到最近的簇;
(3)再要求形成的簇的质心。
这个迭代重定位过程不断重复,直到目标函数最小化为止。
设p 表示数据对象,i c 表示 簇i C 的均值,通常采用的目标函数形式为平法误差准则函数: 2
1||||∑∑=∈-=k i C p i i c p E (欧几里得距离)
3.写出DBSCAN 算法步骤
与均值漂移聚类类似,DBSCAN 也是基于密度的聚类算法。具体步骤如下:
(1)首先确定半径r 和minPoints. 从一个没有被访问过的任意数据点开始,以这个点为
中心,r为半径的圆内包含的点的数量是否大于或等于minPoints,如果大于或等于minPoints则改点被标记为central point,反之则会被标记为noise point。
(2)重复1的步骤,如果一个noise point存在于某个central point为半径的圆内,则这个点被标记为边缘点,反之仍为noise point。重复步骤1,直到所有的点都被访问过。
4.启动Matlab,运用Matlab对数据集进行K-means算法、DBSCAN算法聚类分析,写出关键代码,数据集名称,记录实验过程,实验结果,并分析实验结果。
(1)K-means算法:
1)关键代码:
% k-均聚类算法
clc
clear;
% main variables
dim = 30; % 模式样本维数
k = 4; % 设有k个聚类中心
load('testSet.txt');
PM=testSet;% 模式样本矩阵
N = size(PM,1);
figure();
subplot(1,2,1);
for(i=1:N)
plot(PM(i,1),PM(i,2), '*r'); % 绘出原始的数据点
hold on
end
xlabel('X');
ylabel('Y');
title('聚类之前的数据点');
CC = zeros(k,dim); % 聚类中心矩阵,CC(i,:)初始值为i号样本向量
D = zeros(N,k); % D(i,j)是样本i和聚类中心j的距离
C = cell(1,k); %% 聚类矩阵,对应聚类包含的样本。初始状况下,聚类i(i for i = 1:k-1 C{i} = [i]; end C{k} = k:N; B = 1:N; % 上次迭代中,样本属于哪一聚类,设初值为1 B(k:N) = k; for i = 1:k CC(i,:) = PM(i,:); end while 1 change = 0;%用来标记分类结果是否变化 % 对每一个样本i,计算到k个聚类中心的距离 for i = 1:N for j = 1:k % D(i,j) = eulerDis( PM(i,:), CC(j,:) ); D(i,j) = sqrt((PM(i,1) - CC(j,1))^2 + (PM(i,2) - CC(j,2))^2); end t = find( D(i,:) == min(D(i,:)) ); % i属于第t类 if B(i) ~= t % 上次迭代i不属于第t类 change = 1; % 将i从第B(i)类中去掉 t1 = C{B(i)}; t2 = find( t1==i ); t1(t2) = t1(1); t1 = t1(2:length(t1)); C{B(i)} = t1; C{t} = [C{t},i]; % 将i加入第t类 B(i) = t; end end if change == 0 %分类结果无变化,则迭代停止 break; end % 重新计算聚类中心矩阵CC for i = 1:k CC(i,:) = 0; iclu = C{i};