您的位置:首页 > 其它

Anomaly Detection and Recommender Systems[异常检测&推荐系统]

2015-03-26 17:23 405 查看
这是学习coursera上ML的一份笔记整理,梳理一下的思路。

异常检测(Anomaly Detection)

就是通过看sample的各个feature的值,判断该点是不是异常点。这里Andrew采用Gaussian分布,原因记得是概率论与数理统计中的大数定律貌似。

其实说来很简单,就是看各个feature的高斯分布的位置(概率),然后乘起来。直观理解就是所有的feature值都很高的话说明是大概率,还是看图比较直接。



m计算过程就是算出各个feature的 μ,σ\mu, \sigma,然后计算这个sample的 ∏p(x;μ,σ2)\prod p(x;\mu, \sigma^2)

mu = mean(X)';
sigma2 = var(X) * (m-1) / m;


得到μ,σ2\mu, \sigma^2再带入上面的高斯分布,再连乘,就搞定了,计算出这个sample的代表该sample是否正常的值。这里整理的挺好的,直接贴上来额。



接下来找阈值ϵ\epsilon

这里用cross validation set(交叉验证集),这里的交叉验证机是有监督的,也就是有对应的“标准答案”的。

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

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


挺直观的,一点一点增加epsilon的值,对于每一个epsilon,predictions存放预测的异常点,然后计算其F1F_1-score,选择F1F_1-score最高时epsilon的值。

Anomaly detection & Supervise learning的区别

Andrew总结了一些,我直观感觉Anomaly detection都不需要“学习”,只是计算∏p\prod p,然后计算F1F_1-score,找到最佳阈值ϵ\epsilon,就可以判断异常点。

接下来是一些直方图不符合高斯分布的数据该怎么办的问题。这里用log, 开方等,只要让其变形之后长得像高斯分布咋样都行。

Multivariate Gaussian distribution

其实学习的过程中就注意到了,为什么不直接用多维高斯分布,这个应该更科学,比如解决下面这种情况



下面是多维高斯分布的概率密度函数



总的来说,多维高斯分布在sample分布“倾斜”的时候很有效,这时候∏p\prod p很可能检测不出这样的异常点。但是多维高斯分布要计算协方差矩阵,计算量太大,并且有重复特征的时候协方差矩阵容易变成奇异阵,导致错误。总的来说,各有优缺点,一般情况下,∏p(x;μ,σ)\prod p(x; \mu, \sigma)的表现已经能让人满意(应该很多情况sample都是“正的”吧)。

第一次写,果然把简单的问题讲的复杂了。

推荐系统(Recommender Systems)

推荐系统所做的事情就是预测出一个事物对另一个事物的评价(比如人对不同电影评分,尽管他没看过这个电影,然后按照预测的分数进行推荐),还是以Andrew的例子来说



上图中?号表示没有评分。



其中r(i,j),y(i,j)r(i, j), y^{(i,j)}是已知的,θ(j),x(i)\theta ^{(j)}, x^{(i)}未知,是要求的,这也是问题的关键,得到这两个参数就能知道user(j)对movie(i)的预测评分,从而进行推荐。那么问题来了,如何求θ(j),x(i)\theta ^{(j)}, x^{(i)}呢?

这个问题先放一放,先看看J(x(1),...,x(nm),θ(1),...,θ(nu))J(x^{(1)}, ..., x^{(n_m)}, \theta ^{(1)}, ..., \theta ^{(n_u)})如何计算。直接上公式:



意思就是在有用户评分的地方拿 预测值 - 实际值 的平方和,121\over 2就是个系数,总之意思很好理解。

加上正则项后:



J算出来了,接下来算grad



加上正则项后



加正则项应该是和之前的目的一样防止过拟合(使θ,x的取值尽量小\theta , x 的取值尽量小),但是这里Andrew的作业里并没有对他们加上那个“1”,所以这里的正则化的意义有点不明朗,有清楚的朋友还望告知,thanks~

下面贴上这部分代码(正则化之后的):

J = sum(sum( 0.5 * (X * Theta' - Y) .^ 2 .* (R == 1))) + lambda/2 * (sum(Theta(:).^2) + sum(X(:).^2));
X_h = X * Theta';
X_grad = (X_h - Y) .* R * Theta + lambda * X;
Theta_grad = (X_h - Y)' .* R' * X + lambda * Theta;


之后用梯度下降计算出θ(j),x(i)\theta ^{(j)}, x^{(i)}就可以用来预测了,这里用正态分布产生随机数初始化了θ,x\theta, x矩阵,feature个数也是自己选择的,Y用的是YnormY_{norm}也就是减去了每行的已评价的平均数。最后就可以用预测的分数排序后推荐了。

总结一下,其实主要步骤就几步:

1,完成 J, grad[包括gradx,gradθgrad_x, grad_\theta的计算],其中x,θx, \theta可以用正态分布初始化;

2,用梯度下降等方法优化;

3,有了x,θx, \theta就能计算出预测值,从而推荐。

就这么简单。

第一次写博客,算是对知识的一次整理,文笔凌乱,原本简单的东西可能说的复杂了,各位轻拍。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