matlab 算法集锦

算法集锦

决策树-划分点

function [n,h]=huafendian1(x)
%n返回增益
%h返回划分点
%假设0代表第一类
%假设1代表第二类
%输入x第一列为属性,第二列为用于学习的分类结果

[~,m]=sort(x(:,1));%按小到大排序
x=x(m,:);
t=[];
for i=1:size(x,1)-1
t=[t;(x(i,1)+x(i+1,1))/2];%生成划分点
end
%原分类结果信息熵
E1=[];
C1=length(find(x(:,2)==0))/size(x,1);%第一类比例
C2=length(find(x(:,2)==1))/size(x,1);%第二类比例
E1=-[C1*log2(C1),C2*log2(C2)];
E1(find(isnan(E1),1))=0;%0*log2(0)=NaN,这里是将NaN转化为0,如果纯度100%,则信息熵为0
E1=sum(E1);
%候选划分点信息增益
Ent=[];
if E1>0
for i=1:size(t,1)
x1=x(:,1);
%根据划分点将数据列转化成0和1
%这里默认的是数据越小越倾向第一类
b1=find(x1<=t(i,1));
b2=find(x1>t(i,1));
x1(b1)=0;
x1(b2)=1;
x2=[x1,x(:,2)];%【重新划分的数据列,因变量】
c1=length(find(x2(:,1)==0))/size(x2,1);
c2=length(find(x2(:,1)==1))/size(x2,1);
d1=length(find(x2(find(x2(:,1)==0),2)==0))/size(find(x2(:,1)==0),1);
d2=length(find(x2(find(x2(:,1)==0),2)==1))/size(find(x2(:,1)==0),1);
d3=length(find(x2(find(x2(:,1)==1),2)==0))/size(find(x2(:,1)==1),1);
d4=length(find(x2(find(x2(:,1)==1),2)==1))/size(find(x2(:,1)==1),1);
E=[d1*log2(d1),d2*log2(d2);d3*log2(d3),d4*log2(d4)];
E(find(isnan(E),1))=0;%0*log2(0)=NaN,这里是将NaN转化为0,最多有三个NaN,这里预设三个语句即可
E(find(isnan(E),1))=0;
E(find(isnan(E),1))=0;
E=sum(sum(-E.*[c1,c1;c2,c2]));%重新划分后的信息熵
Ent(i,1)=E1-E;%信息增益
end
[n,m]=max(Ent);
h=t(m);

else%如果已经达到100%纯度则n和h均返回0
n=0;
h=0;
end

随机森林
RBF神经网络(多维)

clc,clear;
close all;
%% 产生训练样本(训练输入,训练输出)
% ld为样本例数
ld=400; 
% 产生2*ld的矩阵 
x=rand(2,ld); 
% 将x转换到[-1.5 1.5]之间
x=(x-0.5)*1.5*2; 
% x的第一行为x1,第二行为x2.
x1=x(1,:);
x2=x(2,:);
% 计算网络输出F值
F=20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
%% 建立RBF神经网络 
eg=1e-30;%目标误差
sc=1;%扩展速度
mn=ld;%最大聚类中心数
display=1;%训练展示,如果是1每增加一个隐藏节点,也就是聚类中心,就会展示下训练误差情况,默认间隔50打印出一次训练误差
net = newrb(x,F,eg,sc,mn,display);%RBF网络训练
%% 建立测试样本
interval=0.1;
[i, j]=meshgrid(-1.5:interval:1.5);
row=size(i);
tx1=i(:);
tx1=tx1';
tx2=j(:);
tx2=tx2';
tx=[tx1;tx2];
%% 使用建立的RBF网络进行模拟,得出网络输出
ty=sim(net,tx);
%% 使用图像,画出3维图
% 真正的函数图像
interval=0.1;
[x1, x2]=meshgrid(-1.5:interval:1.5);
F = 20+x1.^2-10*cos(2*pi*x1)+x2.^2-10*cos(2*pi*x2);
figure
subplot(1,3,1)
mesh(x1,x2,F);
zlim([0,60])
title('真正的函数图像')
% 网络得出的函数图像
v=reshape(ty,row);
subplot(1,3,2)
mesh(i,j,v);
zlim([0,60])
title('RBF神经网络结果')
% 误差图像
subplot(1,3,3)
mesh(x1,x2,F-v);
zlim([0,60])
title('误差图像')

