Matematické Fórum

Nevíte-li si rady s jakýmkoliv matematickým problémem, toto místo je pro vás jako dělané.

Nástěnka
22. 8. 2021 (L) Přecházíme zpět na doménu forum.matweb.cz!
04.11.2016 (Jel.) Čtete, prosím, před vložení dotazu, děkuji!
23.10.2013 (Jel.) Zkuste před zadáním dotazu použít některý z online-nástrojů, konzultovat použití můžete v sekci CAS.

Nejste přihlášen(a). Přihlásit

#1 27. 08. 2022 03:42

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Zero gradient

1) Jak se typově jmenuje funkce, jejíž derivace dává v jakémkoli bodě nulový gradient?
2) Je taková funkce step function?
3) Je každý bod této funkce lokální minimum/maximum?
4) Jak se dá najít globální minimum/maximum takové funkce?

Offline

 

#2 27. 08. 2022 12:50

Bati
Příspěvky: 2435
Reputace:   191 
 

Re: Zero gradient

↑ lordcong:
Pokud [mathjax]\nabla f=0[/mathjax] (na nejake souvisle mnozine), pak [mathjax]f[/mathjax] musi byt konstantni (v te mnozine). Je to stejne jako v 1D. Nevim, jestli ti to je jasne, nebo potrebujes formalni dukaz, kdyztak si rekni.

Step function maji sice derivaci nulovou skoro vsude (teda zalezi jeste na mnozine), akorat ze ta derivace neexistuje v bodech skoku, resp. tam je to Diracova distribuce.

Otazky 3) a 4) jsou ted asi jasne...

Offline

 

#3 27. 08. 2022 15:28

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

↑ lordcong:
Pokud [mathjax]\nabla f=0[/mathjax] (na nejake souvisle mnozine), pak [mathjax]f[/mathjax] musi byt konstantni (v te mnozine). Je to stejne jako v 1D. Nevim, jestli ti to je jasne, nebo potrebujes formalni dukaz, kdyztak si rekni.

Step function maji sice derivaci nulovou skoro vsude (teda zalezi jeste na mnozine), akorat ze ta derivace neexistuje v bodech skoku, resp. tam je to Diracova distribuce.

Otazky 3) a 4) jsou ted asi jasne...

No úplně tomu nerozumím. Položil jsem související dotaz v sekci Algoritmy a programování

Offline

 

#4 27. 08. 2022 17:44 — Editoval Bati (27. 08. 2022 17:44)

Bati
Příspěvky: 2435
Reputace:   191 
 

Re: Zero gradient

Cetl jsem si ten dotaz, ale porad neni moc jasne k cemu to chces. Je jasne, ze numerikou se k Diracove distribuci nikdy nedopocitas. Muzes akorat aproximovat, napr. vylepsit ten sigmoid: [mathjax]\frac1{1+e^{-\frac{x}{\varepsilon}}}[/mathjax] s tim, ze [mathjax]\varepsilon>0[/mathjax] zvolis tak male, jak to pujde. Pokud bys chtel pracovat presne se step function, musel bys nejak rucne detekovat mnozinu kde to skace.

Offline

 

#5 27. 08. 2022 18:00

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

Cetl jsem si ten dotaz, ale porad neni moc jasne k cemu to chces. Je jasne, ze numerikou se k Diracove distribuci nikdy nedopocitas. Muzes akorat aproximovat, napr. vylepsit ten sigmoid: [mathjax]\frac1{1+e^{-\frac{x}{\varepsilon}}}[/mathjax] s tim, ze [mathjax]\varepsilon>0[/mathjax] zvolis tak male, jak to pujde. Pokud bys chtel pracovat presne se step function, musel bys nejak rucne detekovat mnozinu kde to skace.

Chci najít globální maximum funkce s mnoha proměnnými (500+) - a ta funkce je nejspíš step function. V podstatě je to ta MyFunc, ale s dalšími výpočty navíc a mnoha proměnnými. Jestli to chápu správně, tak globální optimum se dá hledat přes gradient descent. Jenže to v tomto případě nejde, když je gradient nula. Tak se to nějak snažím obejít, aby ten gradient nebyl nula a šlo udělat ten gradient descent.

Offline

 

#6 27. 08. 2022 18:13

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

Cetl jsem si ten dotaz, ale porad neni moc jasne k cemu to chces. Je jasne, ze numerikou se k Diracove distribuci nikdy nedopocitas. Muzes akorat aproximovat, napr. vylepsit ten sigmoid: [mathjax]\frac1{1+e^{-\frac{x}{\varepsilon}}}[/mathjax] s tim, ze [mathjax]\varepsilon>0[/mathjax] zvolis tak male, jak to pujde. Pokud bys chtel pracovat presne se step function, musel bys nejak rucne detekovat mnozinu kde to skace.

