Не вычисляется параметр линейной регрессии
Я решил разобраться с линейной регрессией на каком-то реальном примере. Для этого я скачал csv-файл, в котором приведены данные о температуре для некоторых городов для каждого месяца с 1850 года по 2015. https://data.world/data-society/global-climate-change-data/workspace/file?filename=GlobalLandTemperatures%2FGlobalLandTemperaturesByMajorCity.csv Чтение файла, вычисление среднегодовой температуры происходит нормально. Но есть проблема с вычислением параметра линейной регрессии w. Он равен nan. В итоге линию регрессии не получается построить. Можете подсказать в чем ошибка? Заранее спасибо!
import matplotlib.pyplot as plt
import csv
import tensorflow as tf
import numpy as np
tf.compat.v1.disable_eager_execution()
def search_stat(start_year,finish_year):
csv_path="GlobalLandTemperatures_GlobalLandTemperaturesByMajorCity.csv"
with open(csv_path, encoding='utf-8', newline='') as csv_file:
csvreader = csv.reader(csv_file)
array= []
end_year= str(finish_year)
temperature=0
n=-1
#row[0]- столбец с датами в формате YYYY-MM-DD
#row[1]- столбец с среднемесячными значениями температуры
#row[3]- столбец с названиями городов
for row in csvreader:
if (row[3]== 'Abidjan') and (start_year<=(int((row[0])[:4]))) and not
(row[0].startswith(end_year)):
if (row[1]!='') and (row[1]!=','):
temperature=float(row[1])
array.append(temperature)
n+=1
else:
array.append(array[n])
n+=1
if (row[0].startswith(end_year)):
return array
def avr_tem_array(start_year,finish_year):
array=[] #список со значениями температуры в каждом месяце
array= search_stat(start_year,finish_year)
i=0
sum=0
k=0
result_array=[]
months=(finish_year-start_year)*12
while(i<months):
sum+=array[i]
if k==11:
result_array.append(sum/12) #средняя температура за год
sum=0
k=0
i+=1
continue
i+=1
k+=1
print(array)
return(result_array)
array= []
array= avr_tem_array(1965,1995)#среднегодовые значения температуры 1965-1995
print(array)
years=np.arange(1965.0,1995.0)
learning_rate=0.01
learning_epochs=100
X=tf.compat.v1.placeholder(tf.float32)
Y=tf.compat.v1.placeholder(tf.float32)
def model(X,w):
return tf.compat.v1.multiply(X,w)
w= tf.compat.v1.Variable(0.0, name='weights')# параметр регрессии
y_model=model(X,w)
cost=tf.square(Y-y_model)
main_fun=tf.compat.v1.train.GradientDescentOptimizer(learning_rate)
.minimize(cost)
sess=tf.compat.v1.Session()
init=tf.compat.v1.global_variables_initializer()
sess.run(init)
for epoch in range(learning_epochs):
for (x,y) in zip(years,array):
sess.run(main_fun, feed_dict={X: x, Y: y})
w_learned=sess.run(w) #вычисляем окончательное значение линейной регрессии
#оно оказывается равным nan
sess.close()
y_lerned=w_learned*years #все значения y_learned оказываются равными nan
print(years)
print(w_learned)
print(y_lerned)
plt.scatter(years,array)
plt.plot(years,y_lerned) #построение линии регрессии
plt.show()