1 K-means Clustering
1.1 Implementing K-means
K均值聚类算法程序的主体:
% Initialize centroids
% 中心点初始化
centroids = kMeansInitCentroids(X, K);
for iter = 1:iterations
% Cluster assignment step: Assign each data point to the
% closest centroid. idx(i) corresponds to cˆ(i), the index
% of the centroid assigned to example i
% 将各点归类到距离最近的中心点
idx = findClosestCentroids(X, centroids);
% Move centroid step: Compute means based on centroid
% assignments
%计算各类的新中心点
centroids = computeMeans(X, idx, K);
end
1.1.1 Finding closest centroids
任务:完成findClosestCentroids.m
,实现将各点都归类到最近的中心点。
输入:
- 数据点矩阵
X
,元素为所有点的位置 - 中心点矩阵
centroids
,元素为K
个中心点的位置
输出:
- 一维数组
idx
,元素为每个点对应的中心点索引号(1,2,…,K)
遍历所有点,计算点X(i,:)
与所有中心点centroids
的距离,将距离最小值所对应的索引赋值j
给idx(i)
。
for i = 1:length(X)
L = sum( (X(i,:) - centroids ).^2, 2);
[~,j] = min(L);
idx(i) = j;
end
1.1.2 Computing centroid means
任务:完成computeCentroids.m
,实现每一类的新中心点的计算。
输入:
- 数据点矩阵
X
,元素为所有点的位置 - 一维数组
idx
,元素为每个点对应的中心点索引号(1,2,…,K) - 分类数
K
输出:
- 中心点矩阵
centroids
,元素为K
个中心点的位置
计算每类i
所属点X(idx == i,:)
的中心点(即平均点)
for i = 1:K
centroids(i,:) = mean(X(idx == i,:));
end
1.2 K-means on example dataset
完成以上两个子函数,再运行ex7.m
就可以看到K均值聚类迭代的可视化过程。
1.3 Random initialization
ex7.m
的中心点初始化是人为给定的,但在实际应用中,更多的是随机从数据点中选取K
个点作为中心点。
任务:完成kMeansInitCentroids.m
,实现随机初始化。
输入:
- 数据点矩阵
X
,元素为所有点的位置 - 分类数
K
输出:
- 中心点矩阵
centroids
,元素为K
个中心点的位置
作业里直接给了下面的代码。首先,用randper