Matiku neumím, ale laicky řečeno: myslím, že potřebuju funkci, která pro téměř jakékoli hodnoty x dá y=1, ale pro x extrémně blízké nule, třeba 0.00000001 dá hodnotu y 0.9999999999

Offline

 

#7 27. 08. 2022 18:37 — Editoval Bati (27. 08. 2022 18:40)

Bati
Příspěvky: 2435
Reputace:   191 
 

Re: Zero gradient

Aha. No tak to distribuce opravdu nepotrebujes a pocitat gradient primo z toho taky samozrejme nedava smysl. Muzes tu funkci ale nejdriv zhladit, tj. udelat konvoluci s necim hladkym, co se blizi Diracove delta. Konkretne, pokud tva funkce je [mathjax]f[/mathjax], tak si nejdriv spoctes
[mathjax]f_{\delta}(x)=(f\ast\eta_{\delta})(x)=\int_{\mathbb{R}^n}f(x-y)\eta_{\delta}(y)\,\mathrm{d}y[/mathjax],
kde
[mathjax]\eta_{\delta}(y)=\frac1{\delta}\exp(\frac1{\frac{|y|^2}{\delta^2}-1})[/mathjax], pokud [mathjax]|y|<\delta[/mathjax], jinak [mathjax]\eta_{\delta}=0[/mathjax]. Pak si najdes body podezrele z extremu pomoci [mathjax]\nabla f_{\delta}=0[/mathjax], a v tech bodech si pak spoctes hodnoty puvodni funkce [mathjax]f[/mathjax] a porovnas je. Parametr [mathjax]\delta>0[/mathjax] musis zvolit mensi nez je velikost nejmensi mnoziny, na ktere je [mathjax]f[/mathjax] konstantni (abys ty mnoziny neprehledl), ale zase ne moc maly, aby ti to nenaslo falesne extremy kvuli numerickym chybam.

To je spise matematicke reseni. Mozna by ale taky fungovalo nejake sikovne prohledavani, kdyz to je jen step function...

Offline

 

#8 27. 08. 2022 20:02 — Editoval lordcong (27. 08. 2022 20:14)

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

Aha. No tak to distribuce opravdu nepotrebujes a pocitat gradient primo z toho taky samozrejme nedava smysl. Muzes tu funkci ale nejdriv zhladit, tj. udelat konvoluci s necim hladkym, co se blizi Diracove delta. Konkretne, pokud tva funkce je [mathjax]f[/mathjax], tak si nejdriv spoctes
[mathjax]f_{\delta}(x)=(f\ast\eta_{\delta})(x)=\int_{\mathbb{R}^n}f(x-y)\eta_{\delta}(y)\,\mathrm{d}y[/mathjax],
kde
[mathjax]\eta_{\delta}(y)=\frac1{\delta}\exp(\frac1{\frac{|y|^2}{\delta^2}-1})[/mathjax], pokud [mathjax]|y|<\delta[/mathjax], jinak [mathjax]\eta_{\delta}=0[/mathjax]. Pak si najdes body podezrele z extremu pomoci [mathjax]\nabla f_{\delta}=0[/mathjax], a v tech bodech si pak spoctes hodnoty puvodni funkce [mathjax]f[/mathjax] a porovnas je. Parametr [mathjax]\delta>0[/mathjax] musis zvolit mensi nez je velikost nejmensi mnoziny, na ktere je [mathjax]f[/mathjax] konstantni (abys ty mnoziny neprehledl), ale zase ne moc maly, aby ti to nenaslo falesne extremy kvuli numerickym chybam.

To je spise matematicke reseni. Mozna by ale taky fungovalo nejake sikovne prohledavani, kdyz to je jen step function...

Díky moc. Akorát mám za sebou jen středoškolskou matiku před mnoha lety a nedokážu to přespat do Pythonu :)

Moje step function má teoreticky cca 150000**2 možných hodnot v intervalu asi -150.000.000 až 300.000.000 (horní interval spíš jen odhaduju, ale spočítat by šel). Nejmenší možný skok je 10, takže reálně těch hodnot bude o hodně méně než těch 150000**2

Offline

 

#9 27. 08. 2022 21:01 — Editoval lordcong (27. 08. 2022 21:06)

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

