2017-10-19 8 views
0

및 IDF에 대한 유효한 입력 RDD 변환 이 출력을 얻으십시오 :는 다음 코드를 사용하여 CSV 파일을 포함하는 디렉토리의 불꽃 mllib 알고리즘을 사용하여 내가 TF를 계산하고 kmeans

[SparseVector(1048576, {812399: 4.3307}), SparseVector(1048576, {411697: 
0.0066}), SparseVector(1048576, {411697: 0.0066}), SparseVector(1048576, 
{411697: 0.0066}), SparseVector(1048576, {411697: 0.0066}), .... 

나는 또한있다 이 샘플 테스트 케이스

0.0 0.0 0.0 
0.1 0.1 0.1 
0.2 0.2 0.2 
9.0 9.0 9.0 
9.1 9.1 9.1 
9.2 9.2 9.2 

from __future__ import print_function 

import sys 

import numpy as np 
from pyspark import SparkContext 
from pyspark.mllib.clustering import KMeans 

runs=4 

def parseVector(line): 
return np.array([float(x) for x in line.split(' ')]) 

if __name__ == "__main__": 
if len(sys.argv) != 3: 
    print("Usage: kmeans <file> <k>", file=sys.stderr) 
    exit(-1) 
sc = SparkContext(appName="KMeans") 
lines = sc.textFile(sys.argv[1]) 
data = lines.map(parseVector) 
k = int(sys.argv[2]) 
model = KMeans.train(data, k, runs) 
print("Final centers: " + str(model.clusterCenters)) 
print("Total Cost: " + str(model.computeCost(data))) 
sc.stop() 

하고 그것을 잘 작동합니다 다음 KMeans mllib 알고리즘을 STED.

이제 위의 tfidf에서 rdd 출력을 KMeans 알고리즘에 적용하려고합니다. 위의 샘플 텍스트와 같이 rdd를 어떻게 변환 할 수 있는지, 또는 KMeans 알고리즘에서 rdd를 올바르게 분할하는 방법을 모르겠습니다. 제대로 작동합니다.

정말이 도움말이 필요합니다.

UPDATE

내가 입력을 읽을 수

내가 아니라고이

(1048576,[155412,857472,756332],[1.75642010278,2.41857747478,1.97365255252]) 
(1048576,[159196,323305,501636],[2.98856378408,1.63863706713,2.44956728334]) 
(1048576,[135312,847543,743411],[1.42412015238,1.58759872958,2.]) 

UPDATE2 같은 텍스트 파일에서 KMeans mllib에 적용하는 방법을 내 진짜 질문은 확실히하지만 난 내가 위의 벡터에서 KMeans mllib 알고리즘에 직접 적용 할 수 있도록 아래의 배열로 이동해야한다고 생각

1.75642010278 2.41857747478 1.97365255252 
2.98856378408 1.63863706713 2.44956728334 
1.42412015238 1.58759872958 2.

답변

1

IDF의 출력은 SparseVector의 데이터 프레임입니다. KMeans는 벡터를 입력 (희소 또는 밀도)으로 사용하므로 변환을 할 필요가 없습니다. IDF의 출력 열을 KMeans의 입력으로 직접 사용할 수 있어야합니다.

TFIDF와 KMeans를 실행하는 사이에 데이터를 디스크에 저장해야한다면 데이터 프레임 API를 통해 CSV로 저장하는 것이 좋습니다.

먼저 를 사용하여 dataframe로 변환 :

df.write.parquet('/path/to/save/file') 
: 마루 파일로 dataframe을 저장

df = tfidf.map(lambda x: (x,)).toDF(["features"]) 

변환 후 : 수입없이 변환 할

from pyspark.sql import Row 

row = Row("features") # column name 
df = tfidf.map(row).toDF() 

다른 방법을

데이터를 읽으려면 다음을 사용하십시오.

from pyspark.sql import SQLContext 
sqlContext = SQLContext(sc) 

df = sqlContext.read.parquet('/path/to/file') 

# converting from dataframe into an RDD[Vector] 
data = df.rdd.map(list) 

어떤 경우에 당신이 문자열로 저장 벡터로 변환해야하는 경우 6,, 즉도 가능하다. 다음은 몇 가지 예제 코드입니다 :

from pyspark.mllib.linalg import Vectors, VectorUDT 
from pyspark.sql.functions import udf 

df = sc.parallelize(["(7,[1,2,4],[1,1,1])"]).toDF(["features"]) 

parse = udf(lambda s: Vectors.parse(s), VectorUDT()) 
df.select(parse("features")) 

먼저 예제 데이터 프레임이 동일한 형식으로 만들어집니다. 그런 다음 UDF을 사용하여 문자열을 벡터로 구문 분석합니다. 데이터 프레임 대신 rdd를 원한다면, "parquet로부터 읽음"부분에서 위의 코드를 사용하여 변환하십시오.


그러나, IDF의 출력은 매우 희소합니다. 벡터의 길이는 1048576이며이 중 하나만 1보다 큰 값을 갖습니다. KMeans는 흥미로운 결과를주지 않습니다.

대신 word2vec을 살펴 보시기 바랍니다. 각 단어에 대해보다 컴팩트 한 벡터를 제공하며 이러한 벡터를 클러스터링하는 것이 더 합리적입니다. 이 방법을 사용하면 클러스터링에 사용할 수있는 벡터 표현에 단어 맵을 수신 할 수 있습니다.

+0

Thx 답장을 보내었지만 tfidf의 출력을 사용할 때 (tf idf 코드의 마지막 줄에서 볼 수 있듯이 텍스트 파일로 저장 됨)이 errorTypeError가 발생합니다. 형식 를 벡터로 변환합니다. – Gmilios

+0

@Gmilios 기본적으로 문제는 tfidf에서 데이터를 저장 한 다음 KMeans 전에 다시 읽는 것입니다. – Shaido

+0

@Gmilios이 질문에 대한 답변을 추가했습니다. – Shaido