[机器学习]一些资料分享

分享一些我上课的资料,里面包括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图的数据结构与来编写的,简单来说就是,节点和边都是图中的一条边。假设现在决策好坏瓜用密度和含糖量来描述,构建的话,就类似下图。
[机器学习]一些资料分享_第1张图片

三、神经网络

%输出层梯度项  
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

后续的话,就可能是聚类方面的内容的,其他的大概就没怎么会继续学啦。
溜了溜了,下回见

你可能感兴趣的:(机器学习,机器学习)