原始數據:
代碼如下:
load('ex8data1.mat'); [m n]=size(X); X_mean=mean(X); theta=(sum((X-X_mean).^2))./m; % 用無標籤樣本建立高斯分佈模型 P=exp(-(Xval-X_mean).^2./(theta.*2).^2).*(1./sqrt(theta.*pi.*2)); P=prod(P,2); F1_best=0; % F1score越大,模型越穩健 for e=0:0.001:0.3 % 通過對有標籤樣本交叉驗證選取合適的閾值 P(:,2)=(P(:,1)<e); c=P(:,2)+yval; tp=sum(c==2); % 計算異常樣本正確分類的數量 c=P(:,2)-yval; fp=sum(c==1); % 計算把正確樣本劃分爲錯誤樣本的數量 fn=sum(c==-1); % 計算把錯誤樣本劃分爲正確樣本的數量 prec=tp/(tp+fp); % 計算精確度 rec=tp/(tp+fn); % 計算召回率 F1=2*prec*rec/(prec+rec); % 計算F1score if F1_best<F1 F1_best=F1; e_best=e; end end P(:,2)=(P(:,1)<e_best); scatter(Xval(:,1),Xval(:,2),8,P(:,2),'filled');
最後結果如下:
後面第二個多維數據的練習就懶得做了,如果正式做的記得要平均分配好交叉訓練集和驗證集。