Я не уверен, что не так с моим кодом .. (линейная / полиномиальная регрессия) - PullRequest
0 голосов
/ 24 апреля 2020

У меня есть набор данных (CSV-файл) с тремя отдельными столбцами. Столбец 0 - это время сигнала, столбец 1 - частота, а столбец 2 - интенсивность. В данных много шума, который можно отсортировать, найдя дисперсию частоты каждого сигнала. Если это <2332, то это правильная частота. Следовательно, это были бы данные, по которым я хотел бы рассчитать линейную / поли-регрессию. ps Мне нужно * * * * * * * * * * * * c: вручную. Вложенная для l oop структура решения, которая у меня сейчас не работает. Любые решения будут полезны! спасибо </p>

data = csv.reader(file1)
sort = sorted(data, key=(operator.itemgetter(1))) #sorted by the frequencies
for row in sort:
x.append(float(row[0]))
y.append(float(row[2]))
frequencies.append(float(row[1]))

for i in range(499) : 
freq_dict.update({ frequencies[i] : [x[i], y[i]] })

for key in freq_dict.items(): 
   for row in sort : 
       if key == float(row[1]):
           a.append(float(row[1]))
           b.append(float(row[2]))
           c.append(float(row[0]))
       else :
           num = np.var(a)
           if num < 2332.0: 
               linearRegression(c, b, linear)
               print('yo')
               polyRegression(c, b, d, linear, py)
               mplot.plot(linear, py)
           else: 
               a = [] 
               b = [] 
               c = []

дисперсия 2332 или меньше нужны мне частоты

2332 или меньше нужны частоты

Я использовал диапазон 499, потому что это длина моего набора данных. Также я попытался очистить списки (a, b, c), если частота была неправильной.

Ответы [ 2 ]

0 голосов
/ 26 апреля 2020

Более похожим решением было использование corrcoef из списка. Но в похожем стиле это было так:

for key, value in freq_dict.items(): #1487
for row in sort:   #when row -> goes to a new freq it calculates corrcoef of an empty list.
    if key == float(row[1]): #1487
        a.append(float(row[2]))
        b.append(float(row[0])) 
    elif key != float(row[1]): 
        if a: 
            num = np.corrcoef(b, a)[0,1]
            if (num < somenumber).any(): 
                do stuff
        a = [] #clear the lists and reset number
        b = [] 
        num = 0
0 голосов
/ 24 апреля 2020

Я вижу, что происходит несколько проблем. Я не уверен, почему вы сортируете свои данные, если вы все знаете точные значения, которые вы ищете. Я не уверен, почему вы также разделили данные на отдельные переменные. Двойные циклы «for» означают, что вы повторяете все в «sort» для каждого отдельного ключа в freq_dict. Не уверен, что вы хотели повторить все эти значения несколько раз. Кроме того, freq_dict.items () создает кортежи (ключ, пары значений), поэтому ваш «ключ» является кортежем, поэтому «ключ» никогда не будет равняться float. Во всяком случае, здесь есть попытка переписать некоторый код.

import csv, numpy
import matplotlib.pyplot as plt
from scipy import stats

data   = csv.reader(file1)                    #Read file. 
f_data = filter(lambda (x,f,y):f<2332.0,data) #Filter data to condition. 
x,_,y  = list(zip(*f_data))                   #Split data down column. 

#Standard linear stats function. 
slope,intercept,r_value,p_value,std_err = stats.linregress(x,y)

#Plot the data and the fit line. 
plt.scatter(x,y)
plt.plot(x,numpy.array(x)*slope+intercept)
plt.show()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...