主成分分析


X=[124.3000 134.7000 193.3000 118.6000 94.9000 123.8000
 2.4200 2.5000 2.5600 2.5200 2.6000 2.6500
 25.9800 21.0000 29.2600 31.1900 28.5600 28.1200
 19.0000 19.2500 19.3100 19.3600 19.4500 19.6200
 3.1000 3.3400 3.4500 3.5700 3.3900 3.5800
 79.0000 84.0000 92.0000 105.0000 108.0000 108.0000
 54.1000 53.7000 54.0000 53.9000 53.6000 53.3000
 6.1400 6.7400 7.1800 8.2000 8.3400 8.5100
 3.5700 3.5500 3.4000 3.2700 3.2000 3.1000
 64.0000 64.9600 65.6500 67.0100 65.3400 66.9900]';
mapping.mean = mean(X, 1);
X = X - repmat(mapping.mean, [size(X, 1) 1]);%去均值
C = cov(X);%协方差矩阵
C(isnan(C)) = 0;
C(isinf(C)) = 0;
[M, lambda] = eig(C);%求C矩阵特征向量及特征值
[lambda, ind] = sort(diag(lambda), 'descend');%排序
lambda=lambda./sum(lambda);
lambda=cumsum(lambda);
mapping.lambda = lambda;
k=find(lambda>0.95);
M = M(:,ind(1:k(1)));%%取前k列
mappedX = X * M;%降维后的X
mapping.M = M;%映射的基

方差分析

A=[31.9   24.8   22.1
   27.9   25.7   23.6
   31.8   26.8   27.3
   28.4   27.9   24.9
   35.9   26.2   25.8]; %原始数据输入
[p,anovatab,stats]=anova1(A);%单因素方差分析
fa=finv(0.95,anovatab{2,3},anovatab{3,3});%计算fa
F=anovatab{2,5};%F值
if p<=0.01 && F>fa
    disp('非常显著')
elseif p<=0.05 && F>fa
    disp('显著')
else
    disp('不显著')
end

logistic回归

clc,clear;
close all;
shuju = [0.8+0.2*rand(20,2),ones(20,1)
    0.7+0.2*rand(20,2),zeros(20,1)];
X=shuju;
a1=find(X(:,end)==0);
a2=find(X(:,end)==1);
figure
hold on
plot(shuju(a1,1),shuju(a1,2),'r*')
plot(shuju(a2,1),shuju(a2,2),'b*')

