【Matlab】模式识别——聚类算法集锦

文章目录

  • 0.聚类分析简介
    • 0.1.简单的聚类样本生成器
  • 1.静态聚类算法
    • 1.1.最近邻聚类算法
      • 1.1.1.算法原理
      • 1.1.2.参考代码
      • 1.1.3.参数选择及运行结果
    • 1.2.最大最小距离法
      • 1.2.1.算法原理
      • 1.2.2.参考代码
      • 1.2.3.参数选择及运行结果
  • 2.动态聚类算法
    • 2.1.C均值聚类算法
      • 2.1.1.算法原理
      • 2.1.2.参考代码
      • 2.1.3.运行效果
    • 2.2.不需要类别参数的C均值聚类算法
      • 2.2.1.算法原理
      • 2.2.2.参考代码
      • 2.2.3.运行结果

0.聚类分析简介

\qquad模式识别有两个重要的分支——分类算法和聚类算法。分类算法依赖于已知类别的样本,对未知的样本进行分类,是一种监督学习的算法;聚类算法是利用样本的分布特征,将样本按照一定规则划分为几个聚类,从而达到分类的目的,是一种非监督学习算法(有些聚类算法并不是完全的非监督),本文介绍的就是聚类算法。

0.1.简单的聚类样本生成器

\qquad在实现我们的聚类算法之前,我们需要生成我们需要的样本,聚类算法不像分类算法一样有线性可分与非线性可分的区分,但生成的样本适不适合做聚类算法,也和类别与类别直接的聚类中心以及聚类域半径有关。
\qquad我们的思路是先确定类别数和每个类别的聚类中心坐标、聚类域最大半径。然后在聚类中心周围随机生成样本,最后将所有样本的顺序打乱,就可以作为我们聚类算法的样本了。
\qquad本人书写的一个参考程序如下:(目前只支持2维样本)

n=input('请输入需要生成的类别数n:\n');%样本类别
N=input('请输入每个类别样本数组成的行矩阵N:\n');%每个类别的样本数
if numel(N)~=nerror('矩阵N维度必须等于类别数n!:\n')
end
C=input('请输入各类的聚类中心(按行输入)矩阵C:\n');%x为样本中心矩阵,每列为一个聚类中心
if size(C,1)~=nerror('C矩阵格式错误!')
end
R=input('请输入每类样本的最大半径行矩阵R:\n');
if numel(R)~=nerror('矩阵R维度必须等于类别数n!')
end
X=zeros(sum(N),2);%样本总矩阵
k=1;
for i=1:nr=R(i)*rand(N(i),1);theta=2*pi*rand(N(i),1);X(k:k+N(i)-1,:)=[C(i,1)*ones(N(i),1)+r.*cos(theta),C(i,2)*ones(N(i),1)+r.*sin(theta)];k=k+N(i);
end
plot(X(:,1),X(:,2),'*')

以下是一个生成案例:
MATLAB代码
生成的样本如下图所示:
聚类生成器
\qquad可以发现,随机分布的样本具有一定的规律性,第一类和第三类的半径差不多,第二类的聚类域半径较大,三个聚类的聚类中心相互之间都有足够的距离。下面我们就借助这个聚类样本生成器完成以下的实验。

1.静态聚类算法

\qquad静态聚类算法中,一个样本的归属一旦确定后,在后续的迭代过程中不再不发生变化,而动态聚类算法则会根据聚类准则函数的误差平方和最小的原则,随时调整样本的归属以达到最优。

1.1.最近邻聚类算法

1.1.1.算法原理

