ex7
Unsupervised Learning
findClosestCentroids.m
这里又用上了repmat大法。毕竟初识数据结构之后,总想让时间复杂度最低,因此在想各种方式去减少。问题是matlab一个大问题就是不开源,因此各个函数的底层是未知的。比如自己编一个代码在C上跑和matlab用函数跑,往往是matlab更慢。但matlab就胜于自己的矩阵运算以及高度集成化,简单还易上手。走偏了,走偏了。。。
for i=1:size(X,1)
dis=repmat(X(i,:),K,1);
dissquare=0;
for j=1:size(X,2)
dissquare=dissquare+(centroids(:,j)-dis(:,j)).^2;
end
[~,idx(i)] = min(dissquare,[],1);
end
computeCentroids.m
也是想了好多次写出来的代码,也还算简单(但并不知道复杂度如何。)
for i=1:K
x_k=find(idx==i);
centroids(i,:)=mean(X(x_k,:));
end
pca.m
这个计算sigma和调用函数就是20分?i 了 i 了。
Sigma=1/m*X'*X;
[U,S,V]=svd(Sigma);
projectData.m
U_reduce = U(:,1:K);
Z=X*U_reduce;
ex8
estimateGuassian.m
这个计算很简单。
mu=(1/m*sum(X))';
sigma2=1/m*sum((X-mu').^2);
selectThreshold.m
在寻找最佳阈值的时候试了好多次,总是出错,出错的主要原因是想要尽量减少计算,所以在计算pre_neg的时候会采用pre_neg=size(pval,1)-pre_pos
的方法。但就是这样的想法,导致在tp和fn的时候计算出错(之前没有引入temp这个变量,所以更改了原数组)。用了两个下午的时间,才把这个搞出来。
另外,大家对于TP,TN,FP,FN的记忆有没有什么好的方法?我总是搞混。。。
[m,~]=find(pval<epsilon);
temp=zeros(size(pval));
temp(m)=1;
pre_pos=sum(temp==1);
pre_neg=size(pval,1)-pre_pos;
tp=sum((temp==1)&(yval==1));
fn=sum((temp==0)&(yval==1));
fp=pre_pos-tp;
tn=pre_neg-fn;
prec=tp/pre_pos;
rec=tp/(tp+fn);
F1=2*prec*rec/(prec+rec);
cofiCostFunc.m
最后一个练习被分成了四个部分。但难度不大,可以很快完成
p=X*Theta';
p(find(R==0))=0;
J=1/2*sum(sum((p-Y).^2))+1/2*lambda*sum(sum(Theta.^2))+1/2*lambda*sum(sum(X.^2));
X_grad=(p-Y)*Theta+lambda*X;
Theta_grad=(p-Y)'*X+lambda*Theta;
总结
整个MachineLearning学完了,练习也做完了,拿到了证书!!
(练习过程中好多时候会卡壳,这个时候就十分感谢度娘和CSDN广大的博客主了。)
但这只是第一步,接下来准备学习李宏毅的深度学习的课程,再学习数据结构,多多加强这方面的知识。我这个小白道阻且长啊。