■google

■最近のコメント
■最近のトラックバック
■最近の記事
■月別アーカイブ
■ブログランキング
■ブログ検索

■ブロとも申請フォーム
■リンク
■RSSフィード
スポンサーサイト
上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。


スポンサー広告 | --:--:--
共起性尺度
共起尺度について説明します。

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

例えば、
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(6)
偏相関
とある課題に取り組むときに,
偏相関のプログラムを書きました.
といっても,非常に簡単なものです.

XとZに正の相関があり,
YとZに正の相関があるとき,

XとYには,みかけ上の相関(擬似相関)
が見られてしまいます.

そこで,Zの影響を取り除いて,
XとYの相関を見るときに,
偏相関を使います.


以下にプログラムを載せます.
相関関係を見たい変数をx,y,
影響を取り除きたい変数をzとしたときです.


#偏相関
par.cor<-function(x,y,z){
r.x.y<-cor(x,y)
r.y.z<-cor(y,z)
r.z.x<-cor(z,x)
par.r<-(r.x.y-r.z.x*r.y.z)/((sqrt(1-(r.z.x)^2))*(sqrt(1-(r.y.z)^2)))
return(par.r)
}


プログラム | 11:33:40 | Trackback(0) | Comments(0)
プログラム作成の基本
Rでは関数を定義し、実行することができます。

関数は基本的に
>関数名<-function(引数){計算式}
こんな感じで定義します。

計算式のところには
if文やfor文を書くこともできます。
javaとほぼ一緒です。


条件分岐
>if(条件式){TRUEのとき実行される式}
else{条件式がFALSEのとき実行される式}


繰り返し文
>for(i in 範囲){繰り返す式}
>while(条件式){繰り返す式}



また、条件式で二つの条件を組み合わせたいときには
&&(かつ)、||(または)を用います。




プログラム | 15:16:57 | Trackback(0) | Comments(0)

FC2Ad

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。