• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Klasyfikacja samochodu w python na podstawie jego danych

0 głosów
516 wizyt
pytanie zadane 13 lutego 2025 w Python przez NieZaDobryKoder Nowicjusz (190 p.)

Zaczynam swoją przygodę ze sztuczną inteligencją w python, jako pierwszy "projekt" postanowiłem napisać klasyfikator samochodów na podstawie jego danych takich jak: przyspieszenie, masa, liczba siedzeń, ale nie działa, nie umiem znaleźć problemu. Z góry dziękuję za pomoc .

import numpy as np

def schodkowa(x):
    return (x > 0).astype(int)

class SiecNeuronowa:
    def __init__(self):
        np.random.seed(1)
        self.wagi = np.random.randn(3)  # np.random.randn(ile) generuje listę tylu liczb ile podamy w jej argumencie
        self.bias = np.random.randn(1)

    def przejscie_wprzod(self, dane):
        suma = np.dot(dane, self.wagi) + self.bias
        return schodkowa(suma)

    def trenuj(self, dane, oczekiwane, epoki=100, wsp_uczenia=0.1):
        i = 0
        for _ in range(epoki):
            for j in range(len(dane)):
                wyjscie = self.przejscie_wprzod(dane[j])
                blad = oczekiwane[j] - wyjscie
                
                # Aktualizacja wag (proste dostrajanie)
                self.wagi += dane[j] * blad * wsp_uczenia
                self.bias += blad * wsp_uczenia
            i+=1
        print(f'To zajęło: {i} epok')

# Dane uczące (przyspieszenie, masa, liczba siedzeń)
dane_uczace = np.array([
    [3.2, 1400, 2],  # Sportowy
    [4.1, 1300, 2],  # Sportowy
    [5.8, 1600, 4],  # Sportowy
    [6.5, 1800, 5],  # Normalny
    [7.2, 2000, 5],  # Normalny
    [8.3, 2200, 7],  # Normalny
    [5.0, 1550, 2],  # Sportowy
    [7.5, 1900, 5]   # Normalny
])

etykiety = np.array([1, 1, 1, 0, 0, 0, 1, 0])  # 1 = sportowy, 0 = normalny

# Tworzenie i trenowanie sieci
siec = SiecNeuronowa()
siec.trenuj(dane_uczace, etykiety, epoki=20000, wsp_uczenia=0.1)

# Testowanie na nowych danych
testowe_samochody = np.array([
    [4.5, 1500, 2],  # Powinno być sportowy
    [6.8, 1700, 5],  # Powinno być normalny
    [5.5, 1450, 2],  # Powinno być sportowy
    [7.0, 2100, 7]   # Powinno być normalny
])

przewidywania = siec.przejscie_wprzod(testowe_samochody)
print("Przewidywania:", przewidywania)

2 odpowiedzi

+2 głosów
odpowiedź 14 lutego 2025 przez Colossus Mądrala (6,850 p.)
wybrane 14 lutego 2025 przez NieZaDobryKoder
 
Najlepsza

Hej,
problem w twoim kodzie jest taki że dane wejściowe nie są znormalizowane a to sprawia że wartości wag rosną do ogromnych liczb i przez to sieć nie może się dobrze nauczyć - rozwiązaniem jest normalizacja czyli przekształcenie danych tak żeby miały podobne skale np odjąć średnią i podzielić przez odchylenie standardowe, wtedy wartości są w rozsądnym zakresie i sieć może efektywnie uczyć się wzorców. Dodałem normalizację do twojego kodu i po tym sieć zaczęła poprawnie klasyfikować samochody, także polecam sprawdzić jak działa teraz bo to naprawdę ważna rzecz w sieciach neuronowych. Powodzenia w nauce AI
 

import numpy as np

def schodkowa(x):
    return (x > 0).astype(int)

