Вывод кривой из точек данных - PullRequest
2 голосов
/ 21 февраля 2011

Я вручную настраиваю счетчик потоков:

if (items.Count == 0) { threads = 0; }
else if (items.Count < 1 * hundred) { threads = 1; }
else if (items.Count < 3 * hundred) { threads = 2; }
else if (items.Count < 5 * hundred) { threads = 4; }
else if (items.Count < 10 * hundred) { threads = 8; }
else if (items.Count < 20 * hundred) { threads = 11; }
else if (items.Count < 30 * hundred) { threads = 15; }
else if (items.Count < 50 * hundred) { threads = 30; }
else threads = 40;

Мне нужна функция, которая возвращает необходимый / оптимизированный счетчик потоков.

Хорошо, теперь забудьте выше.Мне нужна кривая графика для построения графика.Я даю координаты, функция строит кривую.Представьте себе точку (0,0) и точку (5,5) -в (х, у) форме.Это должна быть прямая линия.Тогда я могу измерить x для y = 3.

Что произойдет, если я поставлю баллы (0,0), (2,3), (8,10), (15,30) и (30, 50).Это будет изогнутая вещь.Теперь я могу вычислить x для данного y или наоборот?

Я думаю, вы поняли идею.Должен ли я использовать MathLab или это может быть сделано в C #?

Ответы [ 3 ]

3 голосов
/ 21 февраля 2011

Вы ищете подбор кривой или вывод функции, описывающей кривую, из набора точек данных. Если вы хотите сделать это один раз из постоянного набора данных, Matlab отлично справится с этой задачей. Если вы хотите сделать это динамически, есть библиотеки и алгоритмы.

Просмотрите статью в Википедии о линейной регрессии . Подход наименьших квадратов , упомянутый в этой статье, довольно распространен. Посмотрите вокруг, и вы найдете библиотек и примеров кода , использующих этот подход.

1 голос
/ 21 февраля 2011

Вы можете использовать линейную регрессию;вы получите что-то вроде этого:

linear regression

Так что я бы, вероятно, закодировал бы его в C # следующим образом:

int threads = (int) Math.Ceiling(0.0056*items.Count + 0.5);

Я использовал Math.Ceiling, чтобы убедиться, чтовы не получите 0, когда вход не равен 0. Конечно, эта функция дает вам 1, даже если вход равен 0;если это имеет значение, вы всегда можете отловить это как особый случай или использовать вместо него Math.Round.

Однако это означает, что количество потоков будет увеличиваться непрерывно.Он не выровняется на уровне 40. Если это то, что вы хотите, вам, возможно, придется исследовать различные виды регрессии.

1 голос
/ 21 февраля 2011

Вы, вероятно, можете сделать это быстрее, переупорядочив тесты (и используя вложенный if). Но это не гладкая функция, вряд ли будет более простое описание.

Или вы пытаетесь найти гладкую функцию, которая проходит вблизи этих точек?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...