Форум сайта python.su
0
Задача (неинтересная, но насущная). Из файла прочитать значения переменных Х и У, на основе имеющихся данных оценить параметры линейной регрессии (разумеется, парной
. Посчитать ковариацию, коэффициент корреляции. Вывести это добро в shall. Написано на версии 2.7.4 . В программировании опыта не имею, питоном увлекся неделю назад. Наслышан об “индийском” коде. Хотелось бы избежать сего порока
Заранее благодарю за внимание и любые советы!
Ps. What is the most common language?
Bad English 
import csv x_average, y_average, xy_average = 0, 0, 0 infile = open('data.txt','r') table = [['X','Y']] for row in csv.reader(infile): table.append(row) infile.close() for i in range(1, len(table)): for j in range(len(table[1])): table[i][j] = float(table[i][j]) import numpy as np ## colunm 0 = Xi; c1 = Yi; EXTRA: c2 = Xi*Yi, c3 = (Xi - X), c4 = Yi -Y matrix = np.zeros((len(table)-1, len(table[1])+3)) for i in range(len(table)-1): for j in range(len(table[1])): matrix[i,j] = table[i+1][j] matrix[i,2] = matrix[i,0]*matrix[i,1] ## Xi*Yi x_average += matrix[i,0] ## X cumulative sum y_average += matrix[i,1] ## Y cumulative sum xy_average += matrix[i,2] ## X*Y cumulative sum ## or average = matrix.sum(axis = 0) ## calculate average values of X, Y and X*Y x_average = x_average/float(len(table)-1) y_average = y_average/float(len(table)-1) xy_average = xy_average/float(len(table)-1) ## cov(X,Y) = sum(Xi*Yi)/n-XY cov = xy_average - x_average*y_average ## var = (sum(Xi - X)**2)/n var_x, var_y = 0, 0 for i in range(len(table)-1): matrix[i,3] = (matrix[i,0]-x_average)**2 ## (Xi - X)^2 matrix[i,4] = (matrix[i,1]-y_average)**2 ## (Yi - Y)^2 var_x += matrix[i,3] var_y += matrix[i,4] ## calculate variance of X(var_x), Y(var_y), correlation coefficient "r" ## r = cov(X,Y)/((var(X)*var(Y))**0.5) var_x = var_x/float(len(table)-1) var_y = var_y/float(len(table)-1) r = cov/((var_x*var_y)**0.5) ## b = cov(X,Y)/var(X) b = cov/var_x ## a = Y - bX a = y_average - b*x_average print 'linear model equation\nY=',a,'+',b,'*X\ncovariance = ',cov,'\ncorrelation coeffitient = ',r,''
Отредактировано bot1net (Апрель 22, 2013 20:38:04)
Офлайн
253
Офлайн
0
Благодарю!
Офлайн
0
Переписал с рекомендованными функциями
Еще один вопрос: round округляет в соответствии с математическими правилами, или “по-особенному”?
import numpy as np from scipy import stats as st infile = open('data.txt','r') x, y = np.loadtxt(infile, delimiter = ',', unpack=True) result = st.linregress(x,y) print 'Slope = ',round(result[0],4),'\nIntercept =',round(result[1],4),'\nr-value = ',round(result[2],4),'\np-value = ',round(result[3],4),'\nStandard error of the estimate = ',round(result[3],4)[\code]
Офлайн
16
>>> round(3.4) 3.0 >>> round(3.5) 4.0
Офлайн
253
file : file or str
Open file object or filename.
Открывать файл не обязательно, numpy сам откроет.
x, y = np.loadtxt('data.txt', delimiter = ',', unpack=True)
round(result[0],4)
>>> a=[1,2,3,4.44444444444] >>> "a={0:2d} b={1} c={2} d={3:10.3g}".format(*a) 'a= 1 b=2 c=3 d= 4.44'
Отредактировано doza_and (Апрель 23, 2013 19:26:37)
Офлайн
0
doza_and Спасибо!
Офлайн
0
Автор индийского кода столкнулся с удивительной для себя особенностью питона, а именно: если написать
>>>0 or 1 == 0
False
>>> (0 or 1) == 0
False
Либо пейсатель “кода” настолько упорот, что не в состоянии осознать всего масштаба происходящего, либо… Короче говоря дизъюнкция творит что-то любопытное. Ну или скорее у меня очень прямые руки.
Нуль ИЛИ единица равна нулю -> Ложь 
ЗЫ. Питон 2.7 писал сначала в IDE, потом удивился, попробовал в Shall, потом в командной строке…
Отредактировано bot1net (Апрель 26, 2013 21:22:13)
Офлайн
253
а в чего удивительного?
>>> 0 or 1 1
Офлайн
0
doza_and так утверждение верно, но он пишет ложь… Статью на википедии пересмотрел, возвращаемый результат неверный.
Когнитивный диссонанс у меня, однако.
>>> 1 and 0 == 0 True >>> 1 or 0 == 0 1
Отредактировано bot1net (Апрель 27, 2013 11:37:49)
Офлайн