私はSchemeの初心者で、確率的勾配降下法を実装する課題に取り組んでいます。これまでのところ、プログラムの構造は正しいと思いますが、関数 f(x) の導関数を取る手順が問題を引き起こしています。コードの最後にある "try" ループで、再帰的(try (func-eval guess))
に whereを呼び出して、式*x - alpha*f'(x)* ( alpha = 0.1 )(func-eval guess)
を使用して、関数のローカル最小値の次の推測を計算します。
導関数の計算中にエラーが発生したようです... Dr.Racket IDE を使用していますが、次の行が問題として強調表示されています:
(f (+ x dx))
... これは私のローカル導関数手順の 2 行目です:
(define (local-minimal first-guess)
;A way to check a guess
(define(good-enough? val1 val2)
(<(abs(- val1 val2)) 0.00001))
; x_new = x_old - alpha*f'(x) /// f(x)=(x+1)^2+2 //// alpha = 0.1
(define (func-eval x)
(- x (* 0.1((derivative (+ 2(expt (+ x 1) 2)) 0.00001)x))))
(define (derivative f dx)
(lambda (x)
(/ (- (f (+ x dx)) (f x))
dx)))
; trys the guess
(define (try guess)
(if (good-enough? guess -1)
guess
(try (func-eval guess))))
(try first-guess))
次のようなエラーが表示されます。
application: not a procedure;
expected a procedure that can be applied to arguments
given: 3
arguments...:
-1.99999
これは構文エラーですか? ...を使えば f(x+dx) と言えると思っていた(f (+ x dx))
のですが、これは括弧内の f の前に演算子を入れる必要があるということですか?