\qquad最近邻聚类算法又称为最小距离的聚类算法,其原理是先选定一个分类阈值,不断地抽取样本,判断它与上一个样本的距离,若小于阈值则归为一类,否则将其定义为新的聚类中心。算法步骤如下:

  1. 选定距离阈值TTT,设样本数为NNN,转第2步
  2. 将第一个样本x1x_1x1设定为第一个聚类中心C1C_1C1,样本计数器i=1i=1i=1,类别计数器m=1m=1m=1,转第3步
  3. 依次计算第i+1i+1i+1个样本xi+1x_{i+1}xi+1与前mmm个类别的聚类中心C1,C2,...,CmC_1,C_2,...,C_mC1,C2,...,Cm距离d1,d2,...,dmd_1,d_2,...,d_md1,d2,...,dm,若存在1≤j≤m1≤j≤m1jm使得dj<Td_j<Tdj<T,则将xi+1x_{i+1}xi+1归为第jjj类,否则,产生新的第m+1m+1m+1类,并将xi+1x_{i+1}xi+1定义为聚类中心Cm+1C_{m+1}Cm+1m=m+1m=m+1m=m+1。转第4步
  4. 计数器i=i+1i=i+1i=i+1,若i<Ni<Ni<N则转第3步,否则终止。

1.1.2.参考代码

参考代码如下:

function Y=nearest(X,T)
%最近邻规则聚类,Y是X样本的分类标号,T为距离阈值
n=size(X,1);
Y=ones(n,1);%分类标号
class_n=1;%类别数
x0=X(1,:);%第一个聚类中心
center=x0;%center矩阵存放聚类中心
for i=1:n-1x1=X(i+1,:);isnew=true;for j=1:class_nif normest(x1-center(j,:))<TY(i+1)=j;isnew=false;breakendendif isnewclass_n=class_n+1;%类别数+1center(size(center,1)+1,:)=x1;%新的聚类中心Y(i+1)=class_n;%归为新的一类end
end
for c=1:class_nplot(X(Y==c,1),X(Y==c,2),'*')hold on
end
title(['最近邻法-距离阈值:',num2str(T),'  分为:',num2str(class_n),'类'])

1.1.3.参数选择及运行结果

现在需要选定距离阈值的参数,我计算三个聚类中心之间的距离如下:
MATLAB代码
\qquad而样本在同类中的最大间距为6(第二类样本最大半径的2倍),选择的阈值过大会把不同类的样本划分为同一类,选择的阈值太小则会在同类样本中再进行划分,产生不必要的多余类,在这里我们需要选择一个4.3~6之间的数作为阈值,作者选择的是4.5。分类情况如下:
在这里插入图片描述
在这里插入图片描述
\qquad如果距离阈值选择的不合适,或者样本的顺序不适合使用最近邻分类法,那么可能会出现分类错误的情况。如下图所示:

距离阈值46
分类结果在这里插入图片描述在这里插入图片描述

\qquad可以发现选择的阈值过大会把不同类的样本划分为同一类,选择的阈值太小则会在同类样本中再进行划分,产生不必要的多余类。

1.2.最大最小距离法

1.2.1.算法原理

\qquad最大最小距离法除了首先辨识最远的聚类中心外,其余方法和最近法相类似,它的算法步骤如下:

  1. 给定θ\thetaθ0<θ<10<\theta<10<θ<1,任取一个样本作为第一个聚类中心C1C_1C1,转步2。
  2. 计算所有的样本到C1C_1C1的距离,并将距离最远的一个样本最为第二个聚类中心C2C_2C2,设C1,C2C_1,C_2C1,C2之间的距离为z1z2z_1z_2z1z2,类别数m=2。
  3. 计算每个样本xix_ixi到各个聚类中心的距离Di1,Di2,....,DimD_{i1},D_{i2},....,D_{im}Di1,Di2,....,Dim并取每个样本的最小距离Di=min{Di1,Di2,...,Dim}D_i=min\lbrace D_{i1},D_{i2},...,D_{im}\rbraceDi=min{Di1,Di2,...,Dim},选出每个样本最小距离中的最大值D=max{Di}D=max\lbrace D_i \rbraceD=max{Di},转步4
  4. D>θz1z2D>\theta z_1z_2D>θz1z2,则在最小距离DiD_iDi中最大的那个样本处产生新的聚类中心Cm+1C_{m+1}Cm+1m=m+1m=m+1m=m+1,转步3;若D≤θz1z2D≤\theta z_1z_2Dθz1z2,则不再产生新的聚类中心,转步5。
  5. 按照最近邻法进行分类,对于每个样本xix_ixi,它距离哪个聚类中心最近则归为哪一类。

