public function testComputeSimilarity2() { $instance = new KNNModelBuilder(null, new CosineSimilarity()); $source = new ObjectSet(Rating::class); $destination = new ObjectSet(Rating::class); $node1 = new FakeNode(1); $node2 = new FakeNode(2); $node3 = new FakeNode(3); $node4 = new FakeNode(4); $node5 = new FakeNode(5); $source->add(new Rating(1, $node1->identity())); $source->add(new Rating(3, $node4->identity())); $destination->add(new Rating(1, $node2->identity())); $destination->add(new Rating(2, $node4->identity())); $destination->add(new Rating(5, $node5->identity())); $similarity = $instance->computeSimilarity($source, $destination); $this->assertTrue($similarity >= 0.34641016 && $similarity <= 0.346410161514); }
$stopwatch->start("e"); $result = $driver->run($qA); $e = $stopwatch->stop("e"); echo $e->getDuration() . PHP_EOL; $stopwatch->start("simil"); $pairs = []; $crs = array_chunk($result->records(), 100); foreach ($result->records() as $record) { $source = new ObjectSet(Rating::class); $m = $record->value("m"); foreach ($record->value("ratings") as $rating) { $source->add(new Rating($rating['rating'], $rating['user'])); } foreach ($crs as $cr) { foreach ($cr as $record2) { $m2 = $record2->value("m"); $k = $m + $m2; if (!array_key_exists($k, $pairs) && $record2->value("m") !== $record->value("m")) { $destination = new ObjectSet(Rating::class); foreach ($record2->value("ratings") as $rating2) { $destination->add(new Rating($rating2['rating'], $rating2['user'])); } $simil = $knn->computeSimilarity($source, $destination); $pairs[$k] = ['source' => $record->value("m"), 'desc' => $record2->value("m"), 'similarity' => $simil]; //echo $simil . PHP_EOL; } } } } $e2 = $stopwatch->stop("simil"); echo $e2->getDuration() . PHP_EOL;