এমন কোনও আর ফাংশন রয়েছে যা কোসিনের ভিন্নতা ম্যাট্রিক্স গণনা করবে? [বন্ধ]


20

আমি কোসাইন দূরত্বের ভিত্তিতে সারি ক্লাস্টারিং সহ একটি হিটম্যাপ তৈরি করতে চাই। আমি আর ব্যবহার করছি heatmap.2()এবং চিত্র তৈরির জন্য। আমি দেখতে পাচ্ছি যে এর মধ্যে একটি distপ্যারামিটার রয়েছে heatmap.2তবে কোসাইন ভিন্নতা ম্যাট্রিক্স উত্পন্ন করার জন্য আমি কোনও ফাংশন খুঁজে পাচ্ছি না। বিল্টিন distফাংশন কোসাইন দূরত্বগুলি সমর্থন করে না, আমি arulesএকটি dissimilarity()ফাংশন সহ ডাকা একটি প্যাকেজও পেয়েছি তবে এটি কেবল বাইনারি ডেটাতে কাজ করে।


5
আপনার নিজস্ব কোসাইন ভিন্নতা ফাংশন লিখতে এটি আরও দ্রুত হতে পারে।
অনুমানযোগ্য

2
কোসিন হ'ল মিল, ভিন্নতা নয়। তবে, আপনি কোসাইনকে স্কেলড ডেটার ইউক্যালিডিয়ান দূরত্বে পরিণত করতে পারেন: d = sqrt (2 * (1-কোস))।
ttnphns

উত্তর:


29

@ ম্যাক্স মন্তব্যগুলিতে যেমন ইঙ্গিত করেছেন (+1) অন্য কোথাও এটির জন্য সময় ব্যয় করার চেয়ে "নিজের লিখতে" সহজ হবে। আমরা জানি, কোসাইন আদল দুই ভেক্টর মধ্যে একজন,বি দৈর্ঘ্যের এন হয়

সি=Σআমি=1এনএকজনআমিবিআমিΣআমি=1এনএকজনআমি2Σআমি=1এনবিআমি2

যা উত্পন্ন করার জন্য সহজ R। আসুন Xম্যাট্রিক্স হোন যেখানে সারিগুলি হল মানগুলি যা আমরা এর মধ্যে সাদৃশ্য গণনা করতে চাই। তারপরে আমরা নিম্নলিখিত Rকোডের সাথে মিলটির ম্যাট্রিক্স গণনা করতে পারি :

cos.sim <- function(ix) 
{
    A = X[ix[1],]
    B = X[ix[2],]
    return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
}   
n <- nrow(X) 
cmb <- expand.grid(i=1:n, j=1:n) 
C <- matrix(apply(cmb,1,cos.sim),n,n)

তারপরে ম্যাট্রিক্স Cহ'ল কোসাইন সাদৃশ্য ম্যাট্রিক্স এবং আপনি এটি পছন্দ করেন এমন হিটম্যাপ ফাংশনটি (কেবলমাত্র যার সাথে আমি পরিচিত image()) তা এটি পাস করতে পারেন ।


ধন্যবাদ, এটি সহায়ক। আসলে, আমি নিজেই ম্যাট্রিক্স প্লট করতে চাই না বরং আমার কাছে থাকা অন্য হিটম্যাপের ক্লাস্টারিংয়ের জন্য একটি দূরত্বের ফাংশন রাখতে হবে।
গ্রেগ স্লোডকোভিজ

@ গ্রেগস্লোডকোভিজ, ঠিক আছে সম্ভবত আপনি এই ম্যাট্রিক্সটি আপনি যে ফাংশনটি ব্যবহার করছেন তাতে পাস করতে পারেন। এছাড়াও, যদি আপনি এই উত্তরটি সহায়ক খুঁজে পেয়েছেন তবে দয়া করে একটি উর্ধ্বতন বিবেচনা করুন (বা উত্তরটিকে যদি আপনি এটি চূড়ান্ত মনে করেন তবে) :)
ম্যাক্রো