1.2.2.参考代码

\qquad我们仍然借助我们的聚类样本生成器产生的样本进行测试,参考代码如下:

function Y=max_min(X,theta)
%最大最小规则聚类,Y是X样本的分类标号,theta为距离阈值系数
n=size(X,1);%n是样本数
class_n=2;%类别数
x0=X(1,:);%第一个聚类中心
d=@(x)(sum(abs(ones(n,1)*x-X).^2,2).^(1/2));%距离函数
[~,max_i]=max(d(x0));%求出最大距离D12并产生第2个聚类中心
x1=X(max_i,:);%第二个聚类中心
center=[x0;x1];%聚类中心矩阵更改
T=normest(x0-x1)*theta;%聚类中心产生阈值
[D,max_i]=max(min(cat(2,d(x0),d(x1)),[],2));%最大最小距离
%step1 确定聚类中心
cat_d=cat(2,d(x0),d(x1));%Di1和Di2
while D>T %聚类中心class_n=class_n+1;center(class_n,:)=X(max_i,:);cat_d=cat(2,cat_d,d(center(class_n,:)));[D,max_i]=max(min(cat_d,[],2));
end
%step2 分类
[~,Y]=min(cat_d,[],2);
for c=1:class_nplot(X(Y==c,1),X(Y==c,2),'*')hold on
end
title(['最大最小距离法-距离系数:',num2str(theta),'  分为:',num2str(class_n),'类'])

1.2.3.参数选择及运行结果

\qquad由于三类样本的聚类中心间距分别为4.2426,4.2426,5.0990,聚类域半径为2,2,3。24.2426=0.4714\frac{2}{4.2426}=0.47144.24262=0.47144.24265=0.832\frac{4.2426}{5}=0.83254.2426=0.832,所以选择的0.4714<θ<0.8320.4714<\theta<0.8320.4714<θ<0.832。如果选择的θ\thetaθ过小,可能会出现多分类的情况;反之,若θ\thetaθ选择过大,可能最终只有2类。根据最大最小距离法的算法原理我们可以知道,在选择聚类中心时,每选择一个,产生的“最大最小距离”都比之前的小。但和最近邻聚类算法相比,最大最小距离法的参数敏感性并不是特别强,在这里笔者选择的θ=0.6\theta=0.6θ=0.6
在这里插入图片描述
最大最小距离法聚类分析
为了验证这种算法的参数敏感性,我们选择多个θ\thetaθ查看效果:

θ=0.3\theta=0.3θ=0.3θ=0.4\theta=0.4θ=0.4θ=0.5\theta=0.5θ=0.5
0.2在这里插入图片描述在这里插入图片描述
θ=0.7\theta=0.7θ=0.7θ=0.75\theta=0.75θ=0.75θ=0.8\theta=0.8θ=0.8
在这里插入图片描述在这里插入图片描述在这里插入图片描述

由此可见,0.4<θ<0.750.4<\theta<0.750.4<θ<0.75均可以得到完全正确的分类结果,这就验证了我们上述的理论。

2.动态聚类算法

\qquad和静态聚类算法不同,动态聚类算法回正迭代过程中不断调整样本的归属,以满足误差平方和准则。在介绍误差平方和准则Jc=∑j=1c∑k=1Nj∣∣Xk(j)−mj∣∣2J_c=\sum_{j=1}^{c}\sum_{k=1}^{N_j}||X_k^{(j)}-m_j||^2Jc=j=1ck=1NjXk(j)mj2
\qquad式中NjN_jNj为第jjj类样本数,mjm_jmj为第jjjωj\omega_jωj的均值。Xk(j)X_k^{(j)}Xk(j)为第jjj类样本的第kkk个样本。可以看出,内部求和符号反映了同一类中样本的聚集程度,外层求和符号是对每类样本的方差求和,反映了样本整体的聚集程度。JcJ_cJc越大,聚集程度越小,反之越大。

2.1.C均值聚类算法

2.1.1.算法原理

