php-數據分析 余弦相似度實現

gxfw 9年前發布 | 903 次閱讀 PHP

    <?php
/**

 * 數據分析引擎 
 * 分析向量的元素 必須和基準向量的元素一致,取最大個數,分析向量不足元素以0填補。 
 * 求出分析向量與基準向量的余弦值 
 * @author yu.guo@okhqb.com 
 */  


/** 
 * 獲得向量的模 
 * @param unknown_type $array 傳入分析數據的基準點的N維向量。|eg:array(1,1,1,1,1); 
 */  
function getMarkMod($arrParam){  
 $strModDouble = 0;  
 foreach($arrParam as $val){  
 $strModDouble += $val * $val;  
 }  
 $strMod = sqrt($strModDouble);  
 //是否需要保留小數點后幾位  
 return $strMod;  
}  

/** 
 * 獲取標桿的元素個數 
 * @param unknown_type $arrParam 
 * @return number 
 */  
function getMarkLenth($arrParam){  
 $intLenth = count($arrParam);  
 return $intLenth;  
}  
/** 
 * 對傳入數組進行索引分配,基準點的索引必須為k,求夾角的向量索引必須為 'j'. 
 * @param unknown_type $arrParam 
 * @param unknown_type $index 
 * @ruturn $arrBack 
 */  
function handIndex($arrParam, $index = 'k'){  
  foreach($arrParam as $key => $val){  
    $in = $index.$key;  
    $arrBack[$in] = $val;   
  }  
  return $arrBack;  
}  

/** 
 *  
 * @param unknown_type $arrMark標桿向量數組(索引被處理過) 
 * @param unknown_type $arrAnaly 分析向量數組 (索引被處理過) |array('j0'=>1,'j1'=>2....) 
 * @param unknown_type $strMarkMod標桿向量的模 
 * @param unknown_type $intLenth 向量的長度 
 */  
function getCosine($arrMark, $arrAnaly, $strMarkMod ,$intLenth){  
 $strVector = 0;  
 $strCosine = 0;  
 for($i = 0; $i < $intLenth; $i++){  
 $strMarkVal = $arrMark['k'.$i];  
 $strAnalyVal = $arrAnaly['j'.$i];  
 $strVector += $strMarkVal * $strAnalyVal;  
 }  
 $arrAnalyMod = getMarkMod($arrAnaly); //求分析向量的模     
 $strFenzi = $strVector;  
 $strFenMu = $arrAnalyMod * $strMarkMod;  
 $strCosine = $strFenzi / $strFenMu;     
 if(0 !== (int)$strFenMu){  
 $strCosine = $strFenzi / $strFenMu;     
 }  
 return $strCosine;  
}  
?>  </pre> 


 本文由用戶 gxfw 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!