দুর্দান্ত, আপনার জবাব এবং টিএনএফএনএসের মন্তব্যে ধন্যবাদ আমি যা চাই তা করতে সক্ষম হয়েছি। কলাম ক্লাস্টারিংয়ের চেয়ে সারিগুলিতে ক্লাস্টার করার সময় আমি আলাদা মেট্রিক পেতে চাই তবে সম্ভবত এটি এটিকে চাপ দিচ্ছে ...
গ্রেগ স্লোডকোভিজ

স্পষ্টতই আমার মন্তব্য করতে সক্ষম হওয়ার মতো পর্যাপ্ত পয়েন্ট নেই। আমি ম্যাক্রোর দুর্দান্ত উত্তরের একটি সামান্য পরিবর্তিত সংস্করণ সরবরাহ করতে চেয়েছিলাম। এটা এখানে. # মাইক্রো দ্বারা চিরাজবি'র কোস্ট.সিমের সংস্করণ () যেখানে এস = এক্স% *% টি (এক্স) কোস্ট.সিম 2 <- ফাংশন (এস, আইএক্স) {i <- ix [1] জে <- ix [2 ] ফিরুন (এস [আই, জে] / এসকিআরটি (এস [আই, আই] * এস [জে, জে)))} # টেস্ট এক্স <- ম্যাট্রিক্স (রনরম (২০), সরু = 5, এনসিওএল = 4) এস < - এক্স% *% টি (এক্স) এন <- আরো (এক্স) আইডিএক্স.আর <- প্রসারিত.grit (i = 1: n, j = 1: n) সি <- ম্যাট্রিক্স (প্রয়োগ (আইডিএক্স.আর, 1, cos.sim, X), n, n) C2 <- ম্যাট্রিক্স (প্রয়োগ (idx.arr, 1, cos.sim.2, S), n, n) আমি গ্লোবাল ভেরিয়েবল পছন্দ করি না, এজন্য আমি এসকে অন্তর্ভুক্ত করেছি প্যারামিটার হিসাবে
চিরাজ বেনআবেডেলকাডার


4

নিম্নলিখিত ফাংশনটি 1-ডি ভেক্টরের পরিবর্তে ম্যাট্রিক্সের সাথে কাজ করার সময় কার্যকর হতে পারে:

# input: row matrices 'ma' and 'mb' (with compatible dimensions)
# output: cosine similarity matrix

cos.sim=function(ma, mb){
  mat=tcrossprod(ma, mb)
  t1=sqrt(apply(ma, 1, crossprod))
  t2=sqrt(apply(mb, 1, crossprod))
  mat / outer(t1,t2)
}

4

উপরের কিছু উত্তর গণনাগতভাবে অক্ষম, এটি চেষ্টা করুন;


কোসাইন মিলের জন্য ম্যাট্রিক্স

Matrix <- as.matrix(DF)
sim <- Matrix / sqrt(rowSums(Matrix * Matrix))
sim <- sim %*% t(sim)

কোসাইন ভিন্নতা ম্যাট্রিক্স (দূরত্বের ম্যাট্রিক্স) এ রূপান্তর করুন।

D_sim <- as.dist(1 - sim)

0

এই ইস্যুতে পূর্ববর্তী কয়েকটি কোড (@ ম্যাক্রো থেকে) র‌্যাম্প করা, আমরা এটিকে নিম্নের একটি ক্লিনার সংস্করণে গুটিয়ে রাখতে পারি:

df <- data.frame(t(data.frame(c1=rnorm(100),
                              c2=rnorm(100),
                              c3=rnorm(100),
                              c4=rnorm(100),
                              c5=rnorm(100),
                              c6=rnorm(100))))

#df[df > 0] <- 1
#df[df <= 0] <- 0



apply_cosine_similarity <- function(df){
  cos.sim <- function(df, ix) 
  {
    A = df[ix[1],]
    B = df[ix[2],]
    return( sum(A*B)/sqrt(sum(A^2)*sum(B^2)) )
  }   
  n <- nrow(df) 
  cmb <- expand.grid(i=1:n, j=1:n) 
  C <- matrix(apply(cmb,1,function(cmb){ cos.sim(df, cmb) }),n,n)
  C
}
apply_cosine_similarity(df)

আশাকরি এটা সাহায্য করবে!

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.