III为迭代次数,Zj(I)Z_j(I)Zj(I)为第III次迭代的第jjj个聚类中心,XkX_kXk为第kkk个样本

  1. 首先确定需要分类的个数c,从N个样本{X1,X2,...,XN}\lbrace X_1,X_2,...,X_N\rbrace{X1,X2,...,XN}中选取c个任意样本作为初始聚类中心Z1(1),Z2(1),...,Z3(1)。Z_1(1),Z_2(1),...,Z_3(1)。Z1(1),Z2(1),...,Z3(1)
  2. 计算每个样本到聚类中心的距离D(Xk,Zj(I)),k=1,2,...,n,j=1,2,...,cD(X_k,Z_j(I)),k=1,2,...,n,j=1,2,...,cD(Xk,Zj(I)),k=1,2,...,n,j=1,2,...,c。若D(Xk(j),Zj(I))=min{D(Xk,Z1(I)),D(Xk,Z2(I)),...,D(Xk,Zc(I))},k=1,2,...,nD(X_k^{(j)},Z_j(I))=min\lbrace D(X_k,Z_1(I)) ,D(X_k,Z_2(I)) ,...,D(X_k,Z_c(I))\rbrace,k=1,2,...,nD(Xk(j),Zj(I))=min{D(Xk,Z1(I)),D(Xk,Z2(I)),...,D(Xk,Zc(I))}k=1,2,...,n,则Xk∈ωjX_k∈\omega_jXkωj。这一步就是利用最近邻法对样本进行分类
  3. 求出新的聚类中心Zj(I+1)=1Nj∑k=1NjXk(j),j=1,2,...,cZ_j(I+1)=\frac{1}{N_j}\sum_{k=1}^{N_j}X_k^{(j)},j=1,2,...,cZj(I+1)=Nj1k=1NjXk(j),j=1,2,...,c
  4. Zj(I+1)≠Zj(I),j=1,2,...,cZ_j(I+1)≠Z_j(I),j=1,2,...,cZj(I+1)=Zj(I),j=1,2,...,cI=I+1I=I+1I=I+1,返回(2),否则算法结束。
    \qquad这个算法看起来并不复杂,但是需要事先制定要分类的类别数,无法工作在完全无监督的环境下。但是,我们也可以使用最大最小距离法中产生聚类中心的方法去初始化C均值算法的类别数c和初始聚类中心。

2.1.2.参考代码

function Y=C_mean(X,c)
%Y是最终分类标号,X是样本矩阵,c是预分类类别数
n=size(X,1);%样本数
C=X(1:c,:);%聚类中心
new_C=zeros(c,2);%下一次迭代的聚类中心
d=@(x)(sum(abs(ones(n,1)*x-X).^2,2).^(1/2));%距离函数
cat_d=zeros(n,c);%距离矩阵,每行是每个样本到各个聚合中心的距离
for i=1:ccat_d(:,i)=d(C(i,:));
end
[~,Y]=min(cat_d,[],2);
for i=1:cnew_C(i,:)=mean(X(Y==i,:));%修正聚类中心
end
t=1;%迭代次数记录
while new_C~=C%标定聚类中心位置figure(t)plot(C(:,1),C(:,2),'o','MarkerSize',10,'MarkerEdgeColor','b')hold onfor i=1:cplot(X(Y==i,1),X(Y==i,2),'*')hold onendtitle(['C均值法-分类数:',num2str(c),'  迭代次数为:',num2str(t),'次'])t=t+1;%迭代次数+1C=new_C;  %更新聚类中心位置for i=1:ccat_d(:,i)=d(C(i,:));end[~,Y]=min(cat_d,[],2);for i=1:cnew_C(i,:)=mean(X(Y==i,:));%修正聚类中心end
end
figure(t)
plot(C(:,1),C(:,2),'o','MarkerSize',10,'MarkerEdgeColor','b')
hold on
for i=1:cplot(X(Y==i,1),X(Y==i,2),'*')hold on
end
title(['C均值法-分类数:',num2str(c),'  迭代次数为:',num2str(t),'次'])

\qquad注意,在【算法原理】的第一步,随机选取样本作为聚类中心,我们直接指定了样本的前3个作为3个聚类中心,随机指定当然也是可以的。

