分享一些我上课的资料,里面包括4个实验,4个模型,都是基于matlab的最基础语法的模型,没有使用matlab的机器学习库,并不是面向使用,而是为了方便了解模型而已。实验中大部分的代码都已经写好的只需要再补充一部分就可以了,模型的话就是已经编写完成了。内容都在下面连接中。后文会附上实验中代码的空缺部分,当然这个随意,每人都有自己的解法。
实验:线性回归、决策树、神经网络(bp算法)、朴素贝叶斯
模型:LDA、SVM、k-means、GMM(高斯混合模型)
链接:https://pan.baidu.com/s/1iExygmWDubOD0UHlOvb4bg
提取码:0wil
当然我的csdn资源中应该也有这个资源(写完这个应该就会去上传吧)
大家如果觉得还不错可以支持一下
一、线性回归
% 请预测一个两间房,1300平方尺的房子的房价。
% ============================================================
SizeOfHouse = 1300; %房间大小(平方尺)
NumOfRoom = 2; %房间个数
price=[1,SizeOfHouse,NumOfRoom]*theta; %预测价格
% ============================================================
function [theta] = normalEqn(X, y)
% ============================================================
% NORMALEQN Computes the closed-form solution to linear regression
% NORMALEQN(X,y) computes the closed-form solution to linear
% regression using the normal equations.
% 利用多元线性回归原理 求解线性方程参数
% 该函数只适用于X_T*X为满秩矩阵
% ============================================================
X_T=X.'; %X的转置
theta=inv(X_T*X)*X_T*y; %参数的计算
%theta=(X_T*X)\X_T*y; %简化运算
end
二、决策树
这个代码的话就不多说了,在前一篇里面就详细的写了,至于有朋友说看不懂那个树究竟怎样的结构,所以这里讲一下。其实就是用matlab中containers.Map图的数据结构与来编写的,简单来说就是,节点和边都是图中的一条边。假设现在决策好坏瓜用密度和含糖量来描述,构建的话,就类似下图。
三、神经网络
%输出层梯度项
g=output_out.*(1-output_out).*(train_label(i,:)-output_out);
%隐层梯度项
e=hidden_out.*(1-hidden_out).*(g*W2');
%更新连接权重,阈值
W2=W2+Eta*(g'*hidden_out)';
B2=B2-Eta*g;
W1=W1+Eta*(e'*train(i,:))';
B1=B1-Eta*e;
四、朴素贝叶斯
1.计算先验概率
这里用Dc保留了每个标签的在数据集中的样本数量,Dc(i)即标签为a(i)的数量,以及带有该标签的样本在classLabelIndex(i)为1,不是该标签为0,方便之后的运算
%% 统计标签列每种不同的标签有多少个数据,然后计算先验概率
P = zeros(num_class,1); %记录每个类别的先验概率
%====== 下面计算每个类的先验概率,请同学们完成(注意拉普拉斯修正)=========
Dc=zeros(num_class,1);
%每个标签的的数量
classLabelIndex=false(num_class,n);
%属于当前标签的样本,属于为true,不属于为false
for i=1:num_class
for k=1:n
%遍历查找等于当前标签相同的样本
classLabelIndex(i,k)=strcmp(char(data{k,m}),char(a{i,1}));
Dc(i)=Dc(i)+classLabelIndex(i,k);
end
P(i) =(Dc(i)+1)/(n+num_class);%计算先验概率
end
2.计算条件概率
(1)计算离散属性的条件概率
%====== 下面计算离散型特征每个属性值的条件概率,请同学们完成===========
for i=1:num_class
for j=1:num %遍历该特征的取值
Dcx=0; %Dcx:该取值为c{col}(j,1)且标签索引为i的样本数量
for k=find(classLabelIndex(i,:))
Dcx=Dcx+strcmp(char(data{k,col}),char(c{col}{j,1}));
end
P_col{col}(j,i)=(Dcx+1)/(Dc(i)+num);%条件概率
end
end
(2)计算连续属性的条件概率
这里假定连续的属性服从高斯分布,使用了gaussmf(x,U,D)函数来求高斯值,并将U,D均值和方差都存储了下来,方便之后假如连续值需要预测而数据中没匹配项时,可以方便计算
%====== 下面计算连续型特征的条件概率,请同学们完成===================
%假设服从高斯分布
for i=1:num_class
U(col,i)=mean(c{col}(classLabelIndex(i,:),1));%均值
sig(col,i)=std(c{col}(classLabelIndex(i,:),1));%方差
for j=1:n
P_col{col}(j,i)=gaussmf(c{col}(j,1),[sig(col,i),U(col,i)]);
end
end
%============================================================
3.计算测试样本的后验概率
(1)检查测试样本匹配到训练数据中的属性值的哪一项,连续和离散的属性值匹配方式略有差别,离散值字符匹配,而连续值因为会有精度问题,2个数可能不能完全相等,所以用abs(test{col}-c{col}(k))<1e-12,即使用绝对值小于10的-12次方的数来判断相等
(2)匹配到了,将之前计算的条件概率放进P_col_test数组中,若没有匹配到则额外计算,对于离散值,就是 P_col_test(col,i)=1/(Dc(i)+kindLength);,对于连续属性则用之前保存的方差D和均值U来计算,即 P_col_test(col,i)=gaussmf(test{col},[U(col,i),D(col,i)]);
(3)计算条件概率连乘再乘先验概率,连乘使用prod计算
(4)找到最大概率对应的标签
%% 计算测试样本的后验概率
y = zeros(num_class,1); %记录测试样本的后验概率
%====== 下面计算测试样本的后验概率,请同学们完成=====================
P_col_test=zeros(m-1,num_class);
%计算对应的先验概率
for col=1:m-1
[kindLength,~]=size(c{col});
matchIndex=0;
%+----------匹配属性取值---------------
if(tag(col)==1)
%离散
for k=1:kindLength
if strcmp(char(test{col}),char(c{col}{k,1}))
matchIndex=k;
break;
end
end
else
%连续
for k=1:kindLength
if abs(test{col}-c{col}(k))<1e-12
matchIndex=k;
break;
end
end
end
%----------选择/计算条件概率---------------
if(matchIndex~=0)
%有匹配的
P_col_test(col,:)= P_col{col}(matchIndex,:);
else
%没有匹配的
if(tag(col)==1)
%离散
for i=1:num_class
P_col_test(col,i)=1/(Dc(i)+kindLength);
end
else
%连续
for i=1:num_class
P_col_test(col,i)=gaussmf(test{col},[sig(col,i),U(col,i)]);
end
end
end
end
%计算后验概率
for i=1:num_class
y(i)=P(i)*prod(P_col_test(:,i));
end
%================================================================
[Y,index_] = max(y); %得到测试样本的类别标签序号
Label = a{index_,1} %得到测试样本的类别标签名
end
后续的话,就可能是聚类方面的内容的,其他的大概就没怎么会继续学啦。
溜了溜了,下回见