Aha. No tak to distribuce opravdu nepotrebujes a pocitat gradient primo z toho taky samozrejme nedava smysl. Muzes tu funkci ale nejdriv zhladit, tj. udelat konvoluci s necim hladkym, co se blizi Diracove delta. Konkretne, pokud tva funkce je [mathjax]f[/mathjax], tak si nejdriv spoctes
[mathjax]f_{\delta}(x)=(f\ast\eta_{\delta})(x)=\int_{\mathbb{R}^n}f(x-y)\eta_{\delta}(y)\,\mathrm{d}y[/mathjax],
kde
[mathjax]\eta_{\delta}(y)=\frac1{\delta}\exp(\frac1{\frac{|y|^2}{\delta^2}-1})[/mathjax], pokud [mathjax]|y|<\delta[/mathjax], jinak [mathjax]\eta_{\delta}=0[/mathjax]. Pak si najdes body podezrele z extremu pomoci [mathjax]\nabla f_{\delta}=0[/mathjax], a v tech bodech si pak spoctes hodnoty puvodni funkce [mathjax]f[/mathjax] a porovnas je. Parametr [mathjax]\delta>0[/mathjax] musis zvolit mensi nez je velikost nejmensi mnoziny, na ktere je [mathjax]f[/mathjax] konstantni (abys ty mnoziny neprehledl), ale zase ne moc maly, aby ti to nenaslo falesne extremy kvuli numerickym chybam.

To je spise matematicke reseni. Mozna by ale taky fungovalo nejake sikovne prohledavani, kdyz to je jen step function...

Má to být nějak takhle?

Code:

from math import exp

def konvoluce(y):
    delta = 5
    
    if abs(y) < delta:
        return y * 1/delta * exp( 1 / ((y**2/delta**2) - 1))
    else:
        return y

def MyFunc(coefs):
   a = coefs[0]
   b = coefs[1]
   c = coefs[2]
   
   if a > b:
      return konvoluce(30.0)
   elif b > c:
      return konvoluce(20.0)
   else:
      return konvoluce(10.0)

Offline

 

#10 27. 08. 2022 22:08 — Editoval Bati (27. 08. 2022 22:12)

Bati
Příspěvky: 2435
Reputace:   191 
 

Re: Zero gradient

↑ lordcong:
To jsi jen definoval to zhlazovaci jadro [mathjax]\eta[/mathjax]. Ted ho musis vynasobit tou funkci a zintegrovat pres prostor promennych. Promenna [mathjax]y[/mathjax] neni cislo, ale bod v tom tvem prostoru promennych, tj. 500-souradnicovy vektor. Znacil jsem zkracene [mathjax]|y|=\sqrt{\sum_{i=1}^{500}y_i^2}[/mathjax]. Pak je potreba nejak udelat ten integral (opet v [mathjax]\mathbb{R}^{500}[/mathjax]), tam bude stacit nejaka jednoducha numericka kvadratura.

Mozna bude lepsi, nez se do toho uplne hned vrhnout timhle obecnym zpusobem, jeste trochu zagooglit. Rikam si, ze podobne veci se musi resit napr. pri vyhlazovani obrazku. Soubor pixelu je taky vlastne step function... Kdysi jsem neco takoveho programoval a myslim, ze to slo bez integrovani, ale uz je to davno. Treba jeste nekdo neco poradi.

Mozna by taky pomohlo, kdybys napsal presne, jake mas zadani a jakym zpusobem je ta funkce definovana, tj. jestli to je opravdu jen nejaky black-box, nebo naopak, jestli by to treba neslo reprezentovat jen nejakou matici.

Offline

 

#11 27. 08. 2022 23:32

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Bati napsal(a):

↑ lordcong:
To jsi jen definoval to zhlazovaci jadro [mathjax]\eta[/mathjax]. Ted ho musis vynasobit tou funkci a zintegrovat pres prostor promennych. Promenna [mathjax]y[/mathjax] neni cislo, ale bod v tom tvem prostoru promennych, tj. 500-souradnicovy vektor. Znacil jsem zkracene [mathjax]|y|=\sqrt{\sum_{i=1}^{500}y_i^2}[/mathjax]. Pak je potreba nejak udelat ten integral (opet v [mathjax]\mathbb{R}^{500}[/mathjax]), tam bude stacit nejaka jednoducha numericka kvadratura.

Mozna bude lepsi, nez se do toho uplne hned vrhnout timhle obecnym zpusobem, jeste trochu zagooglit. Rikam si, ze podobne veci se musi resit napr. pri vyhlazovani obrazku. Soubor pixelu je taky vlastne step function... Kdysi jsem neco takoveho programoval a myslim, ze to slo bez integrovani, ale uz je to davno. Treba jeste nekdo neco poradi.

Mozna by taky pomohlo, kdybys napsal presne, jake mas zadani a jakym zpusobem je ta funkce definovana, tj. jestli to je opravdu jen nejaky black-box, nebo naopak, jestli by to treba neslo reprezentovat jen nejakou matici.

