Как мне разделить на изменение в списке Y? - PullRequest
1 голос
/ 02 марта 2020

Решением этой проблемы является решение дельты y, см. Основание вопроса в ** **

Я пишу код для многих различных уравнений для линейной регрессии. У меня есть два списка со значениями х и у. Одно из моих уравнений создает новый список w. Уравнение для списка w имеет вид (w = 1 / Δy ^ 2), где y - список. Я использовал уравнения, которые раньше требовали списков, но никогда не меняли их в списке.

У меня есть w = [ 1/(deltay)**2 in zip(x,y)] Но когда я печатаю, я получаю w [False]. Так что я не думаю, что делаю дельта-часть правильно, но понятия не имею.

Каждая точка данных в списке должна иметь неопределенность 5%. Сейчас меня интересует только w и неопределенность в y. Эта функция w нужна для чего-то другого.

В итоге, как я могу закодировать уравнение (w = 1 / Δy ^ 2), где delta y - это список, а w - это список, спасибо.

** Хорошо, я сделал несколько прогресс. Я думаю, что я знаю, как решить это сейчас. У меня есть список значений у. Неопределенность в каждом значении y составляет 5%. Таким образом, мне нужен новый список рассылки, который является старым списком y с периодом 0,05. Поэтому я пишу это deltay = [(i*0.05) for i in zip(y)] Но я получаю ошибку TypeError: невозможно умножить последовательность на не-int типа 'float' **

Ответы [ 3 ]

1 голос
/ 02 марта 2020

В принципе, вы хотите иметь итератор над скользящим окном. Уже есть несколько хороших сообщений по этому вопросу, доступных здесь (Итератор скользящего или скользящего окна?) .

Мы будем использовать предложенный подход Даниэля ДиПаоло:

from itertools import islice

def window(seq, n=2):
    "Returns a sliding window (of width n) over data from the iterable"
    "   s -> (s0,s1,...s[n-1]), (s1,s2,...,sn), ...                   "
    it = iter(seq)
    result = tuple(islice(it, n))
    if len(result) == n:
        yield result
    for elem in it:
        result = result[1:] + (elem,)
        yield result

Теперь получить изменения легко:

xs = [1, 3, 4, 7, 10, 14]
ys = [3, 1, 2, 9, 13, -1]

# if you need the slope
w = [1/d**2 
     for d in 
         map(lambda pnts: (pnts[1][1]-pnts[0][1])/(pnts[1][0]-pnts[0][0]),  
             window(zip(xs, ys), 2))
    ]

# if you just need the change in y
w = [1/d**2 
     for d in 
         map(lambda y: y[1] - y[0], window(ys, 2))
    ]

Чтобы ответить на ваши изменения:

Хорошо, я добился определенного прогресса. Я думаю, что я знаю, как решить это сейчас. У меня есть список значений у. Неопределенность в каждом значении y составляет 5%. Таким образом, мне нужен новый список рассылки, который является старым списком y с периодом 0,05. Поэтому я пишу этот deltay = [(i * 0.05) для i в zip (y)] Но я получаю ошибку TypeError: невозможно умножить последовательность на не-int типа 'float' **

Вы должны использовать [(i*0.05) for i in y]. Если вы используете zip(y), все записи, по которым вы перебираете, будут кортежами.

1 голос
/ 02 марта 2020

Я полагаю, что ваша переменная deltay является numpy .array , иначе ваш код вызовет исключение, поэтому, поскольку вы используете numpy .array, вы можете использовать поэлементные операции :

w =  1 / deltay ** 2

если ваш deltay это не numpy .array (как показывает ваше последнее обновление), вы можете использовать списочный анализ для вычисления w:

deltay = [ i * 0.05 for i in y]
w = [1/x**2 for x in deltay]
0 голосов
/ 02 марта 2020

Учитывая y - это список, который вы упомянули в вопросе. Вы можете попробовать,

import numpy as np

deltay = np.diff(y)
w =  1 / (deltay**2)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...