-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy path1-Linear Regression
More file actions
1 lines (1 loc) · 19.1 KB
/
1-Linear Regression
File metadata and controls
1 lines (1 loc) · 19.1 KB
1
{"nbformat":4,"nbformat_minor":0,"metadata":{"colab":{"name":"1-Linear Regression","provenance":[],"authorship_tag":"ABX9TyMGAzcWG2YXlzJfAzJnp4uY"},"kernelspec":{"name":"python3","display_name":"Python 3"},"language_info":{"name":"python"}},"cells":[{"cell_type":"markdown","source":["#**Linear Regression**\n","\n","A linear regression learning algorithm example using TensorFlow library."],"metadata":{"id":"mdVKAUWf5FKL"}},{"cell_type":"code","source":["import tensorflow as tf\n","tf.compat.v1.disable_eager_execution() # need to disable eager in TF2.x\n","import numpy\n","import matplotlib.pyplot as plt\n","rng = numpy.random"],"metadata":{"id":"d6wU_hHm5Mcl","executionInfo":{"status":"ok","timestamp":1654065400284,"user_tz":-330,"elapsed":617,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}}},"execution_count":23,"outputs":[]},{"cell_type":"code","source":["# Parameters\n","learning_rate = 0.01\n","training_epochs = 1000\n","display_step = 50"],"metadata":{"id":"ROibay7t5qUt","executionInfo":{"status":"ok","timestamp":1654065400905,"user_tz":-330,"elapsed":12,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}}},"execution_count":24,"outputs":[]},{"cell_type":"code","source":["# Training Data\n","train_X = numpy.asarray([3.3,4.4,5.5,6.71,6.93,4.168,9.779,6.182,7.59,2.167,\n"," 7.042,10.791,5.313,7.997,5.654,9.27,3.1])\n","train_Y = numpy.asarray([1.7,2.76,2.09,3.19,1.694,1.573,3.366,2.596,2.53,1.221,\n"," 2.827,3.465,1.65,2.904,2.42,2.94,1.3])\n","n_samples = train_X.shape[0]\n","train_X"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"FdPRamxF5wui","executionInfo":{"status":"ok","timestamp":1654065400905,"user_tz":-330,"elapsed":11,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}},"outputId":"466bafbe-8a4f-443d-a7cf-0cb292074e99"},"execution_count":25,"outputs":[{"output_type":"execute_result","data":{"text/plain":["array([ 3.3 , 4.4 , 5.5 , 6.71 , 6.93 , 4.168, 9.779, 6.182,\n"," 7.59 , 2.167, 7.042, 10.791, 5.313, 7.997, 5.654, 9.27 ,\n"," 3.1 ])"]},"metadata":{},"execution_count":25}]},{"cell_type":"code","source":["# tf Graph Input\n","X = tf.compat.v1.placeholder(\"float\")\n","Y = tf.compat.v1.placeholder(\"float\")\n","\n","# Set model weights\n","W = tf.Variable(rng.randn(), name=\"weight\")\n","b = tf.Variable(rng.randn(), name=\"bias\")"],"metadata":{"id":"hLj7i_JD54k6","executionInfo":{"status":"ok","timestamp":1654065400906,"user_tz":-330,"elapsed":10,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}}},"execution_count":26,"outputs":[]},{"cell_type":"code","source":["# Construct a linear model\n","pred = tf.add(tf.multiply(X, W), b)\n","pred"],"metadata":{"colab":{"base_uri":"https://localhost:8080/"},"id":"VZASCimg6GBu","executionInfo":{"status":"ok","timestamp":1654065400906,"user_tz":-330,"elapsed":10,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}},"outputId":"97c5a7fc-0835-4c7c-cbab-8c3580a603f1"},"execution_count":27,"outputs":[{"output_type":"execute_result","data":{"text/plain":["<tf.Tensor 'Add_2:0' shape=<unknown> dtype=float32>"]},"metadata":{},"execution_count":27}]},{"cell_type":"code","source":["# Mean squared error\n","cost = tf.reduce_sum(tf.pow(pred-Y, 2))/(2*n_samples)\n","\n","# Gradient descent\n","optimizer = tf.compat.v1.train.GradientDescentOptimizer(learning_rate).minimize(cost)"],"metadata":{"id":"QhY0dwpJ7e1X","executionInfo":{"status":"ok","timestamp":1654065400907,"user_tz":-330,"elapsed":9,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}}},"execution_count":28,"outputs":[]},{"cell_type":"code","source":["# Initialize the variables (i.e. assign their default value)\n","init = tf.compat.v1.global_variables_initializer()"],"metadata":{"id":"zveh9dhI7u67","executionInfo":{"status":"ok","timestamp":1654065400907,"user_tz":-330,"elapsed":8,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}}},"execution_count":29,"outputs":[]},{"cell_type":"code","source":["# Start training\n","with tf.compat.v1.Session() as sess:\n"," sess.run(init)\n","\n"," # Fit all training data\n"," for epoch in range(training_epochs):\n"," for (x, y) in zip(train_X, train_Y):\n"," sess.run(optimizer, feed_dict={X: x, Y: y})\n","\n"," #Display logs per epoch step\n"," if (epoch+1) % display_step == 0:\n"," c = sess.run(cost, feed_dict={X: train_X, Y:train_Y})\n"," print(\"Epoch:\",(epoch+1), \"cost=\", c,\"W =\", sess.run(W), \"b =\", sess.run(b))\n","\n"," print(\"Optimization Finished!\")\n"," training_cost = sess.run(cost, feed_dict={X: train_X, Y: train_Y})\n"," print(\"Training cost=\", training_cost, \"W =\", sess.run(W), \"b =\", sess.run(b))\n","#Graphic display\n"," plt.plot(train_X, train_Y, 'ro', label='Original data')\n"," plt.plot(train_X, sess.run(W) * train_X + sess.run(b), label='Fitted line')\n"," plt.legend()\n"," plt.show()"],"metadata":{"colab":{"base_uri":"https://localhost:8080/","height":647},"id":"NrJmiXBX8RAP","executionInfo":{"status":"ok","timestamp":1654065508536,"user_tz":-330,"elapsed":10411,"user":{"displayName":"P Kumar","userId":"08759630486056956439"}},"outputId":"32179c94-b6a4-4f54-d6ca-18979169a05c"},"execution_count":32,"outputs":[{"output_type":"stream","name":"stdout","text":["Epoch: 50 cost= 0.20451498 W = 0.44925448 b = -0.6348799\n","Epoch: 100 cost= 0.18978047 W = 0.43737975 b = -0.54945356\n","Epoch: 150 cost= 0.17674752 W = 0.42621127 b = -0.46910807\n","Epoch: 200 cost= 0.16521966 W = 0.41570696 b = -0.39354122\n","Epoch: 250 cost= 0.15502314 W = 0.40582752 b = -0.32246903\n","Epoch: 300 cost= 0.14600423 W = 0.3965355 b = -0.2556231\n","Epoch: 350 cost= 0.13802695 W = 0.38779616 b = -0.19275294\n","Epoch: 400 cost= 0.13097109 W = 0.3795766 b = -0.13362207\n","Epoch: 450 cost= 0.12473025 W = 0.37184596 b = -0.07800793\n","Epoch: 500 cost= 0.11921034 W = 0.36457494 b = -0.02570146\n","Epoch: 550 cost= 0.11432809 W = 0.35773647 b = 0.023494175\n","Epoch: 600 cost= 0.110009864 W = 0.35130468 b = 0.06976394\n","Epoch: 650 cost= 0.10619057 W = 0.34525543 b = 0.11328187\n","Epoch: 700 cost= 0.102812536 W = 0.339566 b = 0.15421158\n","Epoch: 750 cost= 0.09982491 W = 0.33421493 b = 0.19270678\n","Epoch: 800 cost= 0.0971825 W = 0.3291821 b = 0.22891274\n","Epoch: 850 cost= 0.09484547 W = 0.32444862 b = 0.26296523\n","Epoch: 900 cost= 0.092778556 W = 0.31999654 b = 0.29499274\n","Epoch: 950 cost= 0.09095054 W = 0.31580934 b = 0.32511526\n","Epoch: 1000 cost= 0.08933392 W = 0.3118712 b = 0.353446\n","Optimization Finished!\n","Training cost= 0.08933392 W = 0.3118712 b = 0.353446\n"]},{"output_type":"display_data","data":{"text/plain":["<Figure size 432x288 with 1 Axes>"],"image/png":"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\n"},"metadata":{"needs_background":"light"}}]}]}