2016-11-09 1 views
2

항목 간 유사성이 필요한 항목 기반 협업 필터를 만들고 있습니다. 나는 아래와 같은 행렬을 만드는 것이 좋지만, 이제는 double을 계산하지 못하게하고 싶다.두 배가없는 행렬 채우기

예를 들어 설명해 드리겠습니다. 5 가지 항목의 목록이 있다고 가정합니다. 각 항목은 유사도를 기반으로 등급이 매겨집니다.

 I1 | I2 | I3 | I4 | I5 | 
I1 | 1 | 0.5| 0.3| 0.2| 0.9| 
I2 | 0.5| 1 | 0.2| 0.1| 0.8| 
I3 | 0.3| 0.2| 1 | 0.5| 0.1| 
I4 | 0.2| 0.1| 0.5| 1 | 0.7| 
I5 | 0.9| 0.8| 0.1| 0.7| 1 | 

나는 다음과 같은 코드로이 일을 해요 :

//allItems is a list of the 5 items 
foreach (var item1 in allItems) 
    foreach (var item2 in allItems) 
     ComputeSimilarity(item1, item2); 

//ComputeSimilarity(); returns a double, a.k.a. the similarity between items 

당신은 함수의 내부 동작을 무시할 수

유사성을 계산 한 후, 나는 다음과 같은 행렬에 올라와있다 이후 잘 작동, 난 그냥 코드를 변경 알아낼 수 없어 모든 것을 두 번 계산하지 않습니다.

계산 된 행렬을 이렇게 보이게하려면이 함수를 어떻게 변경할 수 있습니까?

 I1 | I2 | I3 | I4 | I5 | 
I1 | | 0.5| 0.3| 0.2| 0.9| 
I2 | | | 0.2| 0.1| 0.8| 
I3 | | | | 0.5| 0.1| 
I4 | | | | | 0.7| 
I5 | | | | | | 

더 자세히 설명해야하는지 알려주세요. 미리 감사드립니다!

+0

을 시도! = item2) ComputeSimilarity (item1, item2); ' – Pikoh

+0

@ Monzhu, 알아요. 그래서 내가 "첫 번째 아이디어"라고 말합니다. – Pikoh

답변

1

당신은 계산하기 전에 검사를 추가 할 수

for (int i = 0; i < allItems.Count;i++) 
    for (int j = 0; j < allItems.Count; j++) 
     if(i<j) 
     ComputeSimilarity(allItems[i], allItems[j]); 
+0

이것은 매우 훌륭하고 간단했습니다. 감사합니다! – RandomStranger

+0

위대한 당신, 환영합니다 – fubo

2

이 그것을 수행해야합니다

int n = allItems.Length; 

double[,] similarity = new double[n,n]; 

for (int i = 0; i < n; ++i) 
{ 
    for (int j = i + 1; j < n; ++j) 
    { 
     similarity[i, j] = computeSimilarity(allItems[i], allItems[j]); 
    } 
} 
+0

그리고 이것을 SQL 데이터베이스에 저장하는 방법을 순전히 들여다 보면서 목록에 이러한 항목을 넣을 수 있습니까? – RandomStranger

+0

@Bas 예, '유사도 [i, j] = computeSimilarity (allItems [i], allItems [j]);'대신에 myList.Add (compItems [i], allItems [j])); ' –

0

어떤`경우 (항목 1에 대한 최초의 아이디어로이

 double val; 
     for (int i = 0; i < allItems.Count; i++) 
     { 
      for (int j = i; j < allItems.Count; j++) 
      { 
       if (i!=j) 
        val = ComputeSimilarity(allItems[i], allItems[j]); 
      } 
     } 
+0

나는 그것이'if (i Pikoh

+0

@Pikoh, nope이어야한다고 생각한다. 그것을 실행하면 OP의 "desired"계산 된 행렬에 정확하게 표시되는 i-j 요소를 반환합니다 – user3598756

+0

맞습니다. 나는'int j = i' 부분을 놓쳤습니다. 죄송합니다 :) – Pikoh