-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathNaiveBayes.py
More file actions
92 lines (80 loc) · 3.26 KB
/
NaiveBayes.py
File metadata and controls
92 lines (80 loc) · 3.26 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
import os
import cv2
import numpy as np
import matplotlib.pyplot as plt
import time
import random
#Loading images
train_folder_path_cats = r"/afhq/train/cat"
train_folder_path_dogs = r"/afhq/train/dog"
train_folder_path_wild = r"/afhq/train/wild"
images, targets = load_images(train_folder_path_cats, [1,0,0])
res = load_images(train_folder_path_dogs, [0,1,0])
images.extend(res[0])
targets.extend(res[1])
res = load_images(train_folder_path_wild, [0,0,1])
images.extend(res[0])
targets.extend(res[1])
def load_images(folder_path, class_name = None, size=(64, 64)):
images = []
image_class = []
for filename in os.listdir(folder_path):
img = cv2.imread(os.path.join(folder_path, filename))
if img is not None:
img = cv2.resize(img, size) # Resize image
images.append(img)
image_class.append(class_name)
return images, image_class #targets
#Reducing image size
images = [cv2.resize(img, (8, 8)) for img in images]
#Convert to grayscale
images = [cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) for img in images]
#Counting colors + calculating probabilities
color_counter = np.zeros(256)
color_probabilities_sum = [[0, 0, 0] for _ in range(256)]
for k in range(len(images)):
img = images[k]
for i in range(32):
for j in range(32):
color_counter[img[i,j]] += 1
if targets[k] == [1,0,0]:
color_probabilities_sum[img[i,j]][0] += 1
if targets[k] == [0,1,0]:
color_probabilities_sum[img[i,j]][1] += 1
if targets[k] == [0,0,1]:
color_probabilities_sum[img[i,j]][2] += 1
color_probabilities = [[0,0,0] for _ in range(256)] # Pr[Class_i = class_j | ColorX = colorx]
for i in range(256):
if color_counter[i]!= 0:
color_probabilities[i] = [color_probabilities_sum[i][0]/color_counter[i], color_probabilities_sum[i][1]/color_counter[i], color_probabilities_sum[i][2]/color_counter[i]]
class_probabilities = [[0,0,0] for _ in range(256)] # Pr[ColorX = colorx | Class_i = class_j]
class_total_count = [0, 0, 0] # [x_i = class_i]
for i in range(256):
summ = class_probabilities_sum[i][0] + class_probabilities_sum[i][1] + class_probabilities_sum[i][2]
for j in range(3):
class_probabilities[i][j] += color_probabilities_sum[i][j]
class_total_count[j] += color_probabilities_sum[i][j]
if summ!= 0:
class_probabilities[i][j] /= summ
#...
#Calculating prior probabilities Pr[Class_i = class_i]
prior_probabilities = [0,0,0]
for i in range(3):
prior_probabilities[i] = class_total_count[i] / len(images)
def product_calculator(image, k): # γινόμενο όλων των P(xi|Ck)
product = 1
for i in range(256):
product *= class_probabilities[i][k]
return product
#Naive-Bayes Classifier
def naive_bayes_classifier(image):
maxx = -1
maxx_class = [0,0,0]
for i in range(3): # For each class
if prior_probabilities[i]*product_calculator(image, i) > maxx:
maxx = prior_probabilities[i]*product_calculator(image, i)
maxx_class = [0,0,0]
maxx_class[i] = 1
return maxx_class
for image in images:
print(naive_bayes_classifier(image))