Coursera上Andrew Ng机器学习课程总结(二)

无监督算法

K-means算法

k-means算法是一种聚类算法,大体上的意思是:随机初始化K个聚点,遍历每个样本点,计算其属于哪个聚点,这样就分出了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, cebtroids);

     //Move centroid step:Compute means based on centroid
     //assignments
     centroids = computeMeans(X, idx, K);
end

注意:1,初始的K个聚点最好随机化。
2,这样会存在问题,即最后聚类算法表现不好。K较小的时候,可以运行多次算法取最小的失真函数。

PCA分析

Principal Component Analysis(PCA), 主成分析法。我们主要使用这个方法来降维。
首先,需要对数据集进行标准化。然后,我们这里使用Octave/Matlab的SVD奇异值分解函数 [U,S,V]=svd(1mXTX) ,这里求出的U包含了我们的主成列。
Coursera上Andrew Ng机器学习课程总结(二)_第1张图片
举个例子来说明这个降维思路,如上图二维的数据,可以降到一维线上,这个线满足所有点到线的距离和最小。

异常检测

当样本集里,正样本(即我们想查找的异常情况)很少(10-20), 而负样本(1000)很多的时候,我们往往使用异常检测,因为使用监督学习,我们无法获得足够的正样本的性质。

为了使用异常检测,我们需要找到一个模型来拟合数据集的分布。
我们这里采用高斯分布,(为什么选择高斯分布?因为中心极限定理)

p(x;μ,δ2)=12πδ2e(xμ)22δ2[1]

传统高斯模型

计算模型如下:

p(x1;μ1,δ21)×...×p(xn;μn,δ2n)

对每个特征建立高斯模型,最后取乘积。预测一个样本时,带入上面公式,当计算出的值小于一个 ϵ 时,我们认为这个样本是异常的。

优点:计算不复杂;即使m很小,也可以用这种方法。
缺点:最后的模型不一定好。比如我的 P(x1) 值很大,但是 P(x2) 值很小,最后很可能计算的值会大于 ϵ , 认为这个点是正常点。为了应对这种情况,我们引入多元高斯模型。

多元高斯模型

多元高斯模型概率分布如下:

p(x;μ,)=12πn2||12exp(12(xμ)T1(xμ))

对所有的特征建立多元高斯模型。预测一个样本时,只需要带入到上面的公式,当计算出的值小于一个 ϵ ,我们认为这个样本是异常的。

缺点:m>n或者 必须是非奇异矩阵。

计算阀值

那么上面的阀值 ϵ 如何计算呢?
还记得我们在机器学习课程总结(一)里提到的训练模型评价里的单值分析吗?
我们就使用验证集,给每个验证集的数据打上标签。要记得y=1是那些异常的数据,y=0是那些正常的数据。比较出F值最大的那个对应的概率为 ϵ
代码如下:


stepsize = (max(pval) - min(pval)) / 1000;
for epsilon = min(pval):stepsize:max(pval)

    % Instructions: Compute the F1 score of choosing epsilon as the
    %               threshold and place the value in F1. The code at the
    %               end of the loop will compare the F1 score for this
    %               choice of epsilon and set it to be the best epsilon if
    %               it is better than the current choice of epsilon.
    %               
    % Note: You can use predictions = (pval < epsilon) to get a binary vector
    %       of 0's and 1's of the outlier predictions

    predictions = (pval < epsilon);

    tp = sum((predictions == 1)&(yval == 1));
    fp = sum((predictions == 1)&(yval == 0));
    fn = sum((predictions == 0)&(yval == 1));

    prec = tp/(tp+fp);
    rec = tp/(tp+fn);

    F1 = 2*prec*rec/(prec+rec);

    if F1 > bestF1
       bestF1 = F1;
       bestEpsilon = epsilon;
    end
end

推荐系统

对于推荐系统,我们举个例子:有一些电影,其中我们已经打了几个电影的分数了,我们现在希望做出一个系统能够自动对其他的电影打出分数,并且推荐合我们口味的电影。

协同过滤算法

x-电影数量*电影的特征向量 矩阵
θ -用户数量*用户特征向量 矩阵
y-电影数量*用户数量 用户给电影的打分矩阵
r-电影数量*用户数量 如果用户i给电影j打分了,那么r(i,j)=1

协同过滤算法就是要同时优化x与 θ

标准化后的代价函数:

J(x(1),...,xnm,θ(1),...,θ(nu))=12(i,j):r(i,j)=1((θ(j))Tx(i)y(i,j))2+(λ2j=1nuk=1n(θ(j)k)2)+(λ2i=1nmk=1n(x(i)k)2)

标准化后的求导函数:

Jx(i)k=j:r(i,j)=1((θ(j))Tx(i)y(i,j))θ(j)k+λx(i)k

Jθ(j)k=i:r(i,j)=1((θ(j))Tx(i)y(i,j))x(i)k+λθ(j)k

在线学习

有时候我们的数据集不固定如同数据流一样,不断变化,这时候我们的学习模型就要不断的调整参数,这就叫做在线学习。

Map-reduce

机器学习流水线

Photo OCR系统用来识别照片上的物体。机器学习流水线是一个问题可以被切割成很多流水模块,其中有些模块会用到机器学习。我们使用单元分析来找系统的瓶颈,使我们把有限的时间投入到提升我们系统性能最佳的模块。
举个例子:
整个系统(85)->预处理(85.1)->脸部检测(91)->眼,耳,嘴区域切割(95)->分类器识别(100)
括号内的代表在当前及前面模块全部都是完美的,准确率100%的,对应的系统准确率。比如预处理85.1,我手工把图片的背景去掉后,整个系统的准确率是85.1%。
从上面来看,脸部检测的提升空间最大,可以从85.1提升到91,提升5.9个百分点。

你可能感兴趣的:(机器学习)