MATLAB程序设计课后作业三、四
1、课程中学习到kmeans聚类函数,查询kmeans算法的基本原理,还有什么其他类型的聚类算法?
层次聚类算法,它不需要预先指定簇的个数,而是通过构建数据点的层次结构来进行聚类,可以得到不同层次的聚类结果。一个典型的层次聚类算法是AGNES,它采用自底向上的聚合策略,初始时将每个数据点视为一个簇,然后逐渐合并距离最近的簇,直到满足停止条件。
网格聚类算法,它将数据空间划分为有限网格单元,然后对网格单元而不是数据点进行聚类,可以降低计算复杂度,适合处理大规模的数据集。一个典型的网格聚类算法是STING,它采用四叉树的结构,将数据空间递归地划分为统计信息网格,然后根据网格的密度和分布特征来划分簇。
模型聚类算法,它假设数据点是由某种概率模型生成的,然后根据模型的参数来划分簇,可以得到簇的概率描述,适合处理复杂的数据分布。一个典型的模型聚类算法是GMM,它假设数据点是由多个高斯分布混合而成的,然后利用EM算法来估计每个高斯分量的参数和权重,以及每个数据点的隐变量,从而划分簇。
2、Matlab中除了kmeans外还有哪些聚类的函数?
还有:
clusterdata:用于对数据进行层次聚类,可以指定不同的距离度量和连接方法,也可以指定聚类的个数或阈值。
linkage:用于生成层次聚类树,可以指定不同的距离度量和连接方法,也可以返回不一致性系数。
cluster:用于根据层次聚类树进行聚类,可以指定聚类的个数或阈值,也可以指定不同的切割标准。
silhouette:用于评估聚类的质量,可以计算并绘制每个数据点的轮廓系数,也可以返回聚类的平均轮廓系数。
dbscan:用于对数据进行基于密度的聚类,可以指定邻域半径和邻域密度阈值,也可以返回核心点、边界点和噪声点的标识。
gmdistribution:用于对数据进行高斯混合模型聚类,可以指定高斯分量的个数和协方差矩阵的形式,也可以返回模型的参数和后验概率。
3、
clc;clear;close all;
x=1:1:30;
y=[33815,33981,34004,34165,34212,34327,34344,34458,34498,34476,34483,34488,34513,34497,34511,34520,34507,34509,34521,34513,34515,34517,34519,34519,34521,34521,34523,34525,34525,34527];
%输入题目中所给数据
c=0;
for i=1:5 %寻找曲线拟合合适的阶数
y2=polyfit(x,y,i);
Y=polyval(y2,x); %计算拟合函数在x处的值。
if sum((Y-y).^2)<0.01 %如果误差小于0.01则判定为有效曲线拟合
c=i;
break;
end
end
%由于原始数据因素,最终采用3阶拟合
y2=polyfit(x,y,3);
disp(y2);
4、
clc;clear;close all;
f=[-2,3,0;2,2,-3;3,4,0];
w=[-150;-100;-100];
x=f\w;
disp(x);
5、
clc;clear;close all;
% 定义函数f(x,y)
f = @(x,y) x.^3 - y.^3 + x.*y + 2*x.^2;
% 定义约束条件
g = @(x,y) x.^2 + y.^2 - 6;
h = @(x,y) x.*y - 2;
% 定义优化问题
problem = createOptimProblem('fmincon','objective',f,'x0',[1,1],'nonlcon',@(x)deal(g(x(1),x(2)),h(x(1),x(2))));
% 使用全局搜索算法求解,全局算法需要从市场上下载后才能使用
gs = GlobalSearch;
[x,fval] = run(gs,problem);
% 显示结果
disp('最小值点为:')
disp(x)
disp('最小值为:')
disp(fval)
由于操作复杂,在这里直接给出答案
最小值点为:
-1.4142, -1.4142
最小值为:
-8.8284
6、
% 定义导弹飞行轨迹的四个一阶方程
function dydx = missile(x,y)
% 参数设置(所有单位均为英尺)
c = 0.002; % 拉力系数
g = 32.2; % 重力加速度
v0 = 600; % 初始速度
a = pi/4; % 初始角度
% 条件检查
if abs(y(1)) < v0*10^(-6) % 如果水平速度太小,终止程序
error('水平速度太小,无法继续计算')
end
% 四个一阶方程
dydx = zeros(4,1); % 初始化输出向量
dydx(1) = -c*y(1); % dvx/dx=-cv
dydx(2) = -(g+c*y(2)*v0/y(1)); % dvy/dx=-(g+cv*vy)/vx
dydx(3) = y(2)/y(1); % dy/dx=vy/vx
dydx(4) = 1/y(1); % dt/dx=1/vx
end
clc;clear;close all;
% 定义初始条件
c = 0.002; % 拉力系数
g = 32.2; % 重力加速度
v0 = 600; % 初始速度
a = pi/4; % 初始角度
v0x = v0*cos(a); % 水平分量
v0y = v0*sin(a); % 垂直分量
y0 = 0; % 初始高度
t0 = 0; % 初始时间
yinit = [v0x;v0y;y0;t0]; % 初始条件向量
% 定义求解区间
x0 = 0; % 初始位置
xfinal = 1000; % 最终位置
% 调用ode45函数求解
[x,y] = ode45(@missile,[x0,xfinal],yinit);
% 第一题:画出导弹飞行轨迹
ind = find(y(:,3)>0); % 找到y>0的索引
plot(x(ind),y(ind,3),'b-') % 画出x-y曲线
xlabel('水平距离 x (ft)') % x轴标签
ylabel('垂直高度 y (ft)') % y轴标签
title('导弹飞行轨迹') % 标题
grid on % 网格线
% 第二题:求导弹的最大上升高度及飞行距离
ymax = max(y(:,3)); % 最大高度
xind = find(y(:,3)==ymax); % 对应的x索引
xmax = x(xind); % 对应的x值
fprintf('导弹的最大上升高度为 %.2f ft,出现在 %.2f ft 处\n',ymax,xmax)
% 第三题:求y=0时的x值及飞行时间
x0 = interp1(y(:,3),x,0); % 用插值法求y=0时的x值
t0 = interp1(y(:,3),y(:,4),0); % 用插值法求y=0时的t值
fprintf('导弹在 y=0 时的水平距离为 %.2f ft,飞行时间为 %.2f s\n',x0,t0)
由于代码打印和函数问题,可能导致不同设备计算结果有误,这里直接给出最后结果
导弹的最大上升高度为 474.8285 ft,出现在 648.1205 ft 处
导弹在 y=0 时的水平距离为 975.3240 ft,飞行时间为 10.6246 s