实验二 K均值聚类
这个是我在学校做的,学校实验及目标
已经全部完成。详情请联系QQ1244460612
一、实验目的和要求
1)掌握K均值聚类算法并编程实现聚类任务(不调用函数)。
2)掌握数据归一化方法。
3)分析不同K值对实验结果的影响,并估计最好的K值。
4)选用不同的初始化方法进行实验。
5)计算聚类结果。(聚类准确率)
6)对聚类结果进行可视化(可绘制散点图,选择2-3个特征)。
二、实验仪器和设备
微型计算机,装有Windows操作系统和MATLAB环境平台。
clear; close all; clc;
fprintf(’\nRunning K-Means clustering example dataset.\n\n’);
%加载数据集
X = load(‘data.mat’);
X = cell2mat(struct2cell(X));
%设定K值和最大迭代次数
K = 3;
max_iter = 10;
initial_centroids = kMeansInitCentroid(X, K);
fprintf(‘初始化质心:\n’);
fprintf(’ %f %f \n’, initial_centroids);
[centroids, idx] = runkMeans(X, initial_centroids, max_iter, true);
fprintf(‘最终质心: \n’);
fprintf(’ %f %f \n’, centroids);
fprintf(‘The class of the first 3 points: \n’);
fprintf(’ %d \n’, idx(1:3));
fprintf(’\nK-Means Done.\n\n’);
end
% 实现两个坐标点的连线
function drawLine(p1, p2)
plot([p1(1) p2(1)],[p1(2) p2(2)]);
end
% 初始化K个中心点
function centroids = kMeansInitCentroid(X, K)
centroids = zeros(K, size(X, 2));% 生成K X 数据集大小矩阵
% 将1-n个数随机排列
randidx = randperm(size(X, 1));
centroids = X(randidx(1:K), ;
end
% 找到最近的中心点
function index = findClosestCentroids(X, centroids)
index = zeros(size(X,1), 1);
length = size(X,1);
K = size(centroids, 1);
distance = zeros(1,K);
for i=1:length
for j=1:K
distance(j) = norm(X(i,:) - centroids(j,:));% 计算距离
end
[~, index(i)] = min(distance);
end
end
% 更新中心点
function centroids = computeCentroids(X, index, K)
centroids = zeros(K, size(X,2));
for i=1:K
idx = find(index==i);
number = length(idx);
centroids(i,:) = sum(X(idx, ) / number;
end
end
% 绘制k-means迭代图
function plotProgresskMeans(X, centroids, previous, idx, K, i)
% 创建画板,将颜色和类别一一映射
palette = hsv(K);
colors = palette(idx,:);
% 绘制散点图
scatter(X(:,1),X(:,2),15,colors);
% 将中心点绘制成黑色的’x’
plot(centroids(:,1), centroids(:,2), ‘x’, ‘MarkerEdgeColor’, ‘k’, ‘MarkerSize’, 10, ‘LineWidth’, 3);
% 绘制中心点更新的轨迹
for j=1:size(centroids, 1)
% plot([centroids(j,:), previous(j,:)],[centroids(j,:), previous(j,:)]);
drawLine(centroids(j,:), previous(j,:));
end
title(sprintf(‘Iteration number %d’,i));
end
% 实现k-means
function [centroids, idx] = runkMeans(X, initial_centroids, max_iter, plot_progress)
if ~exist(‘plot_progress’, ‘var’) || isempty(plot_progress)
plot_progress = false;
end
if plot_progress
figure;
hold on;
end
% 初始化
[m, ~] = size(X);
K = size(initial_centroids, 1);
centroids = initial_centroids;
previous_centroids = initial_centroids;
idx = zeros(m, 1);
% 运行k-means
for i=1:max_iter
fprintf(‘K-Means iteration %d/%d…\n’, i, max_iter);
%发现最近质心
idx = findClosestCentroids(X, centroids);
if plot_progress
plotProgresskMeans(X, centroids, previous_centroids, idx, K, i);% 绘制新迭代图
previous_centroids = centroids; % 替换质心
fprintf('Press enter to continue.\n')
pause;
end
centroids = computeCentroids(X, idx, K); % 计算质心
end