2014-10-30 7 views
6

मैंने कहीं पढ़ा है कि एमएलआईबीबी स्थानीय वैक्टर/मैट्रिस वर्तमान में ब्रीज़ कार्यान्वयन को लपेट रहे हैं, लेकिन एमएलआईबीबी को ब्रीज़ वेक्टर/मैट्रिस में परिवर्तित करने के तरीके org.apache.spark.mllib स्कोप के लिए निजी हैं। इसके आसपास काम करने का सुझाव org.apache.spark.mllib.something पैकेज में अपना कोड लिखना है।एमएलआईबीबी टू ब्रीज़ वेक्टर/मैट्रिस org.apache.spark.mllib स्कोप के लिए निजी हैं?

क्या ऐसा करने का कोई बेहतर तरीका है? क्या आप कुछ प्रासंगिक उदाहरण उद्धृत कर सकते हैं?

धन्यवाद और सादर,

उत्तर

2

मैं यह समझ के रूप में, स्पार्क लोगों (ब्रीज सहित) तृतीय पक्ष एपीआई का पर्दाफाश नहीं करना चाहती है ताकि यह अगर वे उनसे दूर जाने का फैसला बदलने के लिए आसान है।

आप हमेशा उस पैकेज में केवल एक साधारण निहित रूपांतरण वर्ग डाल सकते हैं और अपना शेष कोड अपने पैकेज में लिख सकते हैं। बस सब कुछ डालने से ज्यादा बेहतर नहीं है, लेकिन यह थोड़ा और स्पष्ट करता है कि आप इसे क्यों कर रहे हैं।

+1

mllib.linalg पैकेज में कोड डाल mllib ढांचे – javadba

+1

मैं के ग्राहकों के लिए एक व्यवहार्य समाधान नहीं है सहमत हैं कि यह गूंगा है, लेकिन आपको केवल एक छोटी कक्षा (जैसा कि @lev द्वारा देखा गया है) रखना है, और यह सबसे अच्छा कामकाज है जिसमें नीचे दिए गए आपके समाधान जैसे अतिरिक्त सरणी की अनावश्यक रचना शामिल नहीं है। – dlwh

+0

(मुझे लगता है कि अगर वे इसे बदलने का अधिकार सुरक्षित रखना चाहते हैं तो उन्हें केवल "प्रयोगात्मक" के रूप में ब्रीज़ का खुलासा करना चाहिए, लेकिन यह मेरे हाथों से बाहर है।) – dlwh

4

मैंने वही समाधान किया जैसा @dlwh ने सुझाया था।

package org.apache.spark.mllib.linalg 

object VectorPub { 

    implicit class VectorPublications(val vector : Vector) extends AnyVal { 
    def toBreeze : breeze.linalg.Vector[scala.Double] = vector.toBreeze 

    } 

    implicit class BreezeVectorPublications(val breezeVector : breeze.linalg.Vector[Double]) extends AnyVal { 
    def fromBreeze : Vector = Vectors.fromBreeze(breezeVector) 
    } 
} 

सूचना है कि निहित वर्ग AnyVal फैली जब उन तरीकों

+0

यह कोड स्पार्क mllib.linalg पैकेज के अंदर रखा गया है। यह mllib ढांचे के ग्राहकों के लिए एक व्यवहार्य सामान्य समाधान नहीं है: वे ढांचे वर्गों और संकुल को छूना नहीं चाहिए। – javadba

+0

यह spark.mllib.linalg पैकेज में है, लेकिन स्पार्क को इसके लिए पुन: संकलित नहीं किया जाना चाहिए। केवल एक नई असेंबली बनाएं जो मौजूदा स्पार्क असेंबली को लपेटती है, और वहां इस वर्ग को जोड़ें। यह थोड़ी हैकी है, लेकिन यह मुझे सबसे अच्छा मिला है। – lev

+0

इस तरह की सामग्री थोड़ा खतरनाक है। उदाहरण के लिए, यदि आप अपनी हवा वेक्टर का टुकड़ा लेते हैं और इसे 'सेब्रीज़' के साथ लपेटने का प्रयास करते हैं, तो यह असफल हो जाएगा। – VF1

1

यहाँ बुला एक नई वस्तु के आवंटन को रोकने के लिए सबसे अच्छा मैं अब तक राशि है: यहाँ कोड है कि यह करता है। @dlwh पर ध्यान दें: कृपया इसमें कोई भी सुधार प्रदान करें जो आपको हो सकता है।

समाधान मैं के साथ आ सकता है - कि mllib .linalg पैकेज अंदर कोड नहीं डाल करता है - एक नई हवा DenseVector करने के लिए प्रत्येक वेक्टर कन्वर्ट करने के लिए है।

val v1 = Vectors.dense(1.0, 2.0, 3.0) 
val v2 = Vectors.dense(4.0, 5.0, 6.0) 
val bv1 = new DenseVector(v1.toArray) 
val bv2 = new DenseVector(v2.toArray) 
val vectout = Vectors.dense((bv1 + bv2).toArray) 
vectout: org.apache.spark.mllib.linalg.Vector = [5.0,7.0,9.0] 
+0

यह एक अच्छा समाधान प्रतीत होता है, कम से कम मेरे उद्देश्य के लिए काम करता है, लेकिन जब हम 'v1.toArray' करते हैं तो हम 'v1' के सभी तत्व एकत्र कर रहे हैं, जो संभावित रूप से समस्याएं पैदा कर सकता है जब उदाहरण के लिए, 'v1' विशाल है और राम में फिट नहीं हो सकता! –

0

यह समाधान स्पार्क के पैकेज में कोड डालने से बचा जाता है और घने वैक्टर करने के लिए विरल परिवर्तित करने से बचा जाता है:

def toBreeze(vector: Vector) : breeze.linalg.Vector[scala.Double] = vector match { 
     case sv: SparseVector => new breeze.linalg.SparseVector[Double](sv.indices, sv.values, sv.size) 
     case dv: DenseVector => new breeze.linalg.DenseVector[Double](dv.values) 
    } 
संबंधित मुद्दे