对表格相似行按相似度聚类排序的适用算法是什么?
如何实现表格行按相似度相邻排序?
假设我们有一个包含两列的表格,表格内存储了相关数据,我们的目标是对该表格的行进行排序。
假设我们的数据如下所示,其中y1和y2是列中的数据。
你可以使用MATLAB或GNU Octave生成上述图表:
% 模型仿真 [t,y] = ode45(@odefunc,[0 20],[1; -2]); % 绘制仿真结果 close all plot(t,y(:,1),'-r',t,y(:,2),'-b') title('使用ODE45求解范德波尔方程(\mu = 1)的结果'); xlabel('时间 t'); ylabel('解 y'); legend('y_1','y_2') grid on function dydt = odefunc(t,y) dydt = [y(2); (1-0.1*y(1)^2)*y(2)-y(1) + 1]; end
如果从上方观察该图表,数据会呈现如下形态:
你可以使用如下代码生成该图表:
% 绘制3D柱状图 figure imagesc(y) colorbar
可以看到该图表的形态非常接近“表格样式”。我的问题是:对表格行进行排序时,应该使用什么算法,才能让高度相似的行排列在相邻位置,同时所有行都拥有唯一的排序位置?
举个例子,假设我们有如下表格:
0 2 4 1 3 5 2 4 6 3 5 7 4 6 8 5 7 9 0 2 4 1 3 5 2 4 6 3 5 7 4 6 8 5 7 9 0 2 4 1 3 5 2 4 6 3 5 7 4 6 8 5 7 9 0 2 4 1 3 5
生成该表格的代码如下:
j = 0; rows = 20; for i = 1:rows disp(sprintf("%i %i %i", j, j+2, j+4)) j = j + 1; if(j + 4 >= 10) j = 0; end end
可以看到表格中有4行0 2 4、3行5 7 9。我希望所有0 2 4的行相邻排列,所有5 7 9的行相邻排列,且0 2 4不能排在5 7 9之后,否则生成的可视化效果会很差。
例如,我们从第一行row 1也就是0 2 4开始排序,先找出所有4行0 2 4排列在一起:
0 2 4 0 2 4 0 2 4 0 2 4
接下来处理下一类行1 3 5,找到2行后相邻排列:
0 2 4 0 2 4 0 2 4 0 2 4 1 3 5 1 3 5
排序一段时间后,我们会得到如下格式的表格:
0 2 4 0 2 4 0 2 4 0 2 4 1 3 5 1 3 5 2 4 6 2 4 6 2 4 6 2 4 6 3 5 7 3 5 7 3 5 7 . . . . 5 7 9 5 7 9 5 7 9
如果此时出现一行1 2 4,它和0 2 4相似度很高,我们需要将1 2 4排在0 2 4附近,比如0 2 4和1 3 5之间、0 2 4之前或之后都可以。但我怎么判断1 2 4应该排在0 2 4附近?这就是核心问题!
我要怎么实现这种排序?
由于速度要求很高,最终需要用C语言实现,我打算先在GNU Octave中做原型验证,我猜测这类需求有对应的SQL排序算法可以参考。
注意:实际应用场景中的数据都是10位整数,取值范围为0-1023。
内容的提问来源于stack exchange,提问作者euraad
相关产品推荐
相关产品推荐

