Как я могу использовать scipy.optimize, чтобы минимизировать набор функций? - PullRequest
1 голос
/ 05 января 2012

[ EDIT : Метод fmin () - хороший выбор для моей проблемы.Однако моя проблема заключалась в том, что одна из осей была суммой других осей.Я не пересчитывал ось Y после применения множителя.Таким образом, значение, возвращаемое моей функцией оптимизации, всегда возвращало одно и то же значение.Это не дало fmin никакого направления, поэтому выбранные множители были очень близки друг к другу.Как только вычисления в моей функции оптимизации были исправлены, fmin выбрал больший диапазон.]

У меня есть два набора данных, к которым я хочу применить мультипликаторы, чтобы посмотреть, какие значения могут «улучшить» их коэффициенты корреляции.

Например, скажем, набор данных 1 имеет коэффициент корреляции -6, а набор данных 2 имеет .5.

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

Я написал целевую функцию, которая принимает список множителей, применяет их к наборам данных, вычисляет коэффициент корреляции (scipy.stats.spearmanr ()) и суммирует эти коэффициенты.Поэтому мне нужно использовать что-то из scipy.optimize, чтобы передать набор множителей этой функции и найти набор, который оптимизирует эту сумму.

Я пытался использовать optimize.fmin и несколько других.Однако я хочу, чтобы в технике оптимизации использовался гораздо больший диапазон множителей.Например, мои наборы данных могут иметь значения в миллионах, но fmin будет выбирать множители только около 1,0, 1,05 и т. Д. Это недостаточно большое значение, чтобы каким-либо образом изменить эти коэффициенты корреляции.

Вот пример кода моей целевой функции:

def objective_func(multipliers):
    for multiplier in multipliers:
        for data_set in data_sets():
            x_vals = getDataSetXValues()
            y_vals = getDataSetYValues()
            xvals *= muliplier
            coeffs.append(scipy.stats.spearmanr(x_vals, y_vals)

    return -1 * sum(coeffs)

Я использую -1, потому что я на самом деле хочу самое большое значение, но fmin для минимизации.

Вот примеркак я пытаюсь использовать fmin:

print optimize.fmin(objective_func)

Множители начинаются с 1,0 и находятся в диапазоне от 1,05 до 1,0625 и т. д. Я могу видеть в реальном коде fmin, где эти значения выбраны.В конечном итоге мне нужен еще один метод для вызова, чтобы дать минимизации диапазон значений для проверки, не все они так тесно связаны.

Ответы [ 2 ]

1 голос
/ 05 января 2012

Умножение данных x на некоторый коэффициент на самом деле не изменит коэффициента корреляции ранга Спирмена.

>>> x = numpy.random.uniform(-10,10,size=(20))
>>> y = numpy.random.uniform(-10,10,size=(20))
>>> scipy.stats.spearmanr(x,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*10,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*1e6,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*1e-16,y)
    (-0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*(-2),y)
    (0.24661654135338346, 0.29455199407204263)
>>> scipy.stats.spearmanr(x*(-2e6),y)
    (0.24661654135338346, 0.29455199407204263)

(Второе слагаемое в кортеже - это значение p).

Вы можете изменить его знак, если перевернете знаки терминов, но весь смысл корреляции Спирмена заключается в том, что он сообщает вам степень, до которой любое монотонное отношение могло бы захватить ассоциацию.Вероятно, это объясняет, почему fmin не сильно меняет множитель: он не получает никакой обратной связи по направлению, потому что возвращаемое значение является постоянным.

Так что я не понимаю, как то, что вы пытаетесь сделать, может работать.

Я также не уверен, почему вы выбрали сумму всех коэффициентов Спирмена и значения p как то, что вы пытаетесь максимизировать: коэффициенты Спирмена могут быть отрицательными, так что вы, вероятно, захотитевозвести их в квадрат, а вы не упомянули значения p, поэтому я не уверен, почему вы их добавляете.

[Возможно, я предполагаю, что мы работаем с разными версиями scipy и нашимиФункции spearmanr возвращают разные вещи.У меня 0.9.0.]

0 голосов
/ 05 января 2012

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

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