Приближение для поиска значения с использованием Python

Итак, у меня есть один вектор альфы, один вектор беты, и я пытаюсь найти тета, когда сумма всех оценок (для альфы от i до n и бета от i до n) равна 60.

math.exp(alpha[i] * (theta - beta[i])) / (1 + math.exp(alpha[i] * (theta - beta[i])

введите здесь описание изображения

По сути, я начал с тета = 0,0001 и перебирал, вычисляя все эти суммы, и когда он меньше 60, продолжал, добавляя 0,0001 каждый раз, в то время как выше 60 означает.

Я нашел значение тета таким образом. Проблема в том, что мне потребовалось около 60 секунд, используя Python, чтобы найти тета 0,456.

Как быстрее найти эту тета (поскольку я хотел бы применить это для других данных)?

def CalcTheta(score, alpha, beta):
    theta = 0.0001
    estimate = [score-1]

    while(sum(estimate) < score):

        theta += 0.00001

        for x in range(len(beta)):
            if x == 0:
                estimate = []

            estimate.append(math.exp(alpha[x] * (theta - beta[x]))  / (1 +  math.exp(alpha[x] * (theta - beta[x]))))

    return(theta)

person PascalVKooten    schedule 18.03.2013    source источник
comment
Обратите внимание, что i в формуле указывает i-е значение в векторе альфа и векторе бета.   -  person PascalVKooten    schedule 18.03.2013
comment
Хотя я считаю, что для этих конкретных альфа- и бета-версий есть только одно решение.   -  person PascalVKooten    schedule 18.03.2013
comment
Это тоже неправда. Попробуйте вывести некоторые результаты для случайных альфа- и бета-версий и посмотрите: pastebin.ca/2335176   -  person YXD    schedule 18.03.2013
comment
Альфа и бета не случайны?   -  person PascalVKooten    schedule 18.03.2013
comment
Альфа все положительные или все отрицательные?   -  person YXD    schedule 18.03.2013
comment
Альфа - положительные целые числа, бета - положительные/отрицательные с десятичными знаками.   -  person PascalVKooten    schedule 18.03.2013


Ответы (1)


Вы можете использовать zip и sum для вычисления целевой функции:

  def f(theta):
    return sum(1/(1 + exp(a*(b-theta)))) for a,b in zip(alpha, beta))
person xuanji    schedule 18.03.2013
comment
На самом деле понятия не имею, как с этим бороться. Выдает ошибку for. Должно ли это работать на python 3.3? - person PascalVKooten; 18.03.2013
comment
Добавлены круглые скобки, затем работает на Python 3.3. Тем не менее я не понимаю, зачем использовать это? - person PascalVKooten; 18.03.2013
comment
Почему это не работает: return(sum(math.exp(a * (theta - b)) / (1 + math.exp(a * (b- theta))) for a,b in zip(alpha[questions], beta[questions]))), где questions — список чисел. - person PascalVKooten; 19.03.2013