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