算法集锦
决策树-划分点
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) 秩和比综合评价法
|