吴恩达机器学习 - 无监督学习——K-means算法

版权声明:如果感觉写的不错,转载标明出处链接哦~blog.csdn.net/wyg1997 https://blog.csdn.net/wyg1997/article/details/80800148

题目链接:点击打开链接


笔记:

这里写图片描述
这里写图片描述


核心步骤:

这里写图片描述

那我们就实现这两个函数就行啦:

findClosestCentroids.m(把每个点染色):

function idx = findClosestCentroids(X, centroids)
%FINDCLOSESTCENTROIDS computes the centroid memberships for every example
%   idx = FINDCLOSESTCENTROIDS (X, centroids) returns the closest centroids
%   in idx for a dataset X where each row is a single example. idx = m x 1 
%   vector of centroid assignments (i.e. each entry in range [1..K])
%

% Set K
K = size(centroids, 1);

% You need to return the following variables correctly.
idx = zeros(size(X,1), 1);

% ====================== YOUR CODE HERE ======================
% Instructions: Go over every example, find its closest centroid, and store
%               the index inside idx at the appropriate location.
%               Concretely, idx(i) should contain the index of the centroid
%               closest to example i. Hence, it should be a value in the 
%               range 1..K
%
% Note: You can use a for-loop over the examples to compute this.
%

m = size(X,1);
dis = zeros(m,K);       %(m,k)位置表示第m个样本和第K个聚类中心的距离的平方
for i=1:m
    for j=1:K
        dis(i,j) = X(i,:)*X(i,:)' + centroids(j,:)*centroids(j,:)' - ...
            X(i,:)*centroids(j,:)'*2;
    end
end
[~, idx] = min(dis,[],2);       %寻找每一行中最小的元素索引

% =============================================================

end

computeCentroids.m(更新聚类中心):

function centroids = computeCentroids(X, idx, K)
%COMPUTECENTROIDS returns the new centroids by computing the means of the 
%data points assigned to each centroid.
%   centroids = COMPUTECENTROIDS(X, idx, K) returns the new centroids by 
%   computing the means of the data points assigned to each centroid. It is
%   given a dataset X where each row is a single data point, a vector
%   idx of centroid assignments (i.e. each entry in range [1..K]) for each
%   example, and K, the number of centroids. You should return a matrix
%   centroids, where each row of centroids is the mean of the data points
%   assigned to it.
%

% Useful variables
[m n] = size(X);

% You need to return the following variables correctly.
centroids = zeros(K, n);

% ====================== YOUR CODE HERE ======================
% Instructions: Go over every centroid and compute mean of all points that
%               belong to it. Concretely, the row vector centroids(i, :)
%               should contain the mean of the data points assigned to
%               centroid i.
%
% Note: You can use a for-loop over the centroids to compute this.
%

for i=1:K
    index = find(idx == i);
    centroids(i,:) = mean(X(index,:));
end

% =============================================================

end

看看聚类中心是怎么变化的吧~

这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
这里写图片描述
剩下的基本不怎么变啦~

还有一点需要注意:聚类中心的随机初始化:

Code(kMeansInitCentroids.m):
function centroids = kMeansInitCentroids(X, K)
%KMEANSINITCENTROIDS This function initializes K centroids that are to be 
%used in K-Means on the dataset X
%   centroids = KMEANSINITCENTROIDS(X, K) returns K initial centroids to be
%   used with the K-Means on the dataset X
%

% You should return this values correctly
centroids = zeros(K, size(X, 2));

% ====================== YOUR CODE HERE ======================
% Instructions: You should set centroids to randomly chosen examples from
%               the dataset X
%

% Randomly reorder the indices of examples
randidx = randperm(size(X, 1));
% Take the first K examples as centroids
centroids = X(randidx(1:K), :);

% =============================================================

end

另外最后还给了个例子,是关于图像颜色压缩的,也是用的K-means算法,并不是很难,自己看看了解一下就好~

猜你喜欢

转载自blog.csdn.net/wyg1997/article/details/80800148
今日推荐