我正在处理基于项目的协作过滤器,您需要在项目之间进行相似性处理。我发现创建一个像下面这样的矩阵运行良好,但我现在想阻止它计算双精度。
我将用一个例子来解释我的意思。假设您有一个包含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 :(得分:2)
这应该这样做:
$yearGroup = array();
foreach($array as $key => $value){
$yearGroup[$value['year']] = $value;
}
答案 1 :(得分: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]);
答案 2 :(得分:0)
试试这个
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]);
}
}