简体   繁体   中英

Tensorflow Linear Regression - Exponential Model Not Fitting Exponent

I'm trying to fit an exponentially decaying model (y=Ax^b + C)to some data but have yet to get a value other than 0 for for b. I have two "working" sets of code right now, one steps through each X,Y pair, and the other attempts to use the entire [X,Y] array, but I'm not sure that I have implemented that correctly. For now I'd like for it to correctly fit a curve. The linear model works fine so I'm not sure where this is going south.

Data is here - 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)   

As a test, try starting the optimizer with initial values close to the expected final parameters. This test will tell you whether or not the problem is in the selection of initial parameter values.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM