diff options
| Commit | f4c86d83629b282f39cc3750d42c8afe77d24fe9 (patch) | |
|---|---|---|
| Author | 2025-01-12 22:33:48 +0200 | |
| Committer | 2025-01-12 22:33:48 +0200 | |
| Files | 0f0d810e52d5c0c80a3f548b8d304c46cbe41e9a | |
| uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.tar uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.tar.gz uni-projects-f4c86d83629b282f39cc3750d42c8afe77d24fe9.zip | ||
| Parent | a1295f15503548758be351b52b54874537483f6a (diff) | |
hw(AI/6): Progress
4 files changed, 535 insertions, 0 deletions
| -rw-r--r-- | Year 4/Artificial Intelligence/hw06/src/data.rs | 408 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw06/src/main.rs | 8 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw06/src/probabilities.rs | 83 | ||||
| -rw-r--r-- | Year 4/Artificial Intelligence/hw06/src/tree.rs | 36 |
diff --git a/Year 4/Artificial Intelligence/hw06/src/data.rs b/Year 4/Artificial Intelligence/hw06/src/data.rs new file mode 100644 index 0000000..8eff0fd --- /dev/null +++ b/Year 4/Artificial Intelligence/hw06/src/data.rs @@ -0,0 +1,408 @@ +#![allow(non_camel_case_types)] +use rand::{thread_rng, prelude::SliceRandom}; + +#[derive(Clone, PartialEq)] +pub enum Events { + no_recurrence_events, recurrence_events +} +use Events::*; + +#[derive(Clone)] +pub enum Age { + a10_19, a20_29, a30_39, a40_49, a50_59, a60_69, a70_79, a80_89, a90_99 +} +use Age::*; + +#[derive(Clone)] +pub enum Menopause { + lt40, ge40, premeno +} +use Menopause::*; + +#[derive(Clone)] +pub enum TumorSize { + t0_4, t5_9, t10_14, t15_19, t20_24, t25_29, t30_34, t35_39, t40_44, t45_49, t50_54, t55_59 +} +use TumorSize::*; + +#[derive(Clone)] +pub enum InvNodes { + i0_2, i3_5, i6_8, i9_11, i12_14, i15_17, i18_20, i21_23, i24_26, i27_29, i30_32, i33_35, i36_39 +} +use InvNodes::*; + +#[derive(Clone)] +pub enum Binary { + yes, no, q +} +use Binary::*; + +#[derive(Clone)] +pub enum Breast { + left, right +} +use Breast::*; + +#[derive(Clone)] +pub enum BreastQuad { + left_up, left_low, right_up, right_low, central, qbq +} +use BreastQuad::*; + +#[derive(Clone, Debug, PartialEq, Iterable)] +struct Person { + events: Events, + age: Age, + menopause: Menopause, + tumor_size: TumorSize, + inv_nodes: InvNodes, + node_caps: Binary, + deg_malig: u8, + breast: Breast, + breast_quad: BreastQuad, + irradiat: Binary, +} + +impl Person { + const fn new( + events: Events, + age: Age, + menopause: Menopause, + tumor_size: TumorSize, + inv_nodes: InvNodes, + node_caps: Binary, + deg_malig: u8, + breast: Breast, + breast_quad: BreastQuad, + irradiat: Binary, + ) -> Person { + Person { + events, + age, + menopause, + tumor_size, + inv_nodes, + node_caps, + deg_malig, + breast, + breast_quad, + irradiat, + } + } +} + +/// Returns (training, testing) +/// Replace q and qbq! +pub fn get_data() -> (Vec<Person>, Vec<Person>) { + let mut vec = dataset.to_vec(); + assert_eq!((vec.len() as f64 * 0.8) as usize - 1, 347); + // We want 70.27972% to be no_recurrence and the other to be recurrence + // We use 80% for training and 20% for testing + // Meaning, our training data is 229 elements, + // where 161 are no_recurrence and 68 are recurrence + vec.rotate_right(68); + let (a, b) = vec.split_at(229); + + assert_eq!( + a.into_iter() + .fold(0, |acc, person| if person.events == recurrence_events { + acc + 1 + } else { + acc + }), + 68); + + let (mut a, mut b) = (a.to_vec(), b.to_vec()); + a.shuffle(&mut thread_rng()); + b.shuffle(&mut thread_rng()); + (a, b) +} + +static dataset: [Person; 286] = [ + Person::new(no_recurrence_events,a30_39,premeno,t30_34,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t0_4,i0_2,no,2,right,right_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t50_54,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t0_4,i0_2,no,3,left,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,lt40,t10_14,i0_2,no,1,left,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,3,left,right_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a60_69,lt40,t30_34,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t15_19,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t40_44,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t35_39,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t20_24,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t40_44,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,right,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,left,left_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t30_34,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,2,left,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,1,right,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,1,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t5_9,i0_2,no,1,left,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t50_54,i0_2,no,1,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,left,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,right,right_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,right,left_low,no), + Person::new(no_recurrence_events,a50_59,lt40,t15_19,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a30_39,premeno,t20_24,i0_2,no,2,left,right_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a70_79,ge40,t20_24,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a70_79,ge40,t40_44,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a70_79,ge40,t40_44,i0_2,no,1,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,1,right,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t5_9,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,1,left,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t0_4,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a20_29,premeno,t35_39,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,left,right_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,right,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t50_54,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,right,right_low,no), + Person::new(no_recurrence_events,a30_39,premeno,t5_9,i0_2,no,2,left,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,1,left,central,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t10_14,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,1,left,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a70_79,ge40,t0_4,i0_2,no,1,left,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t40_44,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t0_4,i0_2,no,2,right,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,right,right_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,right_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a40_49,ge40,t20_24,i0_2,no,3,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,3,right,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,right,right_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,right_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,right,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t40_44,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,right,right_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,1,right,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,ge40,t20_24,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t10_14,i0_2,no,1,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,1,left,right_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,no,2,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,right,left_low,no), + Person::new(no_recurrence_events,a70_79,ge40,t10_14,i0_2,no,2,left,central,no), + Person::new(no_recurrence_events,a30_39,premeno,t30_34,i6_8,yes,2,right,right_up,no), + Person::new(no_recurrence_events,a30_39,premeno,t25_29,i6_8,yes,2,right,left_up,yes), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,yes,2,left,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i9_11,yes,2,right,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i9_11,yes,2,right,right_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t40_44,i3_5,yes,3,right,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i6_8,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t40_44,i0_2,no,3,left,right_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i0_2,no,2,left,left_low,yes), + Person::new(no_recurrence_events,a30_39,premeno,t20_24,i3_5,no,2,right,central,no), + Person::new(no_recurrence_events,a30_39,premeno,t40_44,i3_5,no,3,right,right_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t5_9,i0_2,no,1,left,left_low,yes), + Person::new(no_recurrence_events,a30_39,premeno,t40_44,i0_2,no,2,left,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,left,right_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t40_44,i3_5,yes,2,left,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t20_24,i3_5,yes,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,1,left,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t45_49,i0_2,no,2,left,left_low,yes), + Person::new(no_recurrence_events,a60_69,ge40,t45_49,i6_8,yes,3,left,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,q,2,left,right_low,yes), + Person::new(no_recurrence_events,a60_69,ge40,t50_54,i0_2,no,2,right,left_up,yes), + Person::new(no_recurrence_events,a50_59,premeno,t30_34,i3_5,yes,2,left,left_low,yes), + Person::new(no_recurrence_events,a30_39,premeno,t20_24,i0_2,no,3,left,central,no), + Person::new(no_recurrence_events,a50_59,lt40,t30_34,i0_2,no,3,right,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i15_17,yes,3,right,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i3_5,yes,3,left,left_low,no), + Person::new(no_recurrence_events,a50_59,ge40,t35_39,i15_17,no,3,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,3,right,left_up,yes), + Person::new(no_recurrence_events,a30_39,lt40,t15_19,i0_2,no,3,right,left_up,no), + Person::new(no_recurrence_events,a60_69,ge40,t40_44,i3_5,no,2,right,left_up,yes), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i3_5,yes,3,right,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t30_34,i0_2,no,1,left,central,no), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i0_2,no,1,right,central,no), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,right,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i3_5,yes,2,right,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,2,right,left_up,yes), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i3_5,q,1,right,left_up,yes), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i3_5,q,1,right,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i3_5,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i3_5,no,2,right,left_low,no), + Person::new(no_recurrence_events,a40_49,ge40,t40_44,i15_17,yes,2,right,left_up,yes), + Person::new(no_recurrence_events,a50_59,premeno,t10_14,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,ge40,t30_34,i0_2,no,2,left,left_up,yes), + Person::new(no_recurrence_events,a30_39,premeno,t20_24,i3_5,yes,2,right,left_up,yes), + Person::new(no_recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t30_34,i6_8,yes,2,right,right_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i3_5,yes,2,right,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i3_5,yes,2,left,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t30_34,i0_2,no,2,right,right_up,yes), + Person::new(no_recurrence_events,a40_49,ge40,t25_29,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t10_14,i0_2,no,2,left,left_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i3_5,no,2,right,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i0_2,no,3,right,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,yes,3,right,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t35_39,i0_2,yes,3,right,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,1,right,left_low,yes), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i9_11,q,3,left,left_up,yes), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i9_11,q,3,left,left_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t20_24,i6_8,no,2,right,left_low,yes), + Person::new(no_recurrence_events,a50_59,ge40,t25_29,i0_2,no,1,left,right_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t15_19,i0_2,no,2,left,left_up,yes), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,right,left_up,no), + Person::new(no_recurrence_events,a50_59,ge40,t20_24,i0_2,yes,2,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t15_19,i12_14,no,3,right,right_low,yes), + Person::new(no_recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_up,yes), + Person::new(no_recurrence_events,a50_59,ge40,t30_34,i6_8,yes,2,left,left_low,no), + Person::new(no_recurrence_events,a30_39,premeno,t10_14,i0_2,no,2,left,right_low,no), + Person::new(no_recurrence_events,a50_59,premeno,t50_54,i0_2,yes,2,right,left_up,yes), + Person::new(no_recurrence_events,a50_59,ge40,t35_39,i0_2,no,2,left,left_up,no), + Person::new(no_recurrence_events,a50_59,premeno,t10_14,i3_5,no,1,right,left_up,no), + Person::new(no_recurrence_events,a40_49,premeno,t10_14,i0_2,no,2,left,left_low,yes), + Person::new(no_recurrence_events,a50_59,ge40,t15_19,i0_2,yes,2,left,central,yes), + Person::new(no_recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,left,left_low,no), + Person::new(no_recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,right,left_low,no), + Person::new(recurrence_events,a50_59,premeno,t15_19,i0_2,no,2,left,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t40_44,i0_2,no,1,left,left_low,no), + Person::new(recurrence_events,a50_59,ge40,t35_39,i0_2,no,2,left,left_low,no), + Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,right_up,no), + Person::new(recurrence_events,a30_39,premeno,t0_4,i0_2,no,2,right,central,no), + Person::new(recurrence_events,a50_59,ge40,t30_34,i0_2,no,3,left,qbq,no), + Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,2,left,right_up,no), + Person::new(recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,left,right_up,no), + Person::new(recurrence_events,a40_49,premeno,t35_39,i0_2,no,1,right,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t20_24,i0_2,no,2,left,left_low,no), + Person::new(recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,right,central,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,no,3,right,right_up,no), + Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,1,right,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t40_44,i0_2,no,2,right,left_low,no), + Person::new(recurrence_events,a40_49,ge40,t20_24,i0_2,no,2,right,left_up,no), + Person::new(recurrence_events,a50_59,ge40,t20_24,i0_2,no,2,left,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t15_19,i0_2,no,2,left,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,right,central,no), + Person::new(recurrence_events,a30_39,premeno,t15_19,i0_2,no,1,right,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,left,right_up,no), + Person::new(recurrence_events,a30_39,premeno,t30_34,i0_2,no,1,right,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,left,right_low,yes), + Person::new(recurrence_events,a60_69,ge40,t20_24,i0_2,no,3,right,left_low,no), + Person::new(recurrence_events,a30_39,premeno,t25_29,i3_5,yes,3,left,left_low,yes), + Person::new(recurrence_events,a40_49,ge40,t20_24,i3_5,no,3,right,left_low,yes), + Person::new(recurrence_events,a40_49,premeno,t30_34,i15_17,yes,3,left,left_low,no), + Person::new(recurrence_events,a50_59,premeno,t30_34,i0_2,no,3,right,left_up,yes), + Person::new(recurrence_events,a60_69,ge40,t40_44,i3_5,yes,3,right,left_low,no), + Person::new(recurrence_events,a60_69,ge40,t45_49,i0_2,no,1,right,right_up,yes), + Person::new(recurrence_events,a50_59,premeno,t50_54,i9_11,yes,2,right,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i3_5,no,2,right,left_up,no), + Person::new(recurrence_events,a30_39,premeno,t30_34,i3_5,no,3,right,left_up,yes), + Person::new(recurrence_events,a70_79,ge40,t15_19,i9_11,q,1,left,left_low,yes), + Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,no,3,right,left_up,yes), + Person::new(recurrence_events,a50_59,premeno,t25_29,i3_5,yes,3,left,left_low,yes), + Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,right,left_low,no), + Person::new(recurrence_events,a30_39,premeno,t35_39,i0_2,no,3,left,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t20_24,i3_5,yes,2,right,right_up,yes), + Person::new(recurrence_events,a60_69,ge40,t20_24,i3_5,no,2,left,left_low,yes), + Person::new(recurrence_events,a40_49,premeno,t15_19,i15_17,yes,3,left,left_low,no), + Person::new(recurrence_events,a50_59,ge40,t25_29,i6_8,no,3,left,left_low,yes), + Person::new(recurrence_events,a50_59,ge40,t20_24,i3_5,yes,3,right,right_up,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i12_14,yes,3,left,left_up,yes), + Person::new(recurrence_events,a30_39,premeno,t30_34,i9_11,no,2,right,left_up,yes), + Person::new(recurrence_events,a30_39,premeno,t15_19,i6_8,yes,3,left,left_low,yes), + Person::new(recurrence_events,a50_59,ge40,t30_34,i9_11,yes,3,left,right_low,yes), + Person::new(recurrence_events,a60_69,ge40,t35_39,i6_8,yes,3,left,left_low,no), + Person::new(recurrence_events,a30_39,premeno,t20_24,i3_5,yes,2,left,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,3,left,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t50_54,i0_2,no,2,right,left_low,yes), + Person::new(recurrence_events,a30_39,premeno,t40_44,i0_2,no,1,left,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t50_54,i0_2,no,3,right,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,yes,3,right,right_up,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i6_8,yes,3,right,left_up,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i0_2,no,1,left,left_low,yes), + Person::new(recurrence_events,a40_49,premeno,t20_24,i3_5,yes,2,left,left_low,yes), + Person::new(recurrence_events,a50_59,ge40,t30_34,i6_8,yes,2,left,right_low,yes), + Person::new(recurrence_events,a50_59,ge40,t30_34,i3_5,no,3,right,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t25_29,i3_5,no,2,right,right_up,no), + Person::new(recurrence_events,a40_49,ge40,t25_29,i12_14,yes,3,left,right_low,yes), + Person::new(recurrence_events,a60_69,ge40,t25_29,i0_2,no,3,left,left_up,no), + Person::new(recurrence_events,a50_59,lt40,t20_24,i0_2,q,1,left,left_up,no), + Person::new(recurrence_events,a50_59,lt40,t20_24,i0_2,q,1,left,left_low,no), + Person::new(recurrence_events,a30_39,premeno,t35_39,i9_11,yes,3,left,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t30_34,i3_5,yes,2,left,right_up,no), + Person::new(recurrence_events,a60_69,ge40,t20_24,i24_26,yes,3,left,left_low,yes), + Person::new(recurrence_events,a30_39,premeno,t35_39,i0_2,no,3,left,left_low,no), + Person::new(recurrence_events,a40_49,premeno,t25_29,i0_2,no,2,left,left_low,yes), + Person::new(recurrence_events,a50_59,ge40,t30_34,i6_8,yes,3,left,right_low,no), + Person::new(recurrence_events,a50_59,premeno,t25_29,i0_2,no,3,right,left_low,yes), + Person::new(recurrence_events,a40_49,premeno,t15_19,i0_2,yes,3,right,left_up,no), + Person::new(recurrence_events,a60_69,ge40,t30_34,i0_2,yes,2,right,right_up,yes), + Person::new(recurrence_events,a60_69,ge40,t30_34,i3_5,yes,2,left,central,yes), + Person::new(recurrence_events,a40_49,premeno,t25_29,i9_11,yes,3,right,left_up,no), + Person::new(recurrence_events,a30_39,premeno,t25_29,i6_8,yes,3,left,right_low,yes), + Person::new(recurrence_events,a60_69,ge40,t10_14,i6_8,yes,3,left,left_up,yes), + Person::new(recurrence_events,a50_59,premeno,t35_39,i15_17,yes,3,right,right_up,no), + Person::new(recurrence_events,a50_59,ge40,t40_44,i6_8,yes,3,left,left_low,yes), + Person::new(recurrence_events,a50_59,ge40,t40_44,i6_8,yes,3,left,left_low,yes), + Person::new(recurrence_events,a30_39,premeno,t30_34,i0_2,no,2,left,left_up,no), + Person::new(recurrence_events,a30_39,premeno,t20_24,i0_2,no,3,left,left_up,yes), + Person::new(recurrence_events,a60_69,ge40,t20_24,i0_2,no,1,right,left_up,no), + Person::new(recurrence_events,a40_49,ge40,t30_34,i3_5,no,3,left,left_low,no), + Person::new(recurrence_events,a50_59,ge40,t30_34,i3_5,no,3,left,left_low,no), +]; diff --git a/Year 4/Artificial Intelligence/hw06/src/main.rs b/Year 4/Artificial Intelligence/hw06/src/main.rs new file mode 100644 index 0000000..c2de2b9 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw06/src/main.rs @@ -0,0 +1,8 @@ +use text_io::read; + +mod data; + +fn main() { + // let pruning: u8 = read!(); + let (training, testing) = data::get_data(); +} diff --git a/Year 4/Artificial Intelligence/hw06/src/probabilities.rs b/Year 4/Artificial Intelligence/hw06/src/probabilities.rs new file mode 100644 index 0000000..69d9671 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw06/src/probabilities.rs @@ -0,0 +1,83 @@ +use crate::data::*; +use crate::data::*::*; + +pub fn entropy(sample: Vec<Person>) -> f64 { + // Target is Person.events + let rec = 0.0; + for p in sample { + if p.events == Events::recurrence_events { + rec += 1.0; + } + } + let total = sample.size() as f64; + let no_rec = total - rec; + + - (rec / total) * (rec / total).log2() + - (no_rec / total) * (no_rec / total).log2() +} + +macro_rules! gain_impl{ + // Single value: entropy(Sv) * |Sv| / |S| + ($sample:ident, $attr:tt, $val:tt) => { + { + let sample_v = sample + .clone() + .into_iter() + .filter(|p| p.$attr == $val) + .collect(); + entropy(sample_v) * sample_v.len() as f64 / $sample.len() as f64 + } + } + // All value: entropy(S) - Sum(single value) + ($sample:ident, $attr:tt; $($val:tt),+) => { + { + let sum = 0; + $( + sum += gain_impl!($sample, $attr, $val); + )* + entropy($sample) - sum + } + }; +} + +pub fn gain(sample: &Vec<Person>, feature: string) -> f64 { + match feature { + "age" => gain_impl!( + sample, age; + a10_19, a20_29, a30_39, a40_49, a50_59, a60_69, a70_79, a80_89, a90_99 + ), + "menopause" => gain_impl!( + sample, menopause; + lt40, ge40, premeno + ), + "tumor_size" => gain_impl!( + sample, tumor_size; + t0_4, t5_9, t10_14, t15_19, t20_24, t25_29, t30_34, t35_39, t40_44, t45_49, t50_54, t55_59 + ), + "inv_nodes" => gain_impl!( + sample, inv_nodes; + i0_2, i3_5, i6_8, i9_11, i12_14, i15_17, i18_20, i21_23, i24_26, i27_29, i30_32, i33_35, i36_39 + ), + "node_caps" => gain_impl!( + sample, node_caps; + yes, no, q + ), + "deg_malig" => gain_impl!( + sample, deg_malig; + 1, 2, 3 + ), + "breast" => gain_impl!( + sample, breast; + left, right + ), + "breast_quad" => gain_impl!( + sample, breast_quad; + left_up, left_low, right_up, right_low, central, qbq + ), + "irradiat" => gain_impl!( + sample, irradiat; + yes, no, q + ), + _ => unreachable!("Feature {feature} doesn't exit!"), + } +} diff --git a/Year 4/Artificial Intelligence/hw06/src/tree.rs b/Year 4/Artificial Intelligence/hw06/src/tree.rs new file mode 100644 index 0000000..86982a3 --- /dev/null +++ b/Year 4/Artificial Intelligence/hw06/src/tree.rs @@ -0,0 +1,36 @@ +use crate::probabilities::*; +use crate::data::*; + +pub struct Node<T> { + decision: HashMap<T, Node>, + leaf: Option<Events>, +} + +impl Node { + fn new_leaf(value: Events) -> Node { + Node { + decision: HashMap::new(), + leaf: Some(value), + } + } + + fn new_node() -> Node { + Node { + decision: HashMap::new(), + leaf: None, + } + } +} + +pub struct Tree { + root: Node, +} + +impl Tree { + pub fn new(sample: Vec<Person>, features: Vec<string>) -> Tree { + let max_feature = features + .into_iter() + .max_by(|x, y| gain(sample, x).cmp(gain(sample, y))); + let root = Node::new_node(); + } +} |