2.1.3.运行效果

C均值聚类分析1
C均值聚类分析2
C均值聚类分析3
\qquad这需要事先指定的参数只有分类数ccc,如果ccc是已知的,则C均值聚类算法则不需要任何参数,和其余静态聚类算法相比不存在参数敏感性问题。但是这也是它的缺陷之一,即必须事先指定分类数ccc

2.2.不需要类别参数的C均值聚类算法

2.2.1.算法原理

\qquad如果使用最大最小距离法事先确定ccc,则不需要事先制定类别数,但需要事先指定系数θ\thetaθ,选择θ\thetaθ的方法可以参考1.2节的最大最小距离法。在这里我们只需要模仿最大最小距离法写一个分类程序,再将初始化的聚类中心和分类数用于C均值聚类即可。

2.2.2.参考代码

function Y=C_mean(X,theta)
%% 确定类别数class_n
%Y是最终分类标号,X是样本矩阵,c是预分类类别数
n=size(X,1);%n是样本数
class_n=2;%类别数
x0=X(1,:);%第一个聚类中心
d=@(x)(sum(abs(ones(n,1)*x-X).^2,2).^(1/2));%距离函数
[~,max_i]=max(d(x0));%求出最大距离D12并产生第2个聚类中心
x1=X(max_i,:);%第二个聚类中心
C=[x0;x1];%聚类中心矩阵更改
T=normest(x0-x1)*theta;%聚类中心产生阈值
[D,max_i]=max(min(cat(2,d(x0),d(x1)),[],2));%最大最小距离
%step1 确定聚类中心
cat_d=cat(2,d(x0),d(x1));%Di1和Di2
while D>T %聚类中心class_n=class_n+1;C(class_n,:)=X(max_i,:);cat_d=cat(2,cat_d,d(C(class_n,:)));[D,max_i]=max(min(cat_d,[],2));
end
[~,Y]=min(cat_d,[],2);%最近邻分类
new_C=zeros(class_n,2);%下一次迭代的聚类中心
for i=1:class_nnew_C(i,:)=mean(X(Y==i,:));%修正聚类中心
end
t=1;%迭代次数记录
%% 在已有类别数基础上进行C均值分类
while new_C~=C%标定聚类中心位置figure(t)plot(C(:,1),C(:,2),'o','MarkerSize',10,'MarkerEdgeColor','b')hold onfor i=1:class_nplot(X(Y==i,1),X(Y==i,2),'*')hold onendtitle(['C均值法-分类数:',num2str(class_n),'  迭代次数为:',num2str(t),'次'])t=t+1;%迭代次数+1C=new_C;  %更新聚类中心位置for i=1:class_ncat_d(:,i)=d(C(i,:));end[~,Y]=min(cat_d,[],2);for i=1:class_nnew_C(i,:)=mean(X(Y==i,:));%修正聚类中心end
end
figure(t)
plot(C(:,1),C(:,2),'o','MarkerSize',10,'MarkerEdgeColor','b')
hold on
for i=1:class_nplot(X(Y==i,1),X(Y==i,2),'*')hold on
end
title(['C均值法-分类数:',num2str(class_n),'  迭代次数为:',num2str(t),'次'])

\qquad由于样本之间相隔较远,使用最大最小距离法就已经得到了正确的分类结果,C均值只是修正了一下聚类中心的位置,因此我们可以对比一下样本类之间距离较近时,单纯的最大最小距离法和最大最小距离法+C均值聚类的区别。
\qquad初始化聚类生成引擎,参数设置如下:
类别生成器
在这里插入图片描述

2.2.3.运行结果

选取θ=0.6\theta=0.6θ=0.6,运行上述代码,即可得到如下结果:

