Python Forum
p[0] mysteriouly set to 0 - Printable Version

+- Python Forum (https://python-forum.io)
+-- Forum: Python Coding (https://python-forum.io/forum-7.html)
+--- Forum: General Coding Help (https://python-forum.io/forum-8.html)
+--- Thread: p[0] mysteriouly set to 0 (/thread-41636.html)



p[0] mysteriouly set to 0 - pnachtwey - Feb-21-2024

import numpy as np

alpha = 0.1
h=0.000001
ftol = 1e-12

def f(p):
    _sum = 0                            # simple sum of x and y squared
    for i in range(len(p)):
        _sum += p[i]**2
    return _sum


def del_f(p):
    dp = np.zeros_like(p)
    print(f'p={p}')
    for i in range(len(p)):
        _save = p[i]                    # save p[i] so it can be restored later
        p[i] += h                       # take a step in the positive direction
        print(f'p={p}')
        fhi = f(p)                      # evaluate after taking a positive step
        print(f'fhi={fhi}')
        p[i] = _save                    # restore p[i]
        print(f'p={p}')                 # p[0] = 
        p[i] -= h                       # take a step in the negative direction.  
        print(f'p={p}')                 # p[0] shouldn't be zero
        flo = f(p)                      # evaluate after taking a negative step
        p[i] = _save                    # restore p[i]
        print(f'flo={flo}')
        p[i] = _save                    # restore cell to its original value
        dp[i] = (fhi-flo)/(2*h)         # calculate the gradient with P as the center value
        print(f'dp={dp}')
        pass
    return dp
   

p = np.array([1,1])

while f(p) > ftol:
    dp = del_f(p)                       # the gradient
    p = p - alpha*dp                    # Now update the parameter values
    print(f'p[0]={p[0]:11.9f} p[1]={p[1]:11.9f} dp[0]={dp[0]:8.6f} dp[1]={dp[1]:8.6f}')
This is the start if a gradient descent program.
There is a line above p[0] -= h tha sets p[0] to 0 when p[0]=1 in the line before.
After subtracting h p[0] should be equal to 0.99999 but instead is 0
This is the print out I get
p=[1 1]
p=[1 1]
fhi=2
p=[1 1]
p=[0 1]
flo=1
dp=[500000 0]

Since initial p = [1,1] and I am only adding or subtracting h which is small, p[0] should not be zero until after many iterations.


I tried several keywords to pretty print the python script but none worked. I see I just had to wait for the preview.


RE: p[0] mysteriouly set to 0 - pnachtwey - Feb-21-2024

I think I found it. I should initialize p=[1.0,1.0[ so it thinks p is an array of float values.


RE: p[0] mysteriouly set to 0 - deanhystad - Feb-21-2024

When I run your code it iterates several times before reaching zero.