控制Matlab中随机函数顺序的种子

seed that controls the order of a random function in Matlab

我使用 Matlab kmeans 函数对两个数据集进行聚类:data1 和 data2。 我有三个主要文件,分别包含以下代码,

result1 = kmeans(data1, 4);
result2 = kmeans(data2, 4);

r1 = kmeans(data1,4);

r2 = kmeans(data2,4);

我注意到 result1 和 r1 是一样的,但是 result2 和 r2 略有不同。我相信这是由 kmeans 算法中的随机性引起的。在第一个和第二个文件中,data1 首先执行,因此 kmeans 使用相同的 "seed"。在第一个和第三个文件中,data2 在不同的阶段执行。用于 result1 的 kmeans 对以下 kmeans 有影响。

我的问题是:我们能否以某种方式设置种子,使 r2 和 result2 相同?

您可以使用 rng 函数在 MATLAB 中控制随机数生成。使用它,您可以在 运行 编写代码之前捕获随机数生成器的状态,然后将随机数生成器设置回您再次 运行 之前的状态,确保获得相同的结果。例如:

rngState1 = rng;  % Capture state before processing data1
result1 = kmeans(data1, 4);
rngState2 = rng;  % Capture state before processing data2
result2 = kmeans(data2, 4);

...

rng(rngState1);  % Restore state previously used for processing data1
r1 = kmeans(data1,4);

...

rng(rngState2);  % Restore state previously used for processing data2
r2 = kmeans(data2,4);

由于您在单独的文件中处理数据,这可能意味着 saving and loading 状态变量进出 MAT 文件以执行我上面概述的操作。另一种选择是在处理每个数据集之前将种子设置为给定值:

rng(1);  % Set seed to 1 for data1
result1 = kmeans(data1, 4);
rng(2);  % Set seed to 2 for data2
result2 = kmeans(data2, 4);

...

rng(1);
r1 = kmeans(data1,4);

...

rng(2);
r2 = kmeans(data2,4);

另一种选择是使用非随机初始化:

start = data1(1:4,:); % This is not necessarily a good initialization!
result1 = kmeans(data1, 4, 'Start',start);

不要复制粘贴上面的代码,它只是为了说明目的。但是您可能有一个很好的策略来非随机地初始化您的方法,这取决于您的数据如何做到这一点。例如,对于矩形域内的二维数据,您可以 select 域的四个角。