\qquad由于样本之间相隔较远,使用最大最小距离法就已经得到了正确的分类结果,C均值只是修正了一下聚类中心的位置,因此我们可以对比一下样本类之间距离较近时,单纯的最大最小距离法和最大最小距离法+C均值聚类的区别。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
\qquad单纯的最大最小距离法的分类结果就是第一幅图,而最大最小距离法+C均值聚类则可以达到图3的效果。我们定量的比较一下误差平方和函数JcJ_cJc随着迭代次数的变化:
误差平方和函数随迭代次数的变化
\qquad可以发现,单纯的最大最小距离法的JcJ_cJc有300多(即第一次的迭代结果),而最大最小距离法+C均值聚类分析的JcJ_cJc经过了3次迭代修正,JcJ_cJc已经下降至了小于100,因此后者具有更优的分类效果。
希望本文对您有帮助,感谢您的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/544470.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Ant 风格路径表达式

ANT通配符有三种&#xff1a; 通配符说明?匹配任何单字符*匹配0或者任意数量的字符**匹配0或者更多的目录例子&#xff1a; URL路径说明/app/*.x匹配(Matches)所有在app路径下的.x文件/app/p?ttern匹配(Matches) /app/pattern 和 /app/pXttern,但是不包括/app/pttern/**/exam…

java string查找_查找输出程序(Java String类)

java string查找Program 1 程序1 public class iHelp{public static void main (String[] args){System.out.println("Google".charAt(3));}}Output 输出量 gExplanation 说明 String.charAt() is a library function of String class, it returns character from…

【MATLAB】混合粒子群算法原理、代码及详解

目录1.算法1.1.原理1.2.性能比较1.3.步骤2.代码2.1.源码及注释2.2.执行与效果1.算法 1.1.原理 \qquad建议没接触过粒子群算法的朋友先看较为基础的全局粒子群算法原理及介绍&#xff0c;以下博文链接有详细的讲解、代码及其应用举例&#xff1a; 【Simulink】粒子群算法&#…

MVC HtmlHelper用法大全

HtmlHelper用来在视图中呈现 HTML 控件。 以下列表显示了当前可用的一些 HTML 帮助器。 本主题演示所列出的带有星号 (*) 的帮助器。 ActionLink - 链接到操作方法。 BeginForm * - 标记窗体的开头并链接到呈现该窗体的操作方法。 CheckBox * - 呈现复选框。 DropDownList *…

基于 MyBatis 手撸一个分表插件

背景事情是酱紫的&#xff0c;上级leader负责记录信息的业务&#xff0c;每日预估数据量是15万左右&#xff0c;所以引入sharding-jdbc做分表。上级leader完成业务的开发后&#xff0c;走了一波自测&#xff0c;git push后&#xff0c;就忙其他的事情去了。项目的框架是SpringB…

密码学哈希函数_哈希函数在密码学中的应用

密码学哈希函数A Hash Function is a mathematical function that converts a numerical value into another compressed numeric value. The input value for the hash functions can be of arbitrary length, but the output text that it will produce will always be of fi…

C语言图形化界面——含图形、按钮、鼠标、进度条等部件制作(带详细代码、讲解及注释)

目录0.引言1.素材准备2.编程2.1.创建你的界面2.2.创建按钮2.3.鼠标操作2.3.1.单击特效2.3.2.光标感应2.3.3.进度条3.完整代码及效果0.引言 \qquad看了CSDN上很多关于C程序图形化界面的介绍&#xff0c;有的代码繁琐难解&#xff0c;不方便调试修改&#xff1b;有的不够详细。本…

C#学习笔记(十三):I/O操作

C#的IO操作主要是针对文件夹和文件的读取和写入操作&#xff0c;下面我们来学习一下相关操作的类。 获取文件信息 Directory和DirectoryInfo 两个类的功能基本相同&#xff0c;区别如下&#xff1a; 前者继承System.Object,后者继承抽象类FileSystemInfo&#xff1b;前者是静态…

工作几年了,原来我只用了数据校验的皮毛

今天介绍一下 Spring Boot 如何优雅的整合JSR-303进行参数校验&#xff0c;说到参数校验可能都用过&#xff0c;但是你真的会用吗&#xff1f;网上的教程很多&#xff0c;大多是简单的介绍。什么是 JSR-303&#xff1f;JSR-303 是 JAVA EE 6 中的一项子规范&#xff0c;叫做 Be…

scala 字符串转换数组_如何在Scala中将十六进制字符串转换为字节数组?

