聚类算法:
我们在进行无监督学习的时候面对的数据是没有进行标记的。如图所示:
所以我们能看到的数据是一系列如X(1),X(2)........X(m)并没有相对应的y来作参考。就此数据而言, 其中一种可能的结构 是 所有的数据 可以大致地划分成 两个类或组。 因此,像我介绍的 这种划分组的算法, 称为 聚类算法。 这是我们第一种 无监督学习算法。
K-means:
K-means为最简单的一种聚类算法,算法过程为两个操作的迭代——簇分配与移动中心点。
簇分配:如上图所示红色月蓝色的x为聚类中心点,我们通过判断数据点到两个中心点的距离来将绿色的数据点染色,依据他们更接近红色这个中心 ,还是蓝色这个中心 进行染色。 如图:
移动中心点:红x和蓝x移动到和它一样颜色的那堆点的均值处,那么我们要做的是找出所有红色的点计算出它们的均值,就是所有红色的点 平均下来的位置。然后我们就把红色点的聚类中心移动到蓝色的点也是这样 ,找出所有蓝色的点 计算它们的均值, 把蓝色的叉放到那里。将按照图上所示这么移动
最终,当算法收敛,即聚类中心不再变化时,聚类完成
K-means的目标函数:
我们在监督学习中学到的方法都有优化目标函数或者某个待见函数需要通过算进行最小化处理,其实在K-means中也有代价函数。
c(i)表示x(i)所在的簇。mu(k)表示第k个簇的聚类中心
随机初始化:
由于初始化聚类中心的不同,这就可能导致K-Means算法会产生局部最优解。
有几种不同的方法 可以用来随机 初始化聚类中心 ,但是 事实证明, 有一种方法比其他 大多数方法 更加被推荐
随机选择样本点 多次初始化聚类中心,然后计算K-Means的代价函数,根据失真代价函数的大小选择最优解。
类别数K的选择:
目前用来决定聚类数目的 最常用的方法 ,仍然是通过看可视化的图, 或者看聚类算法的输出结果 ,或者其他一些东西来手动地决定聚类的数目。
下图是当K的取值从2到9时,聚类效果和类簇指标的效果图:
肘部法则:通过失真代价函数关于K大小的函数曲线,代价函数会醉着K的增大逐渐减小,直至趋于稳定,由此我们可以判断,当拐角的时候是最适合的K大小,但是实际情况中,往往我们无法得到一个明显的拐点用于判断
维数约简:
在实际工作中通常会面对很多的维数,对数据进行降维就变得很有必要了。
PCA:
PAC即主成分分析方法,是一种使用最广泛的数据压缩算法。在PCA中,数据从原来的坐标系转换到新的坐标系,由数据本身决定。转换坐标系时,以方差最大的方向作为坐标轴方向,因为数据的最大方差给出了数据的最重要的信息。第一个新坐标轴选择的是原始数据中方差最大的方法,第二个新坐标轴选择的是与第一个新坐标轴正交且方差次大的方向。重复该过程,重复次数为原始数据的特征维数。
通过这种方式获得的新的坐标系,我们发现,大部分方差都包含在前面几个坐标轴中,后面的坐标轴所含的方差几乎为0,。于是,我们可以忽略余下的坐标轴,只保留前面的几个含有绝大部分方差的坐标轴。事实上,这样也就相当于只保留包含绝大部分方差的维度特征,而忽略包含方差几乎为0的特征维度,也就实现了对数据特征的降维处理。
PCA算法:
第一步:求平均值得到各个维的平均值。
第二步:计算协方差矩阵
第三步:计算出协方差矩阵的特征值与特征向量
第四步:将特征值按照从大到小的顺序排序,选择其中最大的k个,然后将其对应的k个特征向量分别作为列向量组成特征向量矩阵。
第五步:将样本点投影在特征向量上。
数据的预处理:
将数据正规化,使数据的均值为0.
PCA算法:
Sigma为协方差矩阵,用svd函数对sigma进行分解,得到正交矩阵U,V,对角矩阵S。
总结:
编程作业:
computeCentroids.m
function centroids = computeCentroids(X, idx, K)
%COMPUTECENTROIDS returns the new centroids by computing the means of the
% Useful variables
[m n] = size(X);
% You need to return the following variables correctly.
centroids = zeros(K, n);
for i = 1:K
sumC = sum(idx == i);
centroids(i,:) = sum(X(find(idx == i),:))/sumC;
end
end
findClosestCentroids.m
function idx = findClosestCentroids(X, centroids)
% Set K
K = size(centroids, 1);
% You need to return the following variables correctly.
idx = zeros(size(X,1), 1);
m=size(X,1);
disx= zeros(size(X,1), 1);
for i = 1:m
disx(i) = sum((X(i,:)-centroids(1,:)).^2);
idx(i) = 1;
for j = 2:size(centroids,1)
tempDis = sum((X(i,:)-centroids(j,:)).^2);
if tempDis < disx(i)
idx(i) = j;
disx(i) = tempDis;
end
end
end
% =============================================================
end
kMeansInitCentroids.m
function centroids = kMeansInitCentroids(X, K)
centroids = zeros(K, size(X, 2));
randidx = randperm(size(X, 1));
centroids = X(randidx(1:K), :);
% =============================================================
end
pca.m
function [U, S] = pca(X)
% Useful values
[m, n] = size(X);
U = zeros(n);
S = zeros(n);
sigma=X'*X/m;
[U,S,V]=svd(sigma);
% =========================================================================
end
projectData.m
function Z = projectData(X, U, K)
% You need to return the following variables correctly.
Z = zeros(size(X, 1), K);
U_reduce = U(:, 1:K);
Z = X* U_reduce;
% =============================================================
end
recoverData.m
function X_rec = recoverData(Z, U, K)
% You need to return the following variables correctly.
X_rec = zeros(size(Z, 1), size(U, 1));
X_rec = Z*U(:,1:K)';
% =============================================================
end