Untitled

 avatar
unknown
plain_text
a month ago
2.6 kB
4
Indexable
import pandas
import numpy as np
import statistics as st

class NaiveBayes:
     @staticmethod
     def classify(set, sample):
        probabilityList = []
        irisNameList = set['variety'].unique().tolist()

        for irisName in irisNameList:
            # Utworzenie listy wszystkich nazw kolumn ze zbioru
            # z wyjątkiem ostatniej ('varietiy'), ponieważ już ją mamy
            columnsNamesList = set.columns.tolist()[:4]
            probability = 1
            flowers = set[set['variety'] == irisName] # Rozdzielenie zbioru według poszczególnych kwiatów
            for columnName in columnsNamesList:
                columnData = flowers.loc[:,columnName]
                mu = st.mean(columnData)
                stDev = st.stdev(columnData)
                probability *= 1/(stDev*np.sqrt(np.pi*2))*np.exp(-0.5*((sample[columnName]-mu)/stDev)**2)
     
            probabilityList.append(probability)
        maxProbability = max(probabilityList)
        return (irisNameList[probabilityList.index(maxProbability)])
     

df = pandas.read_csv(r"C:\SSI\iris.csv") # !!! <-- Należy pamiętać o zmianie ścieżki na odpowiednią do bazy danych w systemie

# Tasowanie wierszy w bazie danych:
df = df.sample(frac = 1)

def normalize(data):
        values = data.select_dtypes(exclude=["object"])
        for column in values.columns.tolist():
            d = data.loc[:,column]
            dMax = d.max()
            dMin = d.min()
            for i in range(len(data)):
                data.at[i, column] = (data.at[i, column] - dMin) / (dMax - dMin)
        return data

# Funkcja dzieląca bazę danych na zestaw treningowy i testowy w proporcji 70%/30%
def splitTrainTest(database):
    index = int(len(database) * 0.7)
    return database[:index], database[index:]

def calculateAccuracy():
    counter = 0
    for index in range(len(testDB)):
        currentRow = NaiveBayes.classify(trainDB, testDB.iloc[index])
        if currentRow == testDB.iloc[index]['variety']:
            counter += 1
    accuracy = (counter/len(testDB)) * 100
    return accuracy

normalize(df)

# Przypisujemy wyniki podziału bazy danych do nowych
# zmiennych zbioru danych, których będziemy mogli użyć później
trainDB, testDB = splitTrainTest(df)

print("--- T E S T ---")
print(testDB.iloc[0])
print("---------------")
result = NaiveBayes.classify(trainDB, testDB.iloc[0])
print(f"Wynik: {result}, prawdziwy wynik: {testDB.iloc[0]['variety']}")

print(f"Dokładność: {round(calculateAccuracy(),2)}%")
Editor is loading...
Leave a Comment