scala 字符串转换数组Hex String in Scala denotes value in hexadecimal number system i.e. base 16 number system. Scala中的十六进制字符串表示以十六进制数表示的值&#xff0c;即以16进制数表示的系统。 Example: 例&#xff1a; hexString "32AF1"Byte Ar…

【MATLAB】无人驾驶车辆的模型预测控制技术(精简讲解和代码)【运动学轨迹规划】

文章目录<font color#19C>0.友情链接<font color#19C>1.引言<font color#19C>2.预测模型<font color#19C>3.滚动优化<font color#08CF>3.1.线性化3.2.UrU_rUr​的求取<font color#08CF>3.3.离散化与序列化<font color#08CF>3.4.实现…

顶级Javaer,常用的 14 个类库

作者&#xff1a;小姐姐味道&#xff08;微信公众号ID&#xff1a;xjjdog&#xff09;昨天下载下来Java16尝尝鲜。一看&#xff0c;好家伙&#xff0c;足足有176MB大。即使把jmc和jvisualvm给搞了出去&#xff0c;依然还是这么大&#xff0c;真的是让人震惊不已。但即使JDK足够…

单层神经网络线性回归_单层神经网络| 使用Python的线性代数

单层神经网络线性回归A neural network is a powerful tool often utilized in Machine Learning because neural networks are fundamentally very mathematical. We will use our basics of Linear Algebra and NumPy to understand the foundation of Machine Learning usin…

用express、mongodb、nodejs开发简单的登陆

原文http://my.oschina.net/chenhao901007/blog/312367 npm i -g express serve-favicon morgan cookie-parser body-parser kerberos mongoose(注意:kerberos不安装&#xff0c;mongoose会卡住)2. 调试下面讲讲如何调试服务器端的代码&#xff1a;我们最好借助一个叫node-insp…

Lua元表(Metatable)简易教程

文章目录0.友情链接1.引言2.创建一个元表2.1.__tostring方法2.2.__add和__mul方法2.3.__index方法2.4.__call方法3.完整代码0.友情链接 GitHUb上下载Lua编译器Lua菜鸟教程中的元表介绍&#xff08;较全&#xff0c;但功能性受限&#xff09;博客园内元表的介绍&#xff08;较详…

面试官:说一下 final 和 final 的 4 种用法?

作者 | 王磊来源 | Java中文社群&#xff08;ID&#xff1a;javacn666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;重要说明&#xff1a;本篇为博主《面试题精选-基础篇》系列中的一篇&#xff0c;查看系列面试文章请关注我。Gitee 开源地址…

ruby 将字符串转为数组_Ruby程序将数组打印为字符串

ruby 将字符串转为数组将数组打印为字符串 (Printing an array as string) Given an array and we have to print it as a string in Ruby. 给定一个数组&#xff0c;我们必须在Ruby中将其打印为字符串。 Ruby provides you various alternatives for the single problem. The…

超定方程组的最小二乘解

\qquad看了很多关于最小二乘解的博客&#xff0c;事实上都没有找到自己想要的证明过程&#xff0c;后来学了矩阵函数时才彻底搞明白了这件事情&#xff0c;所以和大家简单分享如下&#xff1a; \qquad已知矩阵Amn(m&#xff1e;n)A_{mn}(m&#xff1e;n)Amn​(m&#xff1e;n)是…

面试官:int和Integer有什么区别?为什么要有包装类?

作者 | 磊哥来源 | Java面试真题解析&#xff08;ID&#xff1a;aimianshi666&#xff09;转载请联系授权&#xff08;微信ID&#xff1a;GG_Stone&#xff09;重要说明&#xff1a;本篇为博主《面试题精选-基础篇》系列中的一篇&#xff0c;查看系列面试文章请关注我。Gitee 开…

shell从小做起:将100以内整除3的数列出来

#!/bin/bash for i in $(seq 1 100) do a$[ $i%3 ] #注&#xff1a; 在取余的时候 需要 运算 所以需要加运算符号 $[ ] if [ $a -eq 0 ]; thenecho "$i" fi done转载于:https://blog.51cto.com/286577399/1676501