diff --git a/Cluster2.py b/Cluster2.py deleted file mode 100644 index e41e34d9e2b0dc9d23bdf76f3a18ba6e9f76b455..0000000000000000000000000000000000000000 --- a/Cluster2.py +++ /dev/null @@ -1,37 +0,0 @@ -from sklearn.decomposition import PCA #PCA on Principal Component Analysis, eli pääkomponenttianalyysi, joka vähentää ulottuvuuksia -import pandas as pd -from sklearn.cluster import KMeans -from sklearn.preprocessing import StandardScaler -import matplotlib.pyplot as plt #matplotlib visualisointiin, lataa gitillä "pip install matplotlib" - -# Ladataan raakadata -data = pd.read_csv("raakadata.csv") - -# Valitaan klusterointiin käytettävät attribuutit -features = ["Height", "Circumference", "BarkThickness", "PineNo", "NeedleNo"] -X = data[features] - -# Normalisoidaan data -scaler = StandardScaler() -X_scaled = scaler.fit_transform(X) - -# Klusteroidaan raakadata K-means-avulla -kmeans_raw = KMeans(n_clusters=4, random_state=42) -data["Cluster_Raw"] = kmeans_raw.fit_predict(X_scaled) + 1 - -# Vähennetään ulottuvuudet kahteen PCA:lla -pca = PCA(n_components=2) -X_pca = pca.fit_transform(X_scaled) - -# Visualisoidaan klusterointi PCA:lla -scatter = plt.scatter(X_pca[:, 0], X_pca[:, 1], c=data["Cluster_Raw"], cmap="viridis") -plt.title("Raakadatan klusterointi (PCA)") -plt.xlabel("yhdistetty data 1") -plt.ylabel("yhdistettu data 2") - -# Lisätään selite -legend1 = plt.legend(*scatter.legend_elements(), title="Klusterit") -plt.gca().add_artist(legend1) - -# Näytetään kuva -plt.show() \ No newline at end of file diff --git a/Ominaisuussuunnittelu.txt b/Ominaisuussuunnittelu.txt index a21ac8a3ab60b3ebbac06d246f4188575627e859..a8f997729c071a66e26b6cc5783e957a607b69d0 100644 --- a/Ominaisuussuunnittelu.txt +++ b/Ominaisuussuunnittelu.txt @@ -42,3 +42,17 @@ Tämä auttaa tunnistamaan puulajeja. ---------------------------------------- +Korkeus suhteessa ympärysmittaan: + +data['Height_to_Circumference'] = data['Height'] / data['Circumference'] + +Auttaa tunnistamaan kasvutapoja ja puiden muotoja. + +---------------------------------------- + +Neulasten määrä suhteessa kaarnan paksuuteen: + +data['Needles_to_Bark'] = data['NeedleNo'] / data['BarkThickness'] + +Auttaa tunnistamaan kasvuolosuhteet ja puun iän. + diff --git a/Raportti.txt b/Raportti.txt index 763316b177b4b326754f3f12e770bac5f11abd3b..b1c2cdb89d0fc5c8f74a4c0e5549e10b7e3f6ca4 100644 --- a/Raportti.txt +++ b/Raportti.txt @@ -15,7 +15,7 @@ Näin kuvaajista saatiin hieman luettavampia. Käytimme Principal Component Analysis, eli pääkomponenttianalyysia, joka vähentää ulottuvuuksia. Näin data on jaettu kahteen pääkomponenttiin, x- ja y-akselille kuvaajalla. -2. Ominaisuussuunnittelu ##KESKEN +2. Ominaisuussuunnittelu Lisäsimme uusia ominaisuuksia, jotka auttavat tunnistamaan eri tyyppejä. 1. Käpyjen ja neulasten suhde ['Needles_per_Pine']: Tämän avulla voidaan tunnistaa eri puulajeja ja arvioida karkeasti kasvuympäristöä ja puun hyvinvointia. 2. Puun tilavuuden likimäärä ['VolumeIndex']: @@ -27,10 +27,19 @@ Lisäsimme uusia ominaisuuksia, jotka auttavat tunnistamaan eri tyyppejä. Katso Ominaisuussuunnittelu.txt, sieltä näkee miten uudet ominaisuudet on johdettu. -3. Muokatun datan klusterointi ## KESKEN +3. Muokatun datan klusterointi Muokatun datan klusterointi tuotti selkeämmät klusterit, jotka erottelivat puut ominaisuuksien perusteella. +Käytimme ominaisuussuunnittelun avulla luotuja uusia attribuutteja, kuten neulastiheyttä ja puun tilavuusindeksiä, +jotka auttoivat ryhmittelemään puut niiden biologisten ja rakenteellisten ominaisuuksien perusteella. +Työn pohjana toimivat Pandas ja K-Means -klusterointi. Klusterit visualisoitiin PCA:n +avulla kahdessa ulottuvuudessa. Lisäksi poistimme 1% kaukaisimmista pisteistä, jotta +visualisointi keskittyisi olennaisiin havaintoihin. -4.Johtopäätökset ## KESKEN +Katso Uusien ominaisuuksien klusterointi.py + +4.Johtopäätökset Biologien alkuperäinen luokittelu ei täysin vastannut klusteroinnin tuloksia. -Uudet ominaisuudet, kuten `--` ja `--`, auttoivat parantamaan klusterointia. -Näiden avulla saimme paremman näkemyksen puiden eroista, kuten .... \ No newline at end of file +Uudet ominaisuudet auttoivat parantamaan klusterointia, sillä ne erottelivat puut esimerkiksi +niiden kasvutapojen, iän ja lajityypin perusteella. +Näiden avulla saimme paremman näkemyksen puiden eroista, kuten neulasten määrä suhteessa +kaarnan paksuuteen paljasti niiden ekologisia ja rakenteellisia eroja. \ No newline at end of file diff --git a/Uusien ominaisuuksien klusterointi.py b/Uusien ominaisuuksien klusterointi.py index 065ca9f9197c2cfbd5f22d4b3ceed2e0f24fc74d..6e8346ad11d7e1ccf4267c63454327b50685d6f9 100644 --- a/Uusien ominaisuuksien klusterointi.py +++ b/Uusien ominaisuuksien klusterointi.py @@ -23,8 +23,10 @@ print("1. Puun tilavuuden suhde neulastiheyteen (auttaa tunnistamaan puutyyppej print("2. Käpytiheyden suhde puun tilavuuteen (auttaa tunnistamaan puiden iän ja lisääntymismahdollisuudet)") # features = ['Pine_Density', 'VolumeIndex'] print("3. Käpytiheyden suhde kaarnan paksuuteen (auttaa tunnistamaan puun iän ja lisääntymisvaiheen)") print("4. Neulastiheyden suhde käpytiheyteen (auttaa tunnistamaan 'lehtevät' ja lisääntymiskykyiset puut)") -print("5. Kaikki uudet ominaisuudet (luonnollinen ryhmittely)") -print("6. Exit") +print("5. korkeus suhteessa ympärysmittaan (auttaa tunnistamaan puiden kasvutapoja ja muotoja)") +print("6. neulasten määrä suhteessa kaarnan paksuuteen (auttaa tunnistamaan kasvuolosuhteet ja puun iän)") +print("7. Kaikki uudet ominaisuudet (luonnollinen ryhmittely)") +print("8. Exit") choice = input("Anna valitsemasi numero: ") @@ -57,14 +59,29 @@ elif choice == "4": yakseli = "Käpytiheys" elif choice == "5": + features = ['Height', 'Circumference'] # Lisätty, korkeus suhteessa ympärysmittaan + X = data[features] + title = "Puiden kasvutapoja ja puiden muotoja" + xakseli = "Korkeus" + yakseli = "Ympärysmitta" + +elif choice == "6": + features = ['NeedleNo', 'BarkThickness'] # neulasten määrä suhteessa kaarnan paksuuteen + X = data[features] + title = "Kasvuolosuhteet ja puun ikä" + xakseli = "Neulaset" + yakseli = "Kaarnan paksuus" + +elif choice == "7": features = ['Needles_per_Pine', 'Bark_to_Height', 'Pine_Density', 'Needle_Density', 'VolumeIndex', 'Height_to_Circumference', 'Needles_to_Bark'] # Valitaan klusterointiin käytettävät attribuutit X = data[features] title = "Luonnollinen ryhmittely" - xakseli = "Yhdistetyt ominaisuudet" - yakseli = "Yhdistetyt ominaisuudet" + xakseli = "Yhdistetyt ominaisuudet 1" + yakseli = "Yhdistetyt ominaisuudet 2" -elif choice == "6": + +elif choice == "8": print("Lopetetaan...") exit()