0

k-Meansを実装しています。これは私の主なデータ構造です:

dt1 は {Filename,featureVector,GroupItBelongsTo} を持つ Data.table です

dt1<- data.table(Filename=files[1:limit],Vector=list(),G=-1)
setkey(dt1,Filename)

featureVector はリストです。出現に関連付けられた単語があり、次の行を使用して各単語に出現を追加しています。

featureVector[[item]] <- emaildt[email==item]$N

私が電話をかけたときの私のコンソールからの典型的な抜粋は次のとおりdt1です。

   Filename                          Vector          G
1: 000057219a473629b53d33cfedef590f.txt 1,1,1,1,1,1, 3
2: 00007afb5a5e467a39e517ae87e7fad5.txt 0,0,0,0,0,0, 3
3: 000946d248fdb1d5d05c59a91b00e8f2.txt 0,0,0,0,0,0, 3
4: 000bea8dc6f716a2cac6f25bdbe09073.txt 0,0,0,0,0,0, 3

グループ番号ごとに新しい重心を計算したいと思います。つまり、位置1のすべてのベクトル位置を互いに合計したい、[2]など..最後まで、その後-それらすべてを平均します。

例: v1=[1,1,1]、v2=[2,2,2]、重心は = c1=[1,5;1,5;1,5]

私はやろうとしました: sapply(dt1[tt]$Vector,mean) (「合計」でも試しました)、列ごと(各n番目のコンポーネント)ではなく、行ごとに(各ベクトル内で)合計して「意味」します私がやりたいように。

どうやってするの?

====更新、コメントで質問に答える====

> head(dt1)

       Filename                         Vector       G
1: 000057219a473629b53d33cfedef590f.txt 1,1,1,1,1,1, 1
2: 00007afb5a5e467a39e517ae87e7fad5.txt 0,0,0,0,0,0, 1
3: 000946d248fdb1d5d05c59a91b00e8f2.txt 0,0,0,0,0,0, 3
4: 000bea8dc6f716a2cac6f25bdbe09073.txt 0,0,0,0,0,0, 4
5: 000fcfac9e0a468a27b5e2ad0f78d842.txt 0,0,0,0,0,0, 1
6: 00166a4964d6c939f8f62280b85e706d.txt 0,0,0,1,0,0, 1
> class(dt1)
[1] "data.table" "data.frame"
>  

入力dt1$Vectorすると次のようになります (私は小さなサンプルをコピーしただけです。もっと多くの単語がありますが、すべて同じように見えます):

[[1]]
homosexuality       articles         church         people       interest 
         1              1              1              1              1 
    thread          email           send        warning          worth 
         1              1              1              1              1 

そして、これがclass()出力です

> class(dt1$Vector)
[1] "list"

入力時のスクリーンショット:

 A<-as.matrix(t(as.data.frame(dt1$Vector)))

(A) の先頭の結果。ここで、A は as.matrix(t(as.data.frame(dt1$Vector))) です。

の結果class(dt1$Vector[[1]]):

[1] "numeric"
4

1 に答える 1

3

まず、(必須) R 関数kmeansを使用して k-means クラスタリングを行うことを検討してください。自分で作成したい場合は、次のようにデータ テーブルの重心を簡単に計算できます。まず、あなたのようなランダム データを作成します。

> set.seed(123)
> dt<-data.table(name=LETTERS[1:20],replicate(5,sample(0:4,20,T)),G=sample(3,20,T))
> head(dt)
   name V1 V2 V3 V4 V5 G
1:    A  1  4  0  3  1 2
2:    B  3  3  2  0  3 1
3:    C  2  3  2  1  2 2
4:    D  4  4  1  1  3 3
5:    E  4  3  0  4  0 2
6:    F  0  3  0  2  2 3

重心は 1 行で計算できます。

> dt[,lapply(.SD[,-1],mean),by=G]
   G       V1       V2   V3       V4       V5
1: 2 2.375000 2.250000 1.25 2.125000 2.250000
2: 1 2.800000 2.400000 2.40 1.800000 1.400000
3: 3 1.714286 2.428571 1.00 2.142857 1.857143

これを行う場合は、データ テーブルから名前を (一時的に) 削除することをお勧めします。その場合は、次のようにします。

> dt2<-copy(dt)
> dt2$name<-NULL
> dt2[,lapply(.SD,mean),by=G]
   G       V1       V2   V3       V4       V5
1: 2 2.375000 2.250000 1.25 2.125000 2.250000
2: 1 2.800000 2.400000 2.40 1.800000 1.400000
3: 3 1.714286 2.428571 1.00 2.142857 1.857143

編集: @Roland によって提案された、これを行うためのより良い方法は、次を使用すること.SDcolsです。

dt[,lapply(.SD,mean),by=G,.SDcols=2:6]
于 2013-10-11T20:58:30.893 に答える