Summary Files Commits Branches @commit @diff @stats
diff options
context:
space:
mode:
Commitdafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa (patch)
Author
 Syndamia <kamen@syndamia.com>
2025-01-05 20:48:44 +0200
Committer
 Syndamia <kamen@syndamia.com>
2025-01-05 20:48:44 +0200
Filesb246fc8afedb1146cef41ecb59991a5359d29def
uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.tar
uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.tar.gz
uni-projects-dafd2d2bad0a6a0a1a48c4aa000eb59755efcfaa.zip
Parentb99abb4a606958be17f19e88a79884e80435e030 (diff)
hw(AT/5): Implement filling missing values
1 files changed, 99 insertions, 4 deletions
-rw-r--r--Year 4/Artificial Intelligence/hw05/src/probabilities.rs103
diff --git a/Year 4/Artificial Intelligence/hw05/src/probabilities.rs b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs
index 7468bdb..452441e 100644
--- a/Year 4/Artificial Intelligence/hw05/src/probabilities.rs
+++ b/Year 4/Artificial Intelligence/hw05/src/probabilities.rs
@@ -1,6 +1,7 @@
use crate::data::{Party, Person, Value};
use std::collections::HashMap;
use struct_iterable::Iterable;
+use rand::{ thread_rng, Rng };
pub fn party_probabilities(dataset: &Vec<Person>)
-> HashMap<Party, f64> {
@@ -25,11 +26,15 @@ macro_rules! P {
{
use crate::data::Value;
use struct_iterable::Iterable;
+ use rand::{ thread_rng, Rng };
let mut prob = if $party == crate::data::Party::democrat { 0.61 } else { 0.39 };
for (name, val) in $person.iter() {
if name == "party" { continue; }
- let val = val.downcast_ref::<Value>().unwrap();
+ let mut val = val.downcast_ref::<Value>().unwrap().clone();
+ if val == Value::q && ! $prob.0.contains_key(&Value::q) {
+ val = if thread_rng().gen_bool(0.5) { Value::y } else { Value::n };
+ }
prob *= P!(name = val | $party, $prob) / P!(name = val, $prob);
}
prob
@@ -37,11 +42,11 @@ macro_rules! P {
};
// P("crime"=y|democrat)
( $attr:tt = $value:tt | $party:tt , $prob:ident ) => {
- $prob.1[&$party][$value][$attr]
+ $prob.1[&$party][&$value][$attr]
};
// P("crime"=y)
( $attr:tt = $value:tt , $prob:ident ) => {
- $prob.0[$value][$attr]
+ $prob.0[&$value][$attr]
};
}
@@ -169,5 +174,95 @@ pub fn value_3_probabilities(dataset: &Vec<Person>) -> PMaps {
}
pub fn value_2_probabilities(dataset: &Vec<Person>) -> PMaps {
- todo!();
+ let mut len = dataset.len() as f64;
+
+ // P(Value[attr])
+ let mut ret_y = HashMap::new();
+ let mut ret_n = HashMap::new();
+
+ for (name, _) in dataset[0].iter() {
+ if name == "party" { continue; }
+
+ let (count_y, count_n) = dataset
+ .into_iter()
+ .fold((0.0, 0.0), |mut acc, person| {
+ match person[name] {
+ Value::y => acc.0 += 1.0,
+ Value::n => acc.1 += 1.0,
+ Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 },
+ }
+ acc
+ });
+ ret_y.insert(name.to_string(), count_y / len);
+ ret_n.insert(name.to_string(), count_n / len);
+ }
+
+ let mut simple_p = HashMap::new();
+ simple_p.insert(Value::y, ret_y);
+ simple_p.insert(Value::n, ret_n);
+
+ // P(Value[attr]|Party)
+ let mut complex_p = HashMap::new();
+
+ // P(Value[attr]|democrat)
+ let mut ret_y = HashMap::new();
+ let mut ret_n = HashMap::new();
+ len = 214.0;
+
+ for (name, _) in dataset[0].iter() {
+ if name == "party" { continue; }
+
+ let (count_y, count_n) = dataset
+ .into_iter()
+ .fold((0.0, 0.0), |mut acc, person| {
+ if person.party == Party::democrat {
+ match person[name] {
+ Value::y => acc.0 += 1.0,
+ Value::n => acc.1 += 1.0,
+ Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 },
+ }
+ }
+ acc
+ });
+ ret_y.insert(name.to_string(), count_y / len);
+ ret_n.insert(name.to_string(), count_n / len);
+ }
+
+ let mut party_p = HashMap::new();
+ party_p.insert(Value::y, ret_y);
+ party_p.insert(Value::n, ret_n);
+
+ complex_p.insert(Party::democrat, party_p);
+
+ // P(Value[attr]|republican)
+ let mut ret_y = HashMap::new();
+ let mut ret_n = HashMap::new();
+ len = 134.0;
+
+ for (name, _) in dataset[0].iter() {
+ if name == "party" { continue; }
+
+ let (count_y, count_n) = dataset
+ .into_iter()
+ .fold((0.0, 0.0), |mut acc, person| {
+ if person.party == Party::republican {
+ match person[name] {
+ Value::y => acc.0 += 1.0,
+ Value::n => acc.1 += 1.0,
+ Value::q => if thread_rng().gen_bool(0.5) { acc.0 += 1.0 } else { acc.1 += 1.0 },
+ }
+ }
+ acc
+ });
+ ret_y.insert(name.to_string(), count_y / len);
+ ret_n.insert(name.to_string(), count_n / len);
+ }
+
+ let mut party_p = HashMap::new();
+ party_p.insert(Value::y, ret_y);
+ party_p.insert(Value::n, ret_n);
+
+ complex_p.insert(Party::republican, party_p);
+
+ (simple_p, complex_p)
}