class SiecNeuronowa:
    def __init__(self):
        np.random.seed(1)
        self.wagi = np.random.randn(3)
        self.bias = np.random.randn(1)
    
    def przejscie_wprzod(self, dane):
        suma = np.dot(dane, self.wagi) + self.bias
        return schodkowa(suma)
    
    def trenuj(self, dane, oczekiwane, epoki=100, wsp_uczenia=0.1):
        i = 0
        for _ in range(epoki):
            for j in range(len(dane)):
                wyjscie = self.przejscie_wprzod(dane[j])
                blad = oczekiwane[j] - wyjscie
                
                self.wagi += dane[j] * blad * wsp_uczenia
                self.bias += blad * wsp_uczenia
            i += 1
        print(f'To zajęło: {i} epok')

# Dane uczące (przyspieszenie, masa, liczba siedzeń)
dane_uczace = np.array([
    [3.2, 1400, 2],
    [4.1, 1300, 2],
    [5.8, 1600, 4],
    [6.5, 1800, 5],
    [7.2, 2000, 5],
    [8.3, 2200, 7],
    [5.0, 1550, 2],
    [7.5, 1900, 5]
])

# Normalizacja danych
mean = np.mean(dane_uczace, axis=0)
std = np.std(dane_uczace, axis=0)
dane_uczace = (dane_uczace - mean) / std

etykiety = np.array([1, 1, 1, 0, 0, 0, 1, 0])

# Tworzenie i trenowanie sieci
siec = SiecNeuronowa()
siec.trenuj(dane_uczace, etykiety, epoki=20000, wsp_uczenia=0.1)

# Testowanie na nowych danych
testowe_samochody = np.array([
    [4.5, 1500, 2],
    [6.8, 1700, 5],
    [5.5, 1450, 2],
    [7.0, 2100, 7]
])
testowe_samochody = (testowe_samochody - mean) / std

przewidywania = siec.przejscie_wprzod(testowe_samochody)
print("Przewidywania:", przewidywania)
komentarz 14 lutego 2025 przez adrian17 Mentor (354,880 p.)
Jeszcze tylko dodam że _technicznie_ bez normalizacji byłem w stanie dojechać do oczekiwanych wyników, jak ustawiłem `epoki=500000, wsp_uczenia=0.00005`. Ale tak, zdecydowanie normalizacja by ułatwiła :)
komentarz 14 lutego 2025 przez NieZaDobryKoder Nowicjusz (190 p.)

@Colossus, Bardzo dziękuję za pomocsmiley

–1 głos
odpowiedź 14 lutego 2025 przez Gonzoo1 Nowicjusz (140 p.)
problem może leżeć w funkcji aktywacji, której używasz, czyli schodkowa. Jeśli twoje dane wejściowe są różne od oczekiwanego zakresu, mogą występować problemy z klasyfikacją. Funkcja schodkowa daje tylko 0 lub 1, co może być za mało elastyczne przy niektórych danych.

Spróbuj zmienić funkcję aktywacji na np. funkcję sigmoidalną lub ReLU, które mogą lepiej dopasować się do Twoich danych. Możesz również sprawdzić, czy masz odpowiednią skalę danych (np. przez standaryzację), ponieważ duże różnice w wartościach wejściowych mogą wpływać na działanie sieci.

Podobne pytania

+1 głos
1 odpowiedź 575 wizyt
pytanie zadane 27 stycznia 2022 w Python przez patryk241 Użytkownik (700 p.)
0 głosów
1 odpowiedź 1,259 wizyt
pytanie zadane 28 marca 2021 w Python przez janzw4 Bywalec (2,050 p.)
+2 głosów
0 odpowiedzi 1,292 wizyt
pytanie zadane 3 kwietnia 2020 w Python przez kondzix_ez Obywatel (1,930 p.)

93,729 zapytań

142,668 odpowiedzi

323,283 komentarzy

63,288 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Twierdza Linux. Bezpieczeństwo dla dociekliwych

Aby uzyskać rabat -10%, użyjcie kodu pasja-linux, wpisując go w specjalne pole w koszyku.

...