2016-11-06 10 views
0

Ich versuche, ein exponentiell abklingendes Modell (y = Ax^b + C) an einige Daten anzupassen, aber für b noch einen anderen Wert als 0 zu erhalten. Ich habe jetzt zwei "funktionierende" Codesätze, einen Schritt durch jedes X, Y-Paar und die anderen Versuche, das gesamte [X, Y] -Array zu verwenden, aber ich bin mir nicht sicher, ob ich das richtig implementiert habe. Für jetzt möchte ich, dass es eine Kurve richtig passt. Das lineare Modell funktioniert gut, also bin ich mir nicht sicher, wohin das nach Süden geht.Tensorflow Lineare Regression - Exponentialmodell nicht passend Exponent

Daten sind hier - PASTEBIN

#!/usr/bin/python 

import numpy as np 
import tensorflow as tf 
import sys 
import matplotlib.pyplot as plt 
k=0 
xdata= [] 
ydata = [] 
# Open the data and read it in, ignore the header. 
with open('curvedata_full_formatted.csv') as f: 
    for line in f: 
     k+=1 
     if k==1:continue 
     items = line.split(',') 
     xdata.append(float(items[0])) 
     ydata.append(float(items[1])) 


# Model linear regression y = A*x^B+C 
# x - data to be fed into the model - 1 feature 
x = tf.placeholder(tf.float32, [None, 1]) 

# A - training variable - 1 feature, 1 output 
A = tf.Variable(tf.zeros([1,1])) 

# B - training variable - 1 output 
B = tf.Variable(tf.zeros([1,1])) 

# C - training variable - 1 output 
C = tf.Variable(tf.zeros([1])) 

# x^B 
xb = tf.exp(B) 
# A*x^b 
product = tf.mul(A,xb) 


# Prediction 
y = tf.add(product,C) 
# Actual value ybar 

y_ = tf.placeholder(tf.float32) 
# Cost function sum((y_-y)**2) 
cost = tf.reduce_mean(tf.square(y_-y)) 

# Training using Gradient Descent to minimize cost 
train_step = tf.train.GradientDescentOptimizer(1*10**-9).minimize(cost) 

sess = tf.Session() 
init = tf.initialize_all_variables() 
sess.run(init) 
steps = 150 

for i in range(steps): 
    # Read in data from log file and use as x,y 
    for (X,Y) in zip(xdata,ydata): 
     #xs = np.array([[xdata]]) 
     #ys = np.array([[ydata]]) 
     # Train 
     # Feed dict x placeholder xs, y_ placeholder ys 
     X = np.array([[X]]) 
     Y = np.array([[Y]]) 
     feed = { x: X, y_: Y } 
     sess.run(train_step, feed_dict=feed) 
    sys.stdout.write("\rIteration %i " %i +"cost %.15f" % sess.run(cost,  feed_dict=feed)) 
    sys.stdout.flush() 
print '' 
print 'A: %f'%sess.run(A) 
print 'B: %f'%sess.run(B) 
print 'C: %f'%sess.run(C) 

Antwort

0

Als Test versuchen, den Optimierer mit den Anfangswerten der Nähe der erwarteten endgültigen Parameter zu starten. Dieser Test wird Ihnen sagen, ob das Problem in der Auswahl der anfänglichen Parameterwerte liegt.

Verwandte Themen