# Simple linear regression problem: Gradient Descent implementation error

For seasoned Python programmers, you can skip the below Background and directly look into attached screenshots.
Background: My code has a main function. AFrom this main, a function call is made to a function called Gradient descent where all iterations and updations of w and b happen with eventual Jcost function computations. Now there should be some stop criterion to be applied (This is where error happens as far as I understood) …now, when this gradient function has to return back the optimized w & b values to the main function…a prediction is to be made with set of new input values with help of the returned optimized w&b parameters.

Attaching screen shots of function definitions and the error I get upon executing the code.

Hello SreeHarish @tennis_geek.

This error can raise when you ask whether a numpy array of more than 1 element is True or False, for example:

``````import numpy as np

ary = np.array([1, 2, 3])
if ary > 2:
print('True')
``````

running the above code will also have the same error as below

``````---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
Input In [2], in <cell line: 4>()
1 import numpy as np
3 ary = np.array([1, 2, 3])
----> 4 if ary > 2:
5     print('True')

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
``````

It’s likely that your `diff_costfunction` being an array had caused the error. You may need to apply `.any()` or `.all()` to the array as the error message suggests to decide how you want to handle an array of boolean values in an if statement; or if it is not your intention for it to be an array then you might need to correct some lines such as the one you assign value to `sumof_squared_error`.

Lastly, you might share your own code in the way I did in above, so that others can just copy your code and run it in their machine to test it. You can wrap you code with three ` symbols before the start of your code and another three ` symbols after the end of your code to format it properly.

Raymond

Thank you for the reply. I tried it this way (all those in bold)… and it is working now without errors and could get predictions too.

``````
# Import libraries
import numpy as np; # Mostly used for array manipulation datatype numpy.ndarray
from sklearn.linear_model import LinearRegression # Used for implementing Linear regression
import matplotlib.pyplot as plt # Plotting in python3 using Matplotlib library

# Initialize both w and b to 0
w = 0;
b = 0;
term1 = (1/2*1/trainingsamplesize); # Part 1 of the J cost function definition involving sample size
learningrate = 0.000000000001;
stop_threshold = 1e-10;

error = 0; #bolded
squared_error = 0; #bolded
sumof_squared_error = 0; #bolded
diff_costfunction = 0; #bolded

# Iteration start
counter = 0 ;
for i in range(max_iterations):
ypredictions=w*x_array_reshaped+b;
print("Y responses:",ypredictions);
error = (ypredictions-y_array_reshaped); # Part 2.1 of the cost function J definition
#Below comments are 1-time intuitive checks
#print("Expected Error size: a vector");
#print("Size of Error:",len(error));
squared_error = np.square(error); # Part 2.2 of the cost function J definition
#Below comments are 1-time intuitive checks
#print("Expected SE size: a vector");
#print("Size of Squared Error:",len(squared_error));
# Below LHS SumofSquaredError shall be a scalar
sumof_squared_error = np.sum(squared_error); # Part 2.3 of the cost function J definition
Jcostfunctionold = Jcostfunctionnew;
Jcostfunctionnew = term1 * sumof_squared_error;
#print("Cost function:",Jcostfunctionnew);
diff_costfunction=**abs**(Jcostfunctionold-Jcostfunctionnew);
#print("Costfunction difference:",diff_costfunction);
#print(diff_costfunction);
#print("diff_costfunction size",len(diff_costfunction));
if diff_costfunction <= stop_threshold:
break

# Update w
commonterm = (learningrate*1/trainingsamplesize);
termforupdatingw = sum(error*ypredictions);
w = w-commonterm*termforupdatingw;
print("Updated w:",w);

# Update b
termforupdatingb = sum(error);
b = b-commonterm*termforupdatingb;
print("Updated b:",b);
print("Iteration number:",counter);
counter = counter+1;
# Iteration end
return w, b
def main():

# Input training data consisting of X inputs and corresponding Y outputs

# input
housearea=np.array([1100, 1150, 1200, 1250, 1280, 1300, 1350, 1380, 1420, 1450, 1480, 1500, 1510, 1540, 1580, 1600, 1620, 1650, 1680, 1700, 1710, 1730, 1750, 1780, 1790, 1810, 1820, 1850, 1890, 1910, 1930, 1950, 1980, 2000, 2100, 2250, 2350, 2480, 2700, 2810, 2850, 2900, 3000]).reshape(-1,1);
#output
housecost=np.array([120000, 150000, 165000, 170000, 175000, 180000, 185000, 190000, 195000, 200000, 210000, 215000, 220000, 225000, 235000, 240000, 250000, 255000, 260000, 265000, 270000, 275000, 285000, 290000, 300000, 310000, 315000, 320000, 330000, 345000, 350000, 365000, 370000, 380000, 395000, 400000, 405000, 410000, 415000, 420000, 430000, 440000, 445000]).reshape(-1,1);
#samplesize
trainingsamplesize=len(housearea);
#InitialJcostfunction = 0
Jcostfunction=0;

print("Estimated w",w);
print("Estimated b",b);

# Making predictions using estimated parameters w & b
newinputarray=np.array([1205,1281,1327,1391,1579,1631,1704,1881,1912,2005,2623,2781,2867]);
newhousearea=newinputarray.reshape(-1,1);

predicted_housecost=w*newhousearea + b # w slope and b y-intercept which are parameters coming out of grad descent algorithm
# predicted house cost for any given housearea values for the settled w & b.

# print("House cost predictions:",predicted_housecost);

plt.plot(housearea,housecost,'bo');
plt.xlabel('house sq.metres');
plt.ylabel('house cost in USD');
plt.xlim(800, 3500), plt.ylim(110000, 500000);
plt.title('Response in Red amongst Blue training');
plt.plot(newhousearea,predicted_housecost,'r*');
plt.show();

if __name__ == "__main__":
main()

``````

You are welcome @tennis_geek. I edited your post for formatting. You might click the edit button (in the lower right corner of the post) for your latest post to see my change.

Raymond