2017-04-13 11 views
0

以前はRとMATLABを使っていましたが、Scalaにとっては比較的新しいです。 Scalaで次のコードを書いています。私はRとMATLABに同じコードを書いていますが、どちらもうまくいきますが、Scalaの経験がないため、以下のコードは機能しません。別の関数でスカラ関数を参照しています

import breeze.linalg._ 
import breeze.numerics.exp 
import scala.math.log 



val data = breeze.stats.distributions.Uniform(0, 1) 

val ep: DenseMatrix[Double] = DenseMatrix.rand(39, 3, data).t 

val a = DenseVector(1.0) 

val out: DenseMatrix[Double] = tile(a, 1, 39) 

val fout: DenseVector[Double] = out.toDenseVector 

val A: Double = 0.0 

val B: Double = 1.0 

val eta: Double = 2.0/Math.pow(B - A, 2.0) 

val nCol: Int = 39 

val nRow: Int = 3 

var gA = 0.0 

var gB = 0.0 

var gamma = 0.0 


def SubstFunction(predictions: DenseVector[Double], expertsPrediction: DenseVector[Double]): Double = { 

    gA = -(1/eta) * log(predictions dot exp(-eta * (expertsPrediction :- A)) :^ 2.0) 

    gB = -(1/eta) * log(predictions dot exp(-eta * (expertsPrediction :- B)) :^ 2.0) 

    gamma = (0.5 * (B + A)) - ((gB - gA)/2 * (B - A)) 

    gamma 

} 


def prediction(Input: DenseMatrix[Double], outcomes: DenseVector[Double]): DenseVector[Double] = { 

    var weights = DenseVector(1.0,1.0,1.0) 

    val AAprediction = DenseVector.fill(nCol)(0.0) 

    //DenseVector.ones[Double](nCol).t 

    for (l<-0 to Input.cols) { 

    val normalisedWeights = weights/sum(weights) 

    AAprediction(l) = SubstFunction(normalisedWeights, Input(::,l)) 

    weights = normalisedWeights :* exp(eta :* (Input(::,l) :- outcomes(l)) :^ 2.0).toDenseVector 
    } 
    AAprediction: DenseVector[Double] 
} 

prediction(ep,fout) 

予測がsbstFunctionとなっている場合があります。私はintelliJでScalaワークシートを使用しています。私は、コードを実行すると、私はエラーを取得していないが、私は数値出力を得ることはありません代わりに私が手:

<function1> res1: Unit =() 

更新:

Column must be in bounds for slice!

:私は、コードを固定しているし、今私は、次のエラーを取得しています

誰かが私が間違っていることを理解できるように助けてくれますか?

答えて

0

Scalaでは、基本的な機能は次のように定義されています。あなたが入力タイプInt、戻り値の型Intと関数本体を定義

def f(x:Int):Int = { 
    x 
} 

あなたは(prediction方式のため)である持っているもの:

def f(x:Int) = (y:Int) => y + x 

どこf戻り、別の機能Int => Int。あなたのケースでは、prediction関数は関数が何も実行されない理由のDenseVector[Double] => DenseVector[Double]を返します。

+0

これを行うと、私のコードにはいくつかの問題が発生し、おそらくそれは私のコードが正しくないことを意味します。助けてくれてありがとう。 – Jamil

1
def prediction(Input: DenseMatrix[Double], outcomes: DenseMatrix[Double]) = 
    (AAprediction: DenseVector[Double]) => { 

これはpredictionの宣言です。 2つの引数をとり、関数を返すメソッドです。それはDenseVector[Double] => DenseVector[Double]を入力した機能がありますように迅速にコードを見て、それが見え、より正確な宣言は次のようになります。基本的に何がprediction(ep,out)でやってする機能を構築している

def prediction(Input: DenseMatrix[Double], 
    outcomes: DenseMatrix[Double]): DenseVector[Double] => DenseVector[Double] 

。はるかに単純な例:

scala> def addConst(x:Int):Int => Int = y => x + y 
addConst: (x: Int)Int => Int 

scala> addConst(10) 
res1: Int => Int = <function1> 

この場合もまた、関数を作成しました。この機能を使用するには、我々は、私はあなたが間違っていたり、誤解しなかった部分を、簡素化されますが、私は間違っていたかを理解するのに十分だろうと信じてres1(5)または

scala> addConst(10)(5) 
res2: Int = 15 
+0

私は、問題は、AApredictionがループの内側に満たされない、または出力がないことだと思います。 – Jamil

0

を呼び出すことができますいずれか、あなたはそれを修正する方法を知っています。

あなたはこのようになり、予測関数定義された:

def prediction(addTo: Int, multiplyBy: Int) = (number: Int) => { (number + addTo) * multiplyBy }

をして、あなたが2つの必要なパラメータを使用し、そして、あなたはこの変数を置き換えるならば、今、それは次のようになります。 prediction(2, 3)

number => (number + 2) * 3 < - これは機能ではありませんか?

最終値を計算するには、anonymous functionの内部にある3番目の引数を使用する必要があります。

だから、私たちの例ではprediction(2, 3)(1)は私たちにあなたがdef addTwoMultiplyByThree = prediction(2, 3) を定義し、複数の他の値でそれを使用することができ、実際の出力9 かを与えるだろう。

+0

これは式 '(number + 2)* 3' – pedrofurla

+0

' number =>(number + 2)* 3'です。これは関数です。 – pedrofurla

関連する問題