实验内容
将MIT室内场景数据库中卧室、浴室作为正负样本,利用留出法完成训练集与测试集的划分(比例1:2),并使用测量夹角余弦的方式进行二分类(0为负,1为正),最后给出分类错误率和准确率,并绘制ROC曲线。

实验原理
【余弦距离】也称为余弦相似度,是用向量空间中两个向量夹角的余弦值作为衡量两个个体间差异的大小的度量。余弦值越接近1,就表明夹角越接近0度,也就是两个向量越相似,这就叫"余弦相似性"。

实验过程
Step1:将卧室图像作为正样本,浴室图像作为负样本
Step2:利用留出法将正负样本按1:2比例划分为训练集与测试集
Step3:将正样本标签化1,负样本标签化0
Step4:计算每个训练集样本与测试集样本的cos
Step5:找出最大的cos以及对应的位置的标签
Step6:比较测试集的标签与预测得出的测试集标签是否相等,并计算相等个数,相等即预测成功,可以算出准确度
Step7:根据以求得的数据画出ROC图像
问题注意:因为我们的数据处理需要是灰度图,在对图片进行处理时:有些图片是灰度图,有些不是。是灰度图的就不用进行数据处理,不是的需要进行数据处理,这里就需要进行一个判定。

%若矩阵维度大于1图像是三维  ==1是2维
if size(im,3)>1
     im=rgb2gray(im);   %%图片转灰色  
end

实验代码

%%计算余弦
cos=[];%用来存放余弦
A=[];B=[];
%求cos最大值
for i=1:size(Xtest,2)
    A(i)=sqrt(Xtest(:,i)'*Xtest(:,i));%测试样本的绝对值
    for j=1:size(Xtrain,2)
        B(j)=sqrt(Xtrain(:,j)'*Xtrain(:,j));%训练样本的绝对值
        cos(i,j)=sum(Xtest(:,i).*Xtrain(:,j))/(A(i)*B(j));%%存放训练样本与测试样本的cos值
    end
    max_cos=max(cos(i,:));%找出最大的cos
    l=find(cos(i,:)==max_cos); %找出最大cos对应的测试集的位置
    ypredict(1,i)=Ytrain(1,l(1,1));%将对应的训练集的标签给到测试集
end
disp('acc为准确率,err为错误率,auc为ROC曲线下的面积:');
acc=sum(ypredict==Ytest)/size(Xtest,2)%计算准确率
err=1-acc%错误率
auc=plot_roc(ypredict,Ytest)%返回ROC曲线的曲线下的面积

欧氏距离和余弦距离各自有不同的计算方式和衡量特征,因此它们适用于不同的数据分析模型:
欧氏距离能够体现个体数值特征的绝对差异,所以更多的用于需要从维度的数值大小中体现差异的分析,如使用用户行为指标分析用户价值的相似度或差异。
余弦距离更多的是从方向上区分差异,而对绝对的数值不敏感,更多的用于使用用户对内容评分来区分兴趣的相似度和差异,同时修正了用户间可能存在的度量标准不统一的问题(因为余弦距离对绝对数值不敏感)。