Y=X(:,end);
X(:,end)=[];
X=[ones(size(X,1),1) X];%新增一列常数项
[m,n]=size(X);
%数据归一化处理
X=mapminmax(X',0,1)';

%设定学习率为0.01
delta=0.1;
%初始化参数
f=@(a,x)1./(1+exp(-(a(1).*x(1,:)+a(2).*x(2,:)+a(3).*x(3,:))));
a=lsqcurvefit(f,[1 1 1],X',Y');
theta1=a;

%%训练模型
%正则化后的梯度下降算法θ的更新公式
num=100000;
while num>0
    tmp=X*theta1';
    h=1./(1+exp(-tmp));
    theta1=theta1-delta*mean((h-Y));
    num =num-1;
end

%测试算法准确率
cc=0;
tmp=X*theta1';
Y1=1./(1+exp(-tmp));
for i=1:m
    if Y1(i)>=0.5
        Y1(i)=1;
    else
        Y1(i)=0;
    end
end
1-sum(abs(Y1-Y))/size(Y,1)
a1=find(Y1==0);
a2=find(Y1==1);
hold on
plot(shuju(a1,1),shuju(a1,2),'ro')
plot(shuju(a2,1),shuju(a2,2),'bo')
legend({'第1类','第2类','logistic第1类','logistic第2类'},'Location','northwest','NumColumns',1)

非线性最小二乘

clc,clear;
close all;
shuju=[1.54  1.61 1.62 1.66 1.71 1.72 1.73 1.86 1.92  2 2.21 2.29  2.34 2.38 2.42 2.44  2.57 2.64 2.71 2.85  2.93 3.01 3.14 3.22  3.34 3.49 3.55 3.79  3.99 4.12
    20.1 20.1 20.3 20.4 20.4 20.5 20.6 20.7 20.9 21.1 21.3 21.5 21.7 21.9 22 22.2 22.4 22.5 22.7 22.7 22.8 22.9 23.4 23.7 24.4 24.9 25.3 27.4 28.4 29.1
    5.17 5.14 5.13 5.10  5.08 5.03 5.01 4.99  4.93 4.91 4.89 4.81  4.77 4.75 4.62 4.56  4.5  4.48 4.46 4.31 4.28  4.19 4.12 3.99 3.91  3.84 3.75 3.64 3.51  3.5];
x1=shuju(1,:);%x1、x2为自变量
x2=shuju(2,:);
c=shuju(3,:);%c为因变量
x0=[1 1 1 1];%四个参数的初始值
d=length(x0);
f=@(a,x)0.08*(ones(1,30)-(x(1,:)./7).*(ones(1,30)-a(1)*(ones(1,30)-((x(1,:)./7).^a(2))).*exp(a(3)*sqrt((x(2,:))./2982))))+ones(1,30)*a(4);
a=lsqcurvefit(f,x0,[x1;x2],c)
%%作图
B=0.08*(ones(1,30)-(x1./7).*(ones(1,30)-a(1)*(ones(1,30)-((x1./7).^a(2))).*exp(a(3)*sqrt((x2)./2982))))+a(4)*ones(1,30);
figure
plot3(x1,x2,c,'*')
hold on
plot3(x1,x2,B)
legend('原数据','拟合数据')

figure
plot(c-B)

词云图

figure
wordcloud(ZZ,cs);
title('词云')

数据包络评价

数据包络分析(Data envelopment
analysis,DEA)是运筹学和研究经济生产边界的一种方法。该方法一般被用来测量一些决策部门的生产效率。

clc,clear;
close all;
format long
data=[14.40 0.65 31.30 3621.00 0.00
16.90 0.72 32.20 3943.00 0.09
15.53 0.72 31.87 4086.67 0.07
15.40 0.76 32.23 4904.67 0.13
14.17 0.76 32.40 6311.67 0.37
13.33 0.69 30.77 8173.33 0.59
12.83 0.61 29.23 10236.00 0.51
13.00 0.63 28.20 12094.33 0.44
13.40 0.75 28.80 13603.33 0.58
14.00 0.84 29.10 14841.00 1.00]';
 
X=data([1:3],:);%X为输入变量
Y=data([4:5],:);%Y为输出变量
[m,n]=size(X);
s=size(Y,1);
A=[-X' Y'];%由于目标函数求最小,这里的-X就转化成了求最大
b=zeros(n,1);
LB=zeros(m+s,1);UB=[];
for i=1:n
   f=[zeros(1,m) -Y(:,i)'];
   Aeq=[X(:,i)',zeros(1,s)];
   beq=1;
   w(:,i)=linprog(f,A,b,Aeq,beq,LB,UB);%前3列为投入系数,后2列为产出系数
   E(i,i)=Y(:,i)'*w(m+1:m+s,i);%产出值*产出系数
end
theta=diag(E)';
fprintf('用DEA方法对此的相对评价结果为:\n');
disp(theta);

协同推荐算法
FCM聚类
K-means聚类

clc,clear;
close all;
data=rand(50,2);
K=3
[Idx,C,sumD,D]=kmeans(data,K,'dist','sqEuclidean','rep',4);
%K: 表示将X划分为几类,为整数
%Idx: N*1的向量,存储的是每个点的聚类标号
%C: K*P的矩阵,存储的是K个聚类质心位置
%sumD: 1*K的和向量,存储的是类间所有点与该类质心点距离之和
%D: N*K的矩阵,存储的是每个点与所有质心的距离

%'dist’(距离测度)
%'sqEuclidean' 欧式距离(默认时,采用此距离方式)
%'cityblock' 绝度误差和,又称:L1
%'cosine' 针对向量
%'correlation'  针对有时序关系的值
%'Hamming' 只针对二进制数据

%'Start'(初始质心位置选择方法)
%'sample' 从X中随机选取K个质心点
%'uniform' 根据X的分布范围均匀的随机生成K个质心

%kmeans函数详情请edit调出函数文件查看

%绘制散点图
gscatter(data(:,1),data(:,2),Idx)

KNN分类算法

邻近算法,或者说K最近邻(KNN,K-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是K个最近的邻居的意思,说的是每个样本都可以用它最接近的K个邻近值来代表。近邻算法就是将数据集合中每一个记录进行分类的方法

%在Matlab中利用kNN进行最近邻查询
X=[0.5.*rand(50,1);0.3+0.5.*rand(50,1)];%产生X
Y=[0.5.*rand(50,1);0.3+0.5.*rand(50,1)];%产生Y
Z=[ones(50,1);2.*ones(50,1)];%产生类别
figure
gscatter(X,Y,Z)  %点图,颜色根据Z中类别区分
legend('Location','best')  %自动生成图列
newpoint = [0.8*rand 0.8*rand];  %待分类的点
line(newpoint(1),newpoint(2),'marker','x','color','k','markersize',10,'linewidth',2)  %绘制待分类的点
Mdl = KDTreeSearcher([X,Y])  ;%创建K树,默认采用欧式距离
%也可以替换距离公式,例如
%Mdl.Distance='cityblock' 曼哈顿距离
%Mdl.Distance='chebychev' 契比雪夫距离
%Mdl.Distance='minkowski' 闵可夫斯基距离
K=10; %邻近点数
[n,d] = knnsearch(Mdl,newpoint,'k',K);  %执行KNN(K近邻)搜索,n返回这K个点的编号,d返回的是距离
line(X(n,1),Y(n,1),'color',[.5 .5 .5],'marker','o','linestyle','none','markersize',10) %绘制周围K个邻近点
tabulate(Z(n));%统计K个邻近点中各类别点的比例,该点归为比例高的一类

PCA图像压缩
缺失数据预测问题(粒子滤波算法)

DBSCAN(Density-Based Spatial Clustering of Applications with
Noise,具有噪声的基于密度的聚类方法)是一种很典型的密度聚类算法,和K-Means,BIRCH这些一般只适用于凸样本集的聚类相比,DBSCAN既可以适用于凸样本集,也可以适用于非凸样本集。

组合评价模型—模糊Borda
BP神经网络
熵权法

clc,clear;
X=[124.3000    2.4200   25.9800   19.0000    3.1000   79.0000   54.1000    6.1400    3.5700   64.0000
  134.7000    2.5000   21.0000   19.2500    3.3400   84.0000   53.7000    6.7400    3.5500   64.9600
  193.3000    2.5600   29.2600   19.3100    3.4500   92.0000   54.0000    7.1800    3.4000   65.6500
  118.6000    2.5200   31.1900   19.3600    3.5700  105.0000   53.9000    8.2000    3.2700   67.0100
   94.9000    2.6000   28.5600   19.4500    3.3900  108.0000   53.6000    8.3400    3.2000   65.3400
  123.8000    2.6500   28.1200   19.6200    3.5800  108.0000   53.3000    8.5100    3.1000   66.9900];
[n,m]=size(X);
for i=1:n
    for j=1:m
        p(i,j)=X(i,j)/sum(X(:,j));
    end
end
%% 计算第 j 个指标的熵值 e(j)
k=1/log(n);
for j=1:m
    e(j)=-k*sum(p(:,j).*log(p(:,j)));
end
d=ones(1,m)-e; % 计算信息熵冗余度
w=d./sum(d) % 求权值 w

层次聚类
LOF异常数据点检测算法
Pearson相关系数,Kendall相关系数和Spearman相关系数
GRNN神经网络
广义回归神经网络general regression neural network(GRNN)
概率神经网络(Probabilistic Neural Network)
秩和比综合评价法

  • 9
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值