2015-05-23 4 views
2

Это моя матрица и я хочу, чтобы извлечь пять первых максимальные показатели каждого столбца в Спарке и Scala, используя Breeze:Как найти пять первых максимальных индексов каждого столбца в матрице?

indices 

    0   0.23 0.20 0.10 0.92 0.33 0.42 
    1   0.10 0.43 0.23 0.15 0.22 0.12 
    2   0.20 0.13 0.25 0.85 0.02 0.32 
    3   0.43 0.65 0.23 0.45 0.10 0.33 
    4   0.31 0.87 0.45 0.63 0.28 0.16 
    5   0.12 0.84 0.33 0.45 0.56 0.83 
    6   0.40 0.22 0.12 0.87 0.35 0.78 
      ... 

(Примечание: индексы не в матрице, просто для демонстрации проблемы лучше)

и ожидаемый результат:

3 4 4 0 5 5 
6 5 5 6 6 6 
4 3 2 2 0 0 
0 1 1 4 4 3 
2 6 3 3 1 2 

я пробовал:

for (i <- 0 until I) { 
     val T = argmax(matrix(::, i)) 
     results(::,i) := T 
    } 

, но он возвращает только первый максимальный индекс.

Может кто-нибудь мне помочь?

+0

PLE ase supply exact scala type вашей коллекции – Odomontois

+0

Я не вижу, как связаны ваши выходные и входные данные. Пожалуйста, объясните более подробно –

+0

argmax() возвращает максимальный индекс не максимальное значение, я хочу что-то вроде этого, но он может вернуть пять первых максимальных индексов. – Rozita

ответ

1

Я думаю, что вы можете использовать немного функционального программирования, которое Scala может предложить вам, Breeze очень полезен для работы, как в matlab, но argmax() дает только индекс, который имеет большее число в векторе , Конечно, вы можете так работать, а затем получить второй больше, а затем третий ..., но здесь у вас есть предложение, я думаю, что это также поможет вашему Spark-коду, чтобы распараллелить и работать с более крупной матрицей, пожалуйста читать комментарии для объяснения, а также не стесняйтесь вносить изменения для того, чтобы получить максимальные возможности использования Spark:

package breeze 

import breeze.linalg.{DenseMatrix } 

/** 
* Created by anquegi on 24/05/15. 
*/ 
object TestMatrix extends App { 

    //This is a DenseMatrix from Breeze, 
    // I suppose that you have something like this 

    val m = DenseMatrix(
    (0.23, 0.20, 0.10, 0.92, 0.33, 0.42), 
    (0.10, 0.43, 0.23, 0.15, 0.22, 0.12), 
    (0.20, 0.13, 0.25, 0.85, 0.02, 0.32), 
    (0.43, 0.65, 0.23, 0.45, 0.10, 0.33), 
    (0.31, 0.87, 0.45, 0.63, 0.28, 0.16), 
    (0.12, 0.84, 0.33, 0.45, 0.56, 0.83), 
    (0.40, 0.22, 0.12, 0.87, 0.35, 0.78)) 

    // Let's work in a mix functional style and iterator working with columns 
    // look at this example 

    val a = m(::, 0) // get the firts column 
    .toArray // pass to scala array for functional usage, you can use then to List 
    .zipWithIndex // now you have and array like [(value0,0),(value1,1) ... (valuen,n)] 
    .sortWith((x, y) => x._1 > y._1) // sort by bigger number 
    .take(5) // get only 5 first numbers 
    .map(x => x._2) // finally get the indexes 

    //now we have to loop for each colum 
    // prepare the matrix and get the Vector(indexes,Array[Int],Array[Int]) 

    val listsOfIndexes = for (i <- Range(0, m.cols)) 
    yield m(::, i).toArray 
    .zipWithIndex 
    .sortWith((x, y) => x._1 > y._1) 
    .take(5) 
    .map(x => x._2) 

    //finally conver to a DenseMatrix 

    val mIndex = DenseMatrix(listsOfIndexes.map(_.toArray): _*).t 

    println(mIndex) 

} 

и результат:

[info] Running breeze.TestMatrix 
3 4 4 0 5 5 
6 5 5 6 6 6 
4 3 2 2 0 0 
0 1 1 4 4 3 
2 6 3 3 1 2 
[success] Total time: 5 s, completed 24/05/2015 16:59:43