【发布时间】:2015-05-05 09:31:08
【问题描述】:
我有以下函数(在 Matlab 中),它将计算给定一组预测和观察值的一致性指数:
function civalue = CI(predval)
% FUNCTION civalue = CI(predval)
%
% DESCRIPTION:
% - This function will calculate the concordance index. Not suitable for
% big vectors. O(n^2) time function.
%
% INPUTS:
% 'predval' a n-by-2 matrix, where the first column consists of the
% prediction values and the second column the actual label values.
%
% OUTPUT:
% 'civalue' the CI-value.
N = 0;
hSum = 0;
for i = 1:size(predval, 1)
yi_pred = predval(i, 1);
yi_val = predval(i, 2);
for j = i+1:size(predval, 1)
yj_pred = predval(j, 1);
yj_val = predval(j, 2);
if yi_val ~= yj_val
N = N + 1;
if (yi_pred < yj_pred && yi_val < yj_val) || (yi_pred > yj_pred && yi_val > yj_val) % Order correct
hSum = hSum + 1;
elseif (yi_pred < yj_pred && yi_val > yj_val) || (yi_pred > yj_pred && yi_val < yj_val) % Order opposite
hSum = hSum + 0;
elseif yi_pred == yj_pred % Random
hSum = hSum + 0.5;
end
end
end
end
civalue = hSum / N;
我的函数的时间复杂度为 O(N^2)。代码的想法是在数据点之间进行成对比较。有什么想法可以降低代码的时间复杂度吗?
CI 值或 C 指数背后的理念是衡量预测模型将数据点排列成正确顺序的能力。你给这个函数的是一组观测值 X 和它们对应的预测 Y。这个函数会对不同观测值的数据点进行排名比较,因为它们显然是有排名的。
例如,假设您对某个变量有两个观察值,例如股价:P1 = 5$, P2 = 7$
现在我们创建一个模型来尝试预测股票价格。假设我们建立了我们的模型并测试了它预测股票价格的能力,并且对于两个数据点 P1、P2,它预测了 Y1 = 5.5$ 和 Y2 = 8$ 的值。
现在您可以看到模型的 ORDER 正确,P1
感谢大家的帮助!如果您需要更多信息等,请告诉我:)
下面是我自己的实现和 Martin 的实现对比:
【问题讨论】:
-
你能定义你到底要计算什么吗,我不确定我是否熟悉 CI 值术语
-
@amit 我为 C-index 添加了一些解释,它有帮助吗?
-
predval的典型数据大小是多少? -
@Divakar 嗨,它可以有 n×2 大小的矩阵,其中 n 是任意的。在我的应用程序中,我有大小为 50×2、12000×2、1100×2 等的矩阵。但我们也有 1,000,000×2 矩阵的应用程序。我想降低时间复杂度的主要原因是因为我将这个函数调用了 M 次,即使整个一次迭代计算需要 1 秒,如果我有很多实验(大 M)并且我必须等待,它仍然非常慢几个小时......
-
如果有,您可以在开始时执行此操作 -
predval = gpuArray(predval);,然后使用我的代码。否则,Martin 在这里的回答对我来说看起来很快,可以被接受。
标签: performance algorithm matlab matrix time