fc2ブログ
 
■google

■最近のコメント
■最近のトラックバック

■最近の記事
■月別アーカイブ
■ブログランキング
■ブログ検索

■ブロとも申請フォーム
■リンク
■RSSフィード
共起性尺度
共起尺度について説明します。

共起とは、まさに
ある一組の「共に起きる」程度を表したものです。

例えば、
amazonで本を検索するときに、
この商品を買っている人は、この本も買っています
と紹介されますが、それは、過去の購買データから、
共起が高い商品を勧めているのです。

共起尺度として、
主なものは、
共起頻度、Jaccard係数、Simpson係数、コサイン距離があります。

これらの指標について、「X」と「Y」という一組の共起性がどう測られるか示します
「X」と「Y」の単独での出現数を|X|、|Y|、
どちらか一方が出現した回数を|X∪Y|、
両方が出現した回数を|X∩Y|とします。

A)共起頻度
共起の回数であり、 |X∩Y|で計算される。

B)Jaccard係数
どちらかが出現したうち、何回同時に出現するかで、
|X∩Y|/|X∪Y|で計算される

C)Simpson係数
Jaccard係数の場合、多くと共起している場合、
小さくなってしまいます。(分母が大きくなる)
そういったときには、分母にminを使っているSimpson係数が便利
計算は、
|X∩Y|/min(|X|,|Y|)です

(D)コサイン距離
値としては、Jaccard係数とSimpson係数の中間くらいです
ベクトル間の距離を測るものです
計算は、
|X∩Y|/sqrt(|X||Y|)です

どれも、0-1の間に収まります。
データによって、どの指標が適しているのかは違いますので
是非比べてみてください。

おすすめの参考文献は
松尾豊,友部博教,橋田浩一, 中島秀之,石塚満(2005)「Web上からの人間関係ネットワークの抽出」人工知能学会論文誌20巻1号
です

さて、これらの指標を計算するプログラムを紹介します。
以前書いたもので
今見るともっともっと簡潔に書けそうではあります。

関数を書くときには、
「後でも修正できるようにわかりやすく!」
「できるだけ早く計算できるように!」
というバランスが結構難しいのですね。。。

■Jaccard係数
jaccard.function<-function(x){#jaccard係数を行列で返す関数。
#構造:キーワード毎の個人が要素になる集合を生成し、和集合、積集合を求める。
     for(i in 1:nrow(x)){
for(j in 1:ncol(x)){
if(x[i,j]!=0)x[i,j]<-i # 値が0以外のところに列番号を代入
}
}
J<-matrix(0,nrow=ncol(x),ncol=ncol(x)) #(キーワード数)×(キーワード数)の行列を準備
for(k in 1:ncol(x)){ #Jaccard係数の計算
for(l in 1:ncol(x)){
A<-x[,k] #あるワードに属する個人が要素となる集合A
A<-A[A != 0] #集合Aから0を取り除く。
B<-x[,l] #同様に、集合Bを生成。
B<-B[B != 0] #集合Bから0を取り除く。
J[k,l]<-(length(intersect(A,B))/length(union(A,B))) #積集合/和集合
}
}
rownames(J)<-colnames(x) #行名の付与
colnames(J)<-colnames(x) #列名の付与(行名、列名は同じ)
return(J) #jaccard係数の行列を返す。
}



■Simpson係数 simpson.function<-function(x){#シンプソン係数の計算
simpson<-matrix(NA,ncol=ncol(x),nrow=ncol(x)) #Simpson係数を格納する行列
for(i in 1:ncol(x)){
for(j in 1:ncol(x)){ # Simpson係数の算出
simpson[i,j]<-(x[,i]%*%x[,j])/(min(sum(x[,i]),sum(x[,j])))
}
}
rownames(simpson)<-colnames(x) #行名の付与
colnames(simpson)<-colnames(x) #列名の付与(行名、列名は同じ)
return(simpson) #Simpson係数の行列を返す
}



■コサイン距離
cosine.function<-function(x){#列ベクトルのコサイン距離の計算
col.similarity<-matrix(NA,ncol=ncol(x),nrow=ncol(x)) #コサイン距離を格納する行列
for(i in 1:ncol(x)){
for(j in 1:ncol(x)){ #コサイン距離の算出
col.similarity[i,j]<-(x[,i]%*%x[,j])/(sqrt(sum(x[,i]^2))*sqrt(sum(x[,j]^2)))
}
}
rownames(col.similarity)<-colnames(x) #列名の付与
colnames(col.similarity)<-colnames(x) #行名の付与
return(col.similarity) #コサイン距離の行列を返す
}



以下に例を示します。
多くの場合
Jacard係数 < コサイン距離 < Simpson係数
という傾向にあります。
共起尺度の例

すみません、クリックで見れます

共著関係の分析、
検索語で同時に検索される言葉、
レストランでの注文、
調理する食材・・・etc
色々な場面で使えそうです


※たいしたものではありませんが、研究等でこのプログラムを使われる際には、
必ず参考文献に入れてくださいね.

スポンサードリンク

スポンサーサイト





プログラム | 23:45:45 | Trackback(0) | Comments(4)
コメント
コサイン距離の関数
以下のようにすると300倍ほど速いです

cosine.function2 <- function(x)
{
x <- as.matrix(x)
ss <- 1/sqrt(colSums(x^2))
col.similarity <- t(x) %*% x*outer(ss, ss)
colnames(col.similarity) <- rownames(col.similarity) <- colnames(x)
return(col.similarity)
}
2009-11-17 火 22:05:04 | URL | 河童の屁 [編集]
御礼
返信遅くなり申し訳ありません。
ご指摘ありがとうございます。
2010-01-03 日 20:59:37 | URL | 管理者 [編集]
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
2010-12-16 木 12:58:03 | | [編集]
管理人のみ閲覧できます
このコメントは管理人のみ閲覧できます
2013-07-12 金 18:54:55 | | [編集]