Programming Exercise 8: Anomaly Detection and Recommender Systems
这周总结一下Week9的作业,第一部分需要利用高斯分布进行异常检测,第二部分需要利用协同过滤算法搭建一个电影推荐系统。
首先看一下作业要求。
有三个文件需要我们完成,难度均不大。
一.ex8
简单介绍一下异常检测的思想,所谓异常检测,既是将与大部分正例在特征距离上相差较大的例子检测出来。可以应用在大量服务器工作中少量机器出现异常情况的发现,产品的质量检测等。
很自然的我们就会想如何判断一个例子的偏差的大小?这里就涉及一个阀值,需要通过搜索来找到使预测精度达到最大的阀值。因为异常数据较少,会出现数据偏斜的问题,所以这里需要用F值来替代预测精度。
estimateGaussian.m需要返回数据X均值和方差,无难度。
mu=mean(X);
sigma2=sum(X.^2)/m-mu.^2;
selectThreshold.m
在用高斯分布算出距离后,选择合适的阀值。
predictions=(pval<epsilon);
tp=size(intersect(find(predictions==1),find(yval==1)),1);
fp=size(intersect(find(predictions==1),find(yval==0)),1);
fn=size(intersect(find(predictions==0),find(yval==1)),1);
prec=tp/(tp+fp);
rec=tp/(tp+fn);
F1=2*prec*rec/(prec+rec);
结果如下:
二.ex8_cofi
根据以往用户对电影评分数据根据新用户的喜好,为他推荐电影。首先分析一下数据,电影特征为所含不同类型镜头的数量,用户特征为其对 不同类型电影的评分。R为标记矩阵,R(i,j)=1表示第i部电影被第j名用户评分。
cofiCostFunc.m误差函数与梯度函数:
J=J+sum(sum((R.*(X*Theta'-Y).^2)))/2+lambda/2*sum(sum(Theta.^2))+...
lambda/2*sum(sum(X.^2));
for i=1:size(X,1)
idx = find(R(i,:)==1);
Thetatemp = Theta(idx,:);
Ytemp = Y(i,idx);
X_grad(i,:)=(X(i,:)*Thetatemp'-Ytemp)*Thetatemp+lambda*X(i,:);
end
for j=1:size(Theta,1)
idx = find(R(:,j)==1);
Xtemp = X(idx,:);
Ytemp = Y(idx,j);
Theta_grad(j,:)=(Xtemp*Theta(j,:)'-Ytemp)'*Xtemp+lambda*Theta(j,:);
end
总结一下,推荐系统这里电影特征和用户特征的梯度矩阵需要好好琢磨一下,然后别的基本没什么要说的了。这是最后一次编程作业,贵在坚 持,加油吧。