|
|
|
พี่ๆช่วยผมหน่อยนะครับ ผมไม่เข้าใจเรื่องฟังชั่น ของ algorithm k nearest neighbor PHP |
|
|
|
|
|
|
|
ตอนนี้ ผมติด การ กำหนดค่าK ก็คือการกำหนดค่า ที่เหมาะสมเช่น K=3 ก็จะทำการ ตัดค่าที่ละ3ค่าอะครับ
อันนี้code ในเน็ทอะครับ ช่วยผมหน่อยนะครับการคำนวณผมทำเสร็จแล้วครับ เหลือกกำหนดค่าKให้ออกมาครับ
Code (PHP)
<?php
// Random cartesian coordinates (x, y) and labels
$data = array(
array(1, 2, 'red'), // 0 =>
array(5, 3, 'blue'), // 1 =>
array(-1, 2, 'blue'), // 2 =>
array(2, 5, 'red'), // 3 =>
array(3, 3, 'red'), // 4 =>
array(-4, 5, 'blue'), // 5 =>
array(2, 2, 'blue'), // 6 =>
array(5, -2, 'red'), // 7 =>
array(-1, -2, 'blue'),// 8 =>
);
// Build distance matrix
$distances = $data;
array_walk($distances, 'euclideanDistance', $data);
// Example, target = datapoint 5, getting 3 nearest neighbors
$neighbors = getNearestNeighbors($distances, 5, 3);
echo getLabel($data, $neighbors) . "\n"; // red
/**
* Calculates eucilean distances for an array dataset
*
* @param array $sourceCoords In format array(x, y)
* @param array $sourceKey Associated array key
* @param array $data
* @return array Of distances to the rest of the data set
*/
function euclideanDistance(&$sourceCoords, $sourceKey, $data)
{
$distances = array();
list ($x1, $y1) = $sourceCoords;
foreach ($data as $destinationKey => $destinationCoords) {
// Same point, ignore
if ($sourceKey == $destinationKey) {
continue;
}
list ($x2, $y2) = $destinationCoords;
$distances[$destinationKey] = sqrt(pow($x1 - $x2, 2) + pow($y1 - $y2, 2));
}
asort($distances);
$sourceCoords = $distances;
}
/**
* Returns n-nearest neighbors
*
* @param array $distances Distances generated above ^
* @param mixed $key Array key of source location
* @param int $num Of neighbors to fetch
* @return array Of nearest neighbors
*/
function getNearestNeighbors($distances, $key, $num)
{
return array_slice($distances[$key], 0, $num, true);
}
/**
* Gets result label from associated data
*
* @param array $data
* @param array $neighbors Result from getNearestNeighbors()
* @return string label
*/
function getLabel($data, $neighbors)
{
$results = array();
$neighbors = array_keys($neighbors);
foreach ($neighbors as $neighbor) {
$results[] = $data[$neighbor][2];
}
$values = array_count_values($results);
$values = array_flip($values);
ksort($values);
return array_pop($values);
}
?>
Tag : PHP, MySQL
|
|
|
|
|
|
Date :
2014-06-27 00:07:00 |
By :
nonzabboy |
View :
1534 |
Reply :
2 |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
ถ้าตามตัวอย่างนี้นะครับ
แนะนำให้มอง data ต่างๆ ในลักษณะ graph (จะทำให้เข้าใจง่ายขึ้น)
แล้วกำหนดค่า K = 3
หากลุ่มข้อมูลที่ใกล้จุดที่ 5 หรือ (-4,5) ที่มี label คือ blue
ท่านจะพบว่า มี 3 ค่า (ตาม K) ที่ใกล้เคียงที่สุด คือ 0, 2 และ 3 ที่มี label คือ red, blue และ red ตามลำดับ
ท่านจะเห็นว่า 3 ค่าที่ใกล้ที่สุดนี้ มี red เป็นส่วนใหญ่
ดังนั้น เค้าจึงจัดกลุ่มที่ 5(-4,5) เป็นกลุ่ม red ครับ
การกำหนดค่า K ที่กว้าง ก็จะทำให้การจัดกลุ่ม "หยาบ" ขึ้นมาด้วยครับ
พูดง่ายๆ ก็คือว่า
มองภาพรวมกว้างๆ (k) แล้วข้อมูลที่สนใจ อยู่ในกลุ่มใด ใกล้เคียงกลุ่มใดมากที่สุด เราจะจัดข้อมูลที่สนใจนั้น เป็นกลุ่มนั้นทันทีครับ
แอบกัดเล็กน้อย การประยุกต์คร่าวๆ ในชีวิตประจำวัน ก็ เช่น เราเจอตำรวจรีดไถตังค์ กี่คน กี่กลุ่มก็แล้วแต่ ในพื้นที่นั้น เราจะมองว่า ตำรวจท้องที่นั้น "แย่" ทั้งหมด
ประมาณนี้ครับ ผิดพลาด ขออภัย
|
|
|
|
|
Date :
2014-06-27 18:12:24 |
By :
triplea |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
อ่อ ขอบคุณพี่ TripleA มากๆเลยนะครับที่ให้คำแนะนำผม เดียวผมลองประยุคดูก่อนนะครับ ขอบคุณจริงๆครับ
|
|
|
|
|
Date :
2014-06-29 02:17:46 |
By :
nonzabboy |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Load balance : Server 03
|