No, začínám tomu míň a míň rozumět :) Zadání je přibližně takový:
1) Mám funkci MyFunc (klidně jí zveřejním, pokud to pomůže) - funkce vrátí číslo v intervalu asi -150000000 až +300000000 v závislosti na tom, jaký se jí pošle list 532 proměnných, přičemž ty hodnoty jsou v celých desítkách, tzn. třeba 1154350, 1154360, 1154370
2) pak mám nějaký list výchozích proměnných - můžu začít třeba s randomStart = np.random.sample(532) - ty proměnný mohou mít jakoukoli hodnotu, můžou být i negativní

Cílem je najít takovou kombinaci těch 532 parametrů, aby funkce MyFunc vrátila nejvyšší možnou hodnotu (přičemž ta hodnota pravděpodobně bude někde uprostřed, téměř jistě nebude poblíž -150000000 ani +300000000)

Jak přesně tedy vypadají kroky toho tvého algoritmu?

Integraci mohu provést třeba pomocí funkce numpy.trapz.

Offline

 

#12 27. 08. 2022 23:46 — Editoval lordcong (28. 08. 2022 00:06)

lordcong
Příspěvky: 33
Škola: PF UK
Pozice: student
Reputace:   
 

Re: Zero gradient

Tady je ta MyFunc (v syntaxi pro JAX)

Code:

from jax import grad
import jax.nn as nn
import jax.numpy as jnp
import numpy as np
import json

# Example data - řad mám v reálu mnohem víc než tři - přes 150 tisíc
data = jnp.array([[ 1.  ,  1.06,  9.77,  5.  ,  3.  ,  2.  ,  6.  , 12.  ,  4.  ,
       10.  ,  1.  ,  7.  ,  1.  , 12.  , 10.  , 12.  ,  4.  , 10.  ,
        8.  ,  7.  , 11.  ,  5.  ,  9.  ,  3.  ,  6.  , 12.  ,  6.  ,
        5.  ,  3.  ,  5.  ,  9.  ,  8.  ,  9.  , 10.  , 11.  , 12.  ,
        1.  ,  2.  ,  3.  ,  4.  ,  5.  ,  6.  ,  7.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ], 
        [ 1.  ,  1.33,  3.33,  5.  ,  3.  ,  2.  ,  6.  , 12.  ,  4.  ,
       10.  ,  1.  ,  7.  ,  1.  , 12.  , 10.  , 12.  ,  4.  , 10.  ,
        8.  ,  7.  , 11.  ,  5.  ,  9.  ,  3.  ,  6.  , 12.  ,  6.  ,
        5.  ,  3.  ,  5.  ,  9.  ,  8.  ,  9.  , 10.  , 11.  , 12.  ,
        1.  ,  2.  ,  3.  ,  4.  ,  5.  ,  6.  ,  7.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ], 
        [ 2.  ,  1.65,  2.07,  5.  ,  3.  ,  2.  ,  6.  , 12.  ,  4.  ,
       10.  ,  1.  ,  7.  ,  1.  , 12.  , 10.  , 12.  ,  4.  ,  8.  ,
        6.  ,  5.  ,  9.  ,  3.  ,  7.  ,  1.  ,  4.  , 10.  ,  4.  ,
        3.  ,  1.  ,  3.  ,  7.  , 10.  , 11.  , 12.  ,  1.  ,  2.  ,
        3.  ,  4.  ,  5.  ,  6.  ,  7.  ,  8.  ,  9.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,  0.  ,
        0.  ,  0.  ,  0.  ]])

        
def MyFunc(coefs, data):
    balance = float(len(data)*-1000)
    
    for row in data:
        result = row[0]
        fOdds = row[1]
        dOdds = row[2]

        hCoefs = jnp.zeros(12)
        for p in range (0, 14):
            s = (row[3+p]-1).astype(int)
            h = (row[17+p]).astype(int)
            r = (row[43+p]).astype(int)
                
            bCoef = coefs[p]
            sCoef = coefs[14 + (p * 12) + s]
            hCoef = coefs[182 + (p * 12) + h]
            
            if r == 1:
                rCoef = coefs[350 +p]
            else:
                rCoef = 1.0
            pStrength = bCoef * sCoef * hCoef * rCoef

            hCoefs = hCoefs.at[h].set(hCoefs[h]+pStrength)

        
        for h in range (0, 12):
            hSign = (row[31+h]-1).astype(int)
            hCoefs = hCoefs.at[h].set(hCoefs[h]*coefs [364 + (h*12) + hSign])
                            
        fPoints = 0.0
        dPoints = 0.0
            
        for h in range (0, 12):
            fPoints += hCoefs[h] * coefs[508+h]
            dPoints += hCoefs[h] * coefs[520+h]
    
        if result == 1.0 and fPoints > dPoints:
            balance += fOdds*1000
        elif result == 2.0 and dPoints > fPoints:
            balance += dOdds*1000

    return balance

Offline

 

Zápatí

Powered by PunBB
© Copyright 2002–2005 Rickard Andersson