Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Moda Mediana
Forum PHP.pl > Forum > Przedszkole
kafarek
Potrzebuje napisac dwa skrypty ktore beda liczyly mode (wyraz ktory najczesciej wystepuje) i mediane ( ten co jest w samym srodku) i nie wiem jak to napisac. Pomoże ktos?
kriqs
  1. <?php
  2. $tekst = file_get_contents( 'test.txt' );
  3.  
  4. $tekst = explode(' ', $tekst );
  5.  
  6. foreach( $tekst as $wyraz )
  7. {
  8. $wyraz = trim( $wyraz );
  9. if ( !isset( $w[$wyraz] ) )
  10. {
  11. $w[$wyraz] = 1;
  12. }
  13. else
  14. {
  15. $w[$wyraz]++;
  16. }
  17. }
  18.  
  19. echo '<pre>';
  20. var_dump( $w );
  21. ?>


prosze ale i tak znajac zycie zaraz wypadnie jakis masta i pokaze jak to zrobic krócej smile.gif
dr_bonzo
Mediana: liczysz ilosc elementow w tablicy i bierzesz
*srodkowy elelment gdy ilosc jest nieparzyysta
* srednia z dwoch srodkowych, gdy ilosc jest parzysta

Moda:
http://pl.php.net/manual/en/function.array-count-values.php + MAX z tablicy
JaRoPHP
Cytat(dr_bonzo @ 17.04.2007, 14:39:33 ) *
Mediana: liczysz ilosc elementow w tablicy i bierzesz
*srodkowy elelment gdy ilosc jest nieparzyysta
* srednia z dwoch srodkowych, gdy ilosc jest parzysta

Niby wszystko ok, ale najważniejszą sprawą dotyczącą mediany, jest to, że jest to wartość środkowa w uporządkowanym zbiorze danych. Więc najpierw należałoby tablicę posortować.
kafarek
Dobrze ale jak pozniej wziac ten srodkowy wyraz z tej medianay ewentualnie srednia dwoch srodkowych?
dr_bonzo
Cytat
Niby wszystko ok, ale najważniejszą sprawą dotyczącą mediany, jest to, że jest to wartość środkowa w uporządkowanym zbiorze danych. Więc najpierw należałoby tablicę posortować.

No tak, o tym zapomnialem biggrin.gif


Cytat
Dobrze ale jak pozniej wziac ten srodkowy wyraz z tej medianay ewentualnie srednia dwoch srodkowych?

MAatkooo. Ustaw sobie 9 szklanek, podziel 9/2 zaokraglij w gore i otrzymasz N, i odlicz od lewej Nta szklanke i to bedzie srodkowa.
pavlo24
Cytat(kriqs @ 17.04.2007, 15:10:22 ) *
  1. <?php
  2. $tekst = file_get_contents( 'test.txt' );
  3.  
  4. $tekst = explode(' ', $tekst );
  5.  
  6. foreach( $tekst as $wyraz )
  7. {
  8. $wyraz = trim( $wyraz );
  9. if ( !isset( $w[$wyraz] ) )
  10. {
  11. $w[$wyraz] = 1;
  12. }
  13. else
  14. {
  15. $w[$wyraz]++;
  16. }
  17. }
  18.  
  19. echo '';
  20. var_dump( $w );
  21. ?>


prosze ale i tak znajac zycie zaraz wypadnie jakis masta i pokaze jak to zrobic krócej smile.gif


------------------------------------------------------

A jak to przerobić, żeby liczyło medianę dla tabeli T w kolumnie X?
Chodzi mi o polecenie dla MySQL.
Drohan
Cytat(kriqs @ 17.04.2007, 14:10:22 ) *
  1. <?php
  2. $tekst = file_get_contents( 'test.txt' );
  3.  
  4. $tekst = explode(' ', $tekst );
  5.  
  6. foreach( $tekst as $wyraz )
  7. {
  8. $wyraz = trim( $wyraz );
  9. if ( !isset( $w[$wyraz] ) )
  10. {
  11. $w[$wyraz] = 1;
  12. }
  13. else
  14. {
  15. $w[$wyraz]++;
  16. }
  17. }
  18.  
  19. echo '<pre>';
  20. var_dump( $w );
  21. ?>


prosze ale i tak znajac zycie zaraz wypadnie jakis masta i pokaze jak to zrobic krócej smile.gif


wszystko ładnie ale u mnie na początku wyświetlania danych pojawia się:

