2013-05-24 4 views
2

Я хочу вычислить сходство косинусов между 1 (ID1) и 3 (ID1) в PHP. формула будет что-то вроде этого:Косинус сходства в PHP

similarity = (1.1 * 3.1 + 1.4 * 3.4)/(((1.1)^2+(1.3)^2+(1.4)^2)^0.5)(((3.1)^2+(3.4)^2)^0.5) = (4*4+8*4)/(((16+16+64)^0.5)(16+16)^0.5)) 

Мой набор данных выглядит следующим образом:

ID1 ID2 Value 
1  1  4  
1  3  4  
1  4  8  
3  1  4  
3  4  4  
4  1  8  
4  3  4 

Есть ли алгоритм для вычисления косинуса подобия в PHP для этого?

+0

алгоритмы должны быть от языка. Вы имеете в виду, что ищете реализацию PHP? –

+0

Да, я ищу реализацию PHP – user2044770

ответ

2

Сходство между векторами A и B можно рассматривать как точечное произведение между A и B, нормированное делением его на произведение двух норм.

Скалярное произведение в PHP можно записать без для циклов:

$dot_product=array_sum(array_map(create_function('$a, $b', 'return $a * $b;'), $a1, $a2)); 

поэтому сначала создать функцию:

function dotp($arr1, $arr2){ 
    return array_sum(array_map(create_function('$a, $b', 'return $a * $b;'), $arr1, $arr2)); 
} 

теперь косинус сходство

$similarity=dotp($id1,$id2)/sqrt(dotp($id1,$id1)*dotp($id2,$id2)) 
+0

Но мне нужен цикл for, если я хочу рассчитать подобие между значениями ID1, то есть, если я хочу рассчитать сходство между 3 и 4, 1 и 4. – user2044770

+0

Можете ли вы привести пример? Вы имеете в виду, что у вас есть более двух массивов (например: $ id1, $ id2, $ id3 ... $ idN) и хотите рассчитать сходства N * (N-1)/2 между всеми возможными парами? – Jacopofar

+0

У меня только 2 массива, но мне нужно найти сходство между каждым элементом ID1. Элементы ID2 являются частью ID1, поскольку вы можете видеть, что для одного значения ID1 у меня более 1 значения ID2. Из приведенного выше примера мне нужно найти сходство между 1 и 3, 1 и 4, 3 и 4. – user2044770

Смежные вопросы