2017-01-04 3 views
0

목표는 Python 또는 PySpark를 사용하여 KDE (Kernel Density Estimate) 모델을 큰 2 차원 데이터 세트에 맞추고 적합 모델을 사용하여 다른 2 차원 데이터 세트의 밀도를 예측하는 것입니다.PySpark의 다차원 KDE

필자는 MLlib를 사용할 수있는 Spark RDD 개체에 교육 데이터를 가지고 있습니다. X은 (i, j) th 배열의 요소가 th 예의 '012'를 나타내는 '점수'를 나타내는 경우, 번째 기능의 파이썬 목록 목록입니다.

from pyspark.mllib.stat import KernelDensity 

sample = sc.parallelize(X) 
kd = KernelDensity() 
kd.setBandwidth(0.2) 
kd.setSample(sample) 

이 모델을 사용하여 다른 2 차원 데이터 세트의 밀도를 계산하고 싶습니다. I 데이터의 작은 세트를 간단하게하기 위해 계산을 수행

--------------------------------------------------------------------------- 
Py4JJavaError        Traceback (most recent call last) 
<ipython-input-140-7fdd873f4c51> in <module>() 
----> 1 kd.estimate(sample2) 

/usr/local/spark/python/pyspark/mllib/stat/KernelDensity.pyc in estimate(self, points) 
    56   points = list(points) 
    57   densities = callMLlibFunc(
---> 58    "estimateKernelDensity", self._sample, self._bandwidth, points) 
    59   return np.asarray(densities) 

/usr/local/spark/python/pyspark/mllib/common.pyc in callMLlibFunc(name, *args) 
    128  sc = SparkContext.getOrCreate() 
    129  api = getattr(sc._jvm.PythonMLLibAPI(), name) 
--> 130  return callJavaFunc(sc, api, *args) 
    131 
    132 

/usr/local/spark/python/pyspark/mllib/common.pyc in callJavaFunc(sc, func, *args) 
    121  """ Call Java Function """ 
    122  args = [_py2java(sc, a) for a in args] 
--> 123  return _java2py(sc, func(*args)) 
    124 
    125 

/usr/local/spark/python/lib/py4j-0.10.1-src.zip/py4j/java_gateway.py in __call__(self, *args) 
    931   answer = self.gateway_client.send_command(command) 
    932   return_value = get_return_value(
--> 933    answer, self.gateway_client, self.target_id, self.name) 
    934 
    935   for temp_arg in temp_args: 

/usr/local/spark/python/pyspark/sql/utils.pyc in deco(*a, **kw) 
    61  def deco(*a, **kw): 
    62   try: 
---> 63    return f(*a, **kw) 
    64   except py4j.protocol.Py4JJavaError as e: 
    65    s = e.java_exception.toString() 

/usr/local/spark/python/lib/py4j-0.10.1-src.zip/py4j/protocol.py in get_return_value(answer, gateway_client, target_id, name) 
    310     raise Py4JJavaError(
    311      "An error occurred while calling {0}{1}{2}.\n". 
--> 312      format(target_id, ".", name), value) 
    313    else: 
    314     raise Py4JError(

Py4JJavaError: An error occurred while calling o1734.estimateKernelDensity. 
: java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Double 
    at scala.runtime.BoxesRunTime.unboxToDouble(BoxesRunTime.java:114) 
    at scala.runtime.ScalaRunTime$.array_update(ScalaRunTime.scala:93) 
    at scala.collection.IterableLike$class.copyToArray(IterableLike.scala:254) 
    at scala.collection.AbstractIterable.copyToArray(Iterable.scala:54) 
    at scala.collection.TraversableOnce$class.copyToArray(TraversableOnce.scala:278) 
    at scala.collection.AbstractTraversable.copyToArray(Traversable.scala:104) 
    at scala.collection.TraversableOnce$class.toArray(TraversableOnce.scala:286) 
    at scala.collection.AbstractTraversable.toArray(Traversable.scala:104) 
    at org.apache.spark.mllib.api.python.PythonMLLibAPI.estimateKernelDensity(PythonMLLibAPI.scala:1067) 
    at sun.reflect.GeneratedMethodAccessor39.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
    at java.lang.reflect.Method.invoke(Method.java:498) 
    at py4j.reflection.MethodInvoker.invoke(MethodInvoker.java:237) 
    at py4j.reflection.ReflectionEngine.invoke(ReflectionEngine.java:357) 
    at py4j.Gateway.invoke(Gateway.java:280) 
    at py4j.commands.AbstractCommand.invokeMethod(AbstractCommand.java:128) 
    at py4j.commands.CallCommand.execute(CallCommand.java:79) 
    at py4j.GatewayConnection.run(GatewayConnection.java:211) 
    at java.lang.Thread.run(Thread.java:745) 

I는 RDD, pyspark의 dataframe에 sample2 변환 시도하고있다 : 이때

sample2 = [[1.0, 2.2],[3.1,0.9]] 
kd.estimate(sample2) 

, PySpark 에러가 발생 그러나 이것들은 여러가지 다른 에러를 준다.

왜이 오류가 발생하는지 궁금합니다. 견적 메소드에 대한. 서에서는 목록 오브젝트가 입력으로 전달되어야한다고 설명합니다. 목록의 목록을 수용 할 수 없는가?

아마도이 코드에 맞게 sklearn의 KDE 모델을 사용할 수 있지만 데이터 크기가 크기 때문에 Spark을 사용하기를 바랬습니다. sklearn을 사용하여 빠르고 확장 가능한 방식으로이를 수행 할 수있는 영리한 방법이 있다면 해당 경로를 취하는 방법에 대한 제안을받을 수 있습니다.

답변

0

나는 KDE 구현이 단발적이라고 믿습니다. 다른 말로 표현하자면, 당신은 단지 하나의 값 배열만을 제공 할 수 있다고 믿습니다. 아마 당신의 캐스팅 오류가 어디에서 왔는지.

java.lang.ClassCastException: java.util.ArrayList cannot be cast to java.lang.Double 

두 배의 목록이 필요하며 목록의 목록을 제공합니다. 그러므로 왜 그것이 두 배로 명단을 던질 수 없다고 말하는가.

문서보기 : http://spark.apache.org/docs/latest/api/python/pyspark.mllib.html#pyspark.mllib.stat.KernelDensity