array(1) {
["

DANE

"]=>
int(1)
}


jak usunąć te wszystkie znaczniki?

oraz 2 pytanie jak to przerobić, żeby liczyło medianę dla tabeli T w kolumnie X? z pliku xls?
thek
1. Znaki przestankowe zakłamują wyniki. Musisz je NA SAMYM POCZĄTKU usunąć z tekstu.
2. Konwertujesz tekst na tablicę.
3. Usuwasz duplikaty z tej tablicy.
4. Zliczasz w tekście pełnym wystąpienia tworząc tablicę, gdzie kluczem są wyrazy a wartością liczba wystąpień.
5. Sortujesz smile.gif
6. Zliczasz ilość elementów b sprawdzić medianę, element o najwyższej ilości to moda.

Funkcji sam sobie poszukaj smile.gif Algorytm masz.
koderrr
dlaczego mialby usuwac duplikaty ?
thek
Bo w ten sposób stworzy listę UNIKALNYCH słów w tekście całym. Najlepiej jeszcze wcześniej potraktować je funkcja konwerstującą wszystkie do lowercase by "jakoś" było uznane za to samo co "Jakoś".
A więc lecąc od początku. Przyjmując za $text całość tekstu:
1) preg_replace wszystkich znaków interpunkcyjnych na pusty w $text i dla pewności zamiana wszelkich wielokrotnych spacji na pojedynczą też wyrażeniem regularnym, a już dla kompletności trim i strtolower.
2) explode $text do tablicy $array_text po spacji
3) $unique jako wynik array_unique na $array_text
4) ten krok można rozwiązać na kilka sposobów bo algorytmów zliczania na tę chwile już kilka wymyśliłem, ale podam tu dwa
ver. 1) array_keys na "oczyszczonym" $text z punktu 1) używając każdego elementu z $unique a potem count() na owym wyniku i wpis do tablicy
ver. 2) posortowanie $array_text i tak posortowana zmienna już łatwo może posłużyć do liczenia. Jeden przebieg w pętli foreach z if dodającym 1 do aktualnego słowa lub zamieniającym na nowe z licznikiem równym 1
Tak czy inaczej ważne by tworzyć tablicę par "słowo" => ilość_wystąpień
5) Posortowanie tablicy według wartości.
6) Tego chyba nie muszę już tłumaczyć?

I niech mi ktoś jeszcze napisze, że tego nie rozumie bo chyba ugryzę biggrin.gif Nie można już prościej wytłumaczyć smile.gif
Do odczytu xls trzeba napisać albo własny parser albo szukać gotowców (http://sourceforge.net/projects/phpexcelreader/, http://www.tutorials.pl/2009/02/php-excel-...der-generator/). Więcej chyba już nie powinno Ci być potrzebne do napisania.
Drohan
zmodyfikowałem ten kod na taki który mi bardziej odpowiada


  1. $plik = file_get_contents("tescik.xls");
  2. $plik = explode("\n",$plik);
  3. echo"<table border=\"0\"><tr><td><b>Imię</b></td>";
  4. for ($i=1;$i<18;$i++){
  5. echo"<td><b>Pytanie ".$i."</b></td>";
  6. }
  7. echo "</tr>";
  8.  
  9. for ($i=0;$i<=count($plik);$i++){
  10. $row=explode("\t",$plik[$i]);
  11. echo "<tr>";
  12. for ($j=0;$j<=count($row);$j++){
  13. echo "<td align=center>".$row[$j]."</td>";
  14. }
  15. echo "</tr>";
  16. }



wszystko sie ladnie w tabeli miesci ale nie wiem jak mam policzyc ta mediane nie mam zadnego pomyslu nierozumiem wogole kolego Twojego pkt 4

w w/w moim pliku zamieszczane sa odpowiedzi z formularza które sa przesyłane POST a zapisywanie odpowiedzi są jako o1, o2, o3 itd.. do o20i są one ładowane do pliku, który zostaje potem wyswietlony w w/w kodzie nastepnie musi być liczona median kolumnami i próbuję już chyba z 18 godzinę dziś ale mi nic kompletnie nie wychodzi
thek
No to pomyśl... Tak naprawdę Twoje wnętrze pliku to macierz jeśli dobrze zrozumiałem. Czyli masz postać

w1,1 w1,2 w1,3 w1,4
w2,1 w2,2 w2,3 w2,4
w3,1 w3,2 w3,3 w3,4

A więc co za problem przy liczeniu mediany dla kolumny zrobić sobie tablice kolumn?
k1 = array( w1,1 w2,1 w3,1 )
k2 = array( w1,2 w2,2 w3,2 )
i tak dalej...
To po prostu stworzenie $j tablic, które uzupełniasz o elementy z kolejnych $i wierszy. Potem tylko liczenie mediany i mody w tych tablicach.

Wytłumaczę Ci punkt 4 na podstawie 1 przykładu.
Bierzemy tablicę wyrazów z całego tekstu. Tu muszę się palnąć w dekiel, bo miałem napisać $array_text z punktu drugiego smile.gif Teraz dla każdego elementu w tablicy $unique sprawdzam ilość wystąpień konkretnego słowa w $array_text. Można to zrobić poprzez policzenie ilości kluczy o tej samej wartości co wiąże się z takim prostym manewrem jak count( array_keys( $array_text, $unique[$i] ) ). Teraz zapisujemy to jako parę
'słowo' => wystąpień
w tablicy wynikowej. To cała idea punktu 4)
Drohan
zrobilem cos takiego ale jakoś nie chce działać może mi ktoś pomóc sprawdzić ten kod?

  1. $plik=file_get_contents("baza.xls");
  2. $plik=explode("\n",$plik);
  3. for ($wiersz=1; $wiersz<=count($plik);$wiersz++){
  4. $row=explode("\t",$plik[$wiersz]);
  5. for ($kolumna=1;<=count($row);$kolumna++){
  6. ${odp.$kolumna}[substr($row[$kolumna],1,1)]++
  7. ${med_odp.$kolumna}[count(${med_odp.$kolumna})+1]=substr($row[$kolumna],1,1);
  8. }
  9. }
  10. for ($wiersz=1;$wiersz<18;$wiersz++){
  11. echo "Pytanie ".$wiersz;
  12. sort (${med_odp.$wiersz});
  13. if (count(${med_odp.$wiersz})%2==0){
  14. $med=${med_odp.$wiersz}[count(${med_odp.$wiersz})/2];
  15. }else{
  16. $med=${med_odp.$wiersz}[(count(${med_odp.$wiersz})+1)/2];
  17. }
  18. echo" Mediana: ".$med;
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.