Új hozzászólás Aktív témák

  • rootkiller

    őstag

    Megfejtettem a saját elképzelésem szerint. Amikor az eredeti klaszterközepekhez hozzárendelem az elemeket akkor számolok költséget. Ezek után generálok egy új klaszterközepet, amit véletlenszerűen valamelyik helyett felhasználok, majd ismételten hozzárendelek elemeket a klaszterekhez és költséget számolok. Ezek után összehasonlítok, és ha az új verzió jobb mint a régi akkor eltárolom a régi klaszterközepeket egy segédtömbbe, majd ezt felülírom az új klaszterközepekkel. Ezek után a while-ban a régi és az új klaszterközép tömbböt összehasonlítom hogy egyenlő-e.

    A probléma hogy végtelen ciklust generáltam és nem tudom hogy hol. Itt a kód:

    function kmedoid($xdata, $k){
    // 1. kezdeti elemek kiválasztása
    for($i = 1; $i <= $k; $i++){
    $middle[$i] = $i;
    }

    // 2.
    do {
    // 3. hozzárendelünk minden elemet a legközelebbi klaszterközéphez
    $originalCost = 0;
    for($i = 1; $i <= 150; $i++){
    for($j = 1; $j <= $k; $j++){
    $actual = $middle[$j];
    if ($xdata[$i] > $xdata[$actual]){
    $distance[$j] = $xdata[$i] - $xdata[$actual];
    } else {
    $distance[$j] = $xdata[$actual] - $xdata[$i];
    }
    }
    $whichCluster[$i] = array_search(min($distance), $distance);
    $originalCost = $originalCost + min($distance);
    echo $originalCost . "<br>";
    }

    // 4. véletlenszerűen választunk egy nem klaszterközepet: 0random
    do {
    $new = rand(1, 150);
    } while (!in_array($new, $middle));
    $newMiddle = $middle;
    $newMiddle[rand(1, $k)] = $new;


    // 5. kiszámoljuk a teljes költséget
    $newCost = 0;
    for($i = 1; $i <= 150; $i++){
    for($j = 1; $j <= $k; $j++){
    $actual = $newMiddle[$j];
    if ($xdata[$i] > $xdata[$actual]){
    $distance[$j] = $xdata[$i] - $xdata[$actual];
    } else {
    $distance[$j] = $xdata[$actual] - $xdata[$i];
    }
    }
    $whichCluster[$i] = array_search(min($distance), $distance);
    $newCost = $newCost + min($distance);
    echo $newCost . "<br>";
    }

    // 6. ha s<0 akkor csere 0j 0rand-al és az az új klaszterközép
    if ($newCost < $originalCost){
    $lastMiddle = $middle;
    $middle = $newMiddle;
    echo "felülírva<br>";
    } else {
    $lastMiddle = $middle;
    }

    }
    // 7. addig amíg nincs változás
    while ($middle === $lastMiddle);
    }

Új hozzászólás Aktív témák