From 67970b3242e534a8610fb3a72a79dd8b8a9ebad6 Mon Sep 17 00:00:00 2001 From: Kiwi Date: Wed, 4 Jun 2025 18:20:08 -0300 Subject: [PATCH] =?UTF-8?q?Base=20da=20Implementa=C3=A7=C3=A3o=20em=20Pyth?= =?UTF-8?q?on=20do=20algoritmo=20em=20Naive=20Bayes,=20sem=20o=20base=20de?= =?UTF-8?q?=20dados=20da=20iris.csv=20(Irei=20add=20assim=20q=20tiver=20um?= =?UTF-8?q?=20tempo)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- project/data/iris.csv | 0 project/reports/accuracy_report.txt | 0 project/reports/clusters_report.txt | 0 project/requirements.txt | 3 ++ project/src/__init__.py | 0 .../src/__pycache__/kmeans.cpython-312.pyc | Bin 0 -> 2389 bytes .../__pycache__/naive_bayes.cpython-312.pyc | Bin 0 -> 2479 bytes .../__pycache__/preprocess.cpython-312.pyc | Bin 0 -> 1169 bytes project/src/experiment.py | 32 ++++++++++++++++++ project/src/kmeans.py | 25 ++++++++++++++ project/src/naive_bayes.py | 32 ++++++++++++++++++ project/src/preprocess.py | 19 +++++++++++ 12 files changed, 111 insertions(+) create mode 100644 project/data/iris.csv create mode 100644 project/reports/accuracy_report.txt create mode 100644 project/reports/clusters_report.txt create mode 100644 project/requirements.txt create mode 100644 project/src/__init__.py create mode 100644 project/src/__pycache__/kmeans.cpython-312.pyc create mode 100644 project/src/__pycache__/naive_bayes.cpython-312.pyc create mode 100644 project/src/__pycache__/preprocess.cpython-312.pyc create mode 100644 project/src/experiment.py create mode 100644 project/src/kmeans.py create mode 100644 project/src/naive_bayes.py create mode 100644 project/src/preprocess.py diff --git a/project/data/iris.csv b/project/data/iris.csv new file mode 100644 index 0000000..e69de29 diff --git a/project/reports/accuracy_report.txt b/project/reports/accuracy_report.txt new file mode 100644 index 0000000..e69de29 diff --git a/project/reports/clusters_report.txt b/project/reports/clusters_report.txt new file mode 100644 index 0000000..e69de29 diff --git a/project/requirements.txt b/project/requirements.txt new file mode 100644 index 0000000..560684c --- /dev/null +++ b/project/requirements.txt @@ -0,0 +1,3 @@ +numpy +pandas +matplotlib # Para gráficos, caso deseje visualizar os resultados diff --git a/project/src/__init__.py b/project/src/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/project/src/__pycache__/kmeans.cpython-312.pyc b/project/src/__pycache__/kmeans.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..acc6d571ff2f4358da011e93c333a76be98dca3c GIT binary patch literal 2389 zcmb_eO>7fK6rTNa9EaG1reHg@Wgtaer34ZrBPt5Dh)7a|1qE6ZnJmlh64uyjGrJ*m z^~U)zQV*TO z^PBfKZ}z?KjlXYh_90kbefHL+GK0{sWaBQj$}Go#nM5*@sSFyRXw-{j`Z|)CIoh!p zpbHewE|N`BazqZT>e2Ep*iRw_yk#^%%O07!P7N?5$^a`fKslKO>M3x1gXKAPToE;0 za=l3`!b5&&c?*z9RHTYX0M1zj#8XM0vV58#WrlS_!8%V{tgd7(Vh@<;#5)%I=jf3) zQfG9~rjDs2>hV;sYV-|XNS!%)I@RBqNS(mBv|{8=V9`*eT({7lNacx0GEzF0QkSzN ztImAE@(O~gsfHko2AotoT><%IdLxi)=xMmU#C{l9h7DSC6_SyCm3ByrT*V+J_DZk5 zvMb}N%&MOvl_pWvEtv{|q=?eqbqd(Z^gU*doC?da5?10Glp{wdy~*WjzYx!Ek(z{X z_0FHG#u=km-N?Vz&-QKED64-;ksgJ!-MBJ)xd$OUQr|ZH(#EKBRnZs?J}+<77b!P3 zv{RF-2V3%q)~z+RwQsj#mHz*4N{wGFAZTtbiAiG|g%)qXN%Fym3ul)W?JbajM zwrDMHd9bL-xvb@pF6C57u{iybm{;uXw;ClyGjL9ob&DHSa89>88C4TALl&#$aMog_ z95nT2LDY41s0Jah5-%tj-D(kr^Rj3t!b%*T!3~g*MV+<$d8}NmX>`(Ku~-a~9<-Q? zsxj)TVgz{Nq<;hC8hRcIf82fN!0iJIZ5?J?$4ugW?`-dUV)pF^?6-k01Lc$NmfJci zZSR?(vn6)i|18vYCwMzJ)jr*Mw{u}f+}shbg!Y&Gzxg-cRBxy^wHw;4({~1M56)<2 z@_2ME0OL}@_9JA5Z+^k_smn3aCfO^{Mhrz_JznkGqP_! zQHjJslKis?1zKJd^@+a+6FjVeG-(GL(w_q}iB`4$e+D#6SMs=i3Pc@J)eA55TyTY*>&nleJvm|)oQ zh7-3wSFiN4L52a$T>H1N6f{uAyhGTPOP``X`eU$*HbS zPTr&M`(}Mp=ggh^=H)N6Pc?IA&!eu7l9krurN(Dar^1cGt z%T>*1f*#++LcB5BJ!6b1GN(X7+0qfjGtLyiQE;yo#^OYb#e&5F`iC5}<87d}Sn^i! ztc_BqER<@OOlLt2_;dh@gRmP7x&1jHAKiam8(fkcP4^FpKQ6 z+am{)``LuV)QQb?v`kant4kgqw|^-}bFVLZX)ffr5Nn>XIBhtaFF3t!2iQ%b5Y#wx k%zMzu<`CWkGEy>~{15qqp(yHSwB;{$D-~KoKy06X0m4zw`v3p{ literal 0 HcmV?d00001 diff --git a/project/src/__pycache__/naive_bayes.cpython-312.pyc b/project/src/__pycache__/naive_bayes.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..468654f6638105c1fb377f726891da09cf0e0730 GIT binary patch literal 2479 zcmah~O>7fK6rTNajAL+|ABR9fbD&DC(v&1fi4d)7ph*lR1tpPCWV%|sn`Dh+JF_-q zt+mR5N;Zm=SVgj}R*Dfw1kpo~kP5dRsd|ZJp}N}~Dzz7GkQ}P^)Hl0c+eDW7q@9`f zyR+|o@9i%K4>}Og*0awR-!cgONf?XR>S3=R4ml(ukqVe#MZ&9;^gGN88>NUjI^fCgj7SrIYZ$t)1-eHi2LN$#gL+CuZ z7Dgz=Xp}~4%#9Ba>H%en)!0x=-O4(N)DI1}2-z%oeb<;Xz<~FGy39K5^R`>^`fhs1 z4_Xq9wZ6GQMp?3CE4&GXjA~mR=5EGWjj%{XUSQqo?uJS>JWVN5rzZcJ) z4$LYNRst90Tk@sAgdCqtTo25S&jkE~zQAQ14N39nWh}(yV04)G`vNf{3dREp4hA9w z82ojDjKP?yGxKshd8m$-LEuTzl)JFpMt^npq$NUAf+Sy=h;iy<^>%cW1}5-t@W3(PJB9g|SU{eyn`-!}R$zf5yKqWWJ~z>Dw46 z3>2611K)iN;>pb9`jyPZo!<9~%y*LymCd0CH%q-Af#yQy!us;vOK%UL_G5c+8x*Wz z5Ez041IZW;IiykN(Hb437r^RT2jGc@I@Qn(CRM6qI!mv1v4F!A9j~Fe8D2HUs{S;@ zrr=4@x6os1%FF0>K87Vx4#qKouFeS<3#ymJhk(N_BBECG)~byhjVKDqEvX`gJ0iWM zs!FyuRG=zzgMl&v%Wd@A&~Vu^^3=WQTaV{b*;Mh$tL}j@~Mqxl!iB!O^0L5s#ni~dhyQ1f;q?QEqi#Wuuf z(tZtEl9_!3C4`3CPa2F4YiL^UvGx?F(V<#1*F7~>CHS02EBBZaO={@(n30FGi!HLcmT?Q^gHF41BVq0W%g3yFj6+u-rzZI~^6PH+MQc zx$*3H{?x|l!s((=_@vzFO@F@Ab9BQ~@I0g++3wql@ki=?b<4fwd+>F+f3(~)mcCGN zdVY2Gm7INfsTe99JNe2v^ri*+@r@m|b*^a{?fbJE{(`?4D)$bRT*KS;VN9;@&OfKt zsXL&7PHmcWjWYfM3}_p>96ShBwX8_RYk!w!;1g+Mco{ySCU8rFx5kpy0s@)n4KbTd zcKAyrK`zosh}a6d8G(4#qCmuHGWTDTk@MOZ{x(d4VFF+i7p$_3<2oIabw*l=c{vjS zM!^XT>gM%XZ%hf?589;boob8oeIQi6f(0t=>R3}VYTliJAzeAtzP6ZITwl)INHdi- z_r0^ZiR?t)2Q}vIa|QnZq6Rv}M$wB~X-1{*y zBA6dSS{&NWoI(m|oI7ZjZsi7dkI>xvyLKBlve(9Nvy|yWEMdrUk;GC=HF9V;<3SRJ nz|0(?_A};nKE)?NMhc*ii@aediuxV3|IPMMv(zpktKsz@X}aGC literal 0 HcmV?d00001 diff --git a/project/src/__pycache__/preprocess.cpython-312.pyc b/project/src/__pycache__/preprocess.cpython-312.pyc new file mode 100644 index 0000000000000000000000000000000000000000..4727707c6283d2329dc1124ee7c999c5b41be7a0 GIT binary patch literal 1169 zcmb7D&1(}u6rb6Te3<6LRy`EK)`}Xc@#`X1)KZ&Ri&CkT8WzHu-L_jcAIxm430v4h zFGayf3yFBJq9CPL{{(Md5_&0H4}xC2N$bgzZ)Teqg(|*f-psuBd++W0m=EFbJ_PjU z-L;vE0z#kJrAct-v~v=+D$NmUDYyKIuG~YlwsLSaMt0P)hSIBOK#9CKs@H1uqsKg=s{o(`WOm79atKulr}=W&h^bu)EV6Y z1^O*(hUZzEaHt|1zS&mh4DHeS?p}r%fM6DXP!sWQ`*H}OaYR^TsF9d6^1#$baqQwr z%3}ABAaFO5FOZyS8fD!}F9yN@EXrE#pidp)3a-k};0as>d(KIa54Ui64)CT6DFR`wbp&DLJ*6ueB z9N&nYa7H#G(R!?JrK@sh`A{w1*xy%=9CK2e;m8wOIrn(J7HmX&>(Qh2aG#U>FKno@ zlB}gx@6|*7b*Z2CHIAn*aN4*U_q)ELn%7iHSc6?TKbM2oA>@nvSr9fn{O{KgH}w(> rT+S7=Ia9wvj)0!c9%UJR6EVhHsA~&#Zc74=Z3hH==6k@8PjTCyNvQs0 literal 0 HcmV?d00001 diff --git a/project/src/experiment.py b/project/src/experiment.py new file mode 100644 index 0000000..68bf5b4 --- /dev/null +++ b/project/src/experiment.py @@ -0,0 +1,32 @@ +from naive_bayes import NaiveBayes +from kmeans import KMeans +from preprocess import load_data, train_test_split, normalize_data + +def run_experiment(): + data = load_data('data/iris.csv') + X = data.iloc[:, :-1].values # Características + y = data.iloc[:, -1].values # Rótulos + + X = normalize_data(X) # Normalização dos dados + + # Dividir os dados em treino e teste + X_train, X_test, y_train, y_test = train_test_split(X, y) + + # Aplicar Naive Bayes + nb = NaiveBayes() + nb.fit(X_train, y_train) + y_pred = nb.predict(X_test) + + # Calcular a acurácia do Naive Bayes + accuracy = np.mean(y_pred == y_test) + print(f'Acurácia do Naive Bayes: {accuracy * 100:.2f}%') + + # Clusterização com KMeans + kmeans = KMeans(n_clusters=3) + kmeans.fit(X_train) + clusters = kmeans.labels + + print("Clusters gerados pelo KMeans:", clusters) + +if __name__ == "__main__": + run_experiment() diff --git a/project/src/kmeans.py b/project/src/kmeans.py new file mode 100644 index 0000000..de57844 --- /dev/null +++ b/project/src/kmeans.py @@ -0,0 +1,25 @@ +import numpy as np + +class KMeans: + def __init__(self, n_clusters=3): + self.n_clusters = n_clusters + + def fit(self, X): + # Inicializar centróides aleatórios + self.centroids = X[np.random.choice(X.shape[0], self.n_clusters, replace=False)] + prev_centroids = np.zeros(self.centroids.shape) + + while np.linalg.norm(self.centroids - prev_centroids) > 1e-4: + prev_centroids = self.centroids.copy() + # Atribuir pontos aos clusters + self.labels = self._assign_clusters(X) + # Recalcular os centróides + self.centroids = self._update_centroids(X) + + def _assign_clusters(self, X): + distances = np.linalg.norm(X[:, np.newaxis] - self.centroids, axis=2) + return np.argmin(distances, axis=1) + + def _update_centroids(self, X): + centroids = np.array([X[self.labels == i].mean(axis=0) for i in range(self.n_clusters)]) + return centroids diff --git a/project/src/naive_bayes.py b/project/src/naive_bayes.py new file mode 100644 index 0000000..4eb5a09 --- /dev/null +++ b/project/src/naive_bayes.py @@ -0,0 +1,32 @@ +import numpy as np + +class NaiveBayes: + def fit(self, X, y): + # Calcular a probabilidade para cada classe + self.classes = np.unique(y) + self.mean = {} + self.var = {} + self.prior = {} + + for c in self.classes: + X_c = X[y == c] + self.mean[c] = X_c.mean(axis=0) + self.var[c] = X_c.var(axis=0) + self.prior[c] = len(X_c) / len(X) + + def predict(self, X): + predictions = [self._predict(x) for x in X] + return np.array(predictions) + + def _predict(self, x): + posteriors = [] + for c in self.classes: + prior = np.log(self.prior[c]) + likelihood = np.sum(np.log(self._pdf(c, x))) + posteriors.append(prior + likelihood) + return self.classes[np.argmax(posteriors)] + + def _pdf(self, c, x): + mean = self.mean[c] + var = self.var[c] + return (1 / np.sqrt(2 * np.pi * var)) * np.exp(-(x - mean) ** 2 / (2 * var)) diff --git a/project/src/preprocess.py b/project/src/preprocess.py new file mode 100644 index 0000000..32cbb13 --- /dev/null +++ b/project/src/preprocess.py @@ -0,0 +1,19 @@ +import pandas as pd +import numpy as np + +def load_data(file_path): + data = pd.read_csv(file_path) + return data + +def normalize_data(X): + # Normalização dos dados (entre 0 e 1) + return (X - X.min()) / (X.max() - X.min()) + +def train_test_split(X, y, test_size=0.3): + # Dividindo os dados em treino e teste + test_size = int(len(X) * test_size) + X_train = X[:len(X) - test_size] + X_test = X[len(X) - test_size:] + y_train = y[:len(y) - test_size] + y_test = y[len(y) - test_size:] + return X_train, X_test, y_train, y_test