Files
logika_fuzzy_pada_kematanga…/backend/fuzzy.py
2022-04-03 02:36:18 +08:00

347 lines
15 KiB
Python

import matplotlib.pyplot as plt
import numpy as np
import pandas as pd
import csv
import skfuzzy as fuzz
import asyncio
async def contoh_dulu(data_durian,anggota_usia,anggota_berat,anggota_keliling,anggota_ukuran_batang,anggota_jarak_duri,i):
# hitungan fuzzy tsukamoto berdasarkan rule base
df = pd.read_csv("dataset/rule.csv")
rule_length = len(df.index)
list_rule = df
hitungan_fuzzy_tsukamoto = []
for e in range(i):
ket_usia = "Tinggi" if anggota_usia[e][0] < anggota_usia[e][1] else "Rendah"
ket_berat = "Tinggi" if anggota_berat[e][0] < anggota_berat[e][1] else "Rendah"
ket_keliling = "Tinggi" if anggota_keliling[e][0] <= anggota_keliling[e][1] else "Rendah"
ket_ukuran_batang = "Tinggi" if anggota_ukuran_batang[e][0] <= anggota_ukuran_batang[e][1] else "Rendah"
ket_jarak_duri = "Tinggi" if anggota_jarak_duri[e][0] < anggota_jarak_duri[e][1] else "Rendah"
keterangan = None
for n in range(rule_length):
if str(list_rule.at[n,'Usia']) == ket_usia and str(list_rule.at[n,'Berat']) == ket_berat and str(list_rule.at[n,'Keliling']) == ket_keliling and str(list_rule.at[n,'Ukuran Batang']) == ket_ukuran_batang and str(list_rule.at[n,'Jarak Duri']) == ket_jarak_duri:
keterangan = str(list_rule.at[n,'Keterangan'])
data = {"No" : e, "Usia" : ket_usia, "Berat" : ket_berat, "Keliling" : ket_keliling,
"Ukuran Batang" : ket_ukuran_batang, "Jarak Duri" : ket_jarak_duri ,"Variable Linguistic" : keterangan,
"Keterangan" : data_durian.at[e,'Keterangan'], "MSE" : 0 if keterangan == data_durian.at[e,'Keterangan'] else 1
}
hitungan_fuzzy_tsukamoto.append(data)
await asyncio.sleep(0.1)
return(hitungan_fuzzy_tsukamoto)
def FungsiKeanggotaan(_range, _min , _hi, _nilai):
mini = fuzz.interp_membership(_range,_min,_nilai)
hi = fuzz.interp_membership(_range,_hi,_nilai)
# await asyncio.sleep(0.1)
return mini , hi
def RangeSubjektif(_low, _high, _step):
subjektif = np.arange(_low, _high , _step)
return subjektif
def FuzzyShow(_rule, _range_subjektif, _title, _pic_title):
lo = fuzz.trapmf(_range_subjektif, _rule[0])
hi = fuzz.trapmf(_range_subjektif, _rule[1])
fig,ax = plt.subplots(nrows=1, figsize=(7,3))
ax.plot(_range_subjektif, lo, 'g' , linewidth = 1.5 , label= "Mentah")
ax.plot(_range_subjektif, hi, 'r' , linewidth = 1.5 , label= "Masak")
ax.set_title(_title)
ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
plt.tight_layout()
plt.savefig(_pic_title+'.png')
# plt.show()
return lo, hi
def FuzzyShow1(_rule, _range_subjektif, _title,_pic_title):
lo = fuzz.trapmf(_range_subjektif, _rule[0])
hi = fuzz.trapmf(_range_subjektif, _rule[1])
fig,ax = plt.subplots(nrows=1, figsize=(7,3))
ax.plot(_range_subjektif, lo, 'r' , linewidth = 1.5 , label= "Masak")
ax.plot(_range_subjektif, hi, 'g' , linewidth = 1.5 , label= "Mentah")
ax.set_title(_title)
ax.legend()
ax.spines['top'].set_visible(False)
ax.spines['right'].set_visible(False)
ax.get_xaxis().tick_bottom()
ax.get_yaxis().tick_left()
plt.tight_layout()
plt.savefig(_pic_title+'.png')
# plt.show()
return lo, hi
def get_average(min,max) :
a = (min + max) / 2
return a
async def himpunan_fuzzy(min_usia,mid_usia,max_usia,min_berat,mid_berat,max_berat,min_keliling,mid_keliling,max_keliling,min_ukuran_batang,mid_ukuran_batang,max_ukuran_batang,min_jarak_duri,mid_jarak_duri,max_jarak_duri):
a = None
himpunan_fuzzy = pd.read_csv("dataset/himpunan_fuzzy.csv")
himpunan_fuzzy.loc[0, 'Semesta Pembicaraan'] = f"[ {min_usia} , {max_usia} ]" # Semesta pembicaraan (Rendah) Usia
himpunan_fuzzy.loc[1, 'Semesta Pembicaraan'] = f"[ {min_usia} , {max_usia} ]" # Semesta pembicaraan (Tinggi) Usia
himpunan_fuzzy.loc[0, 'Domain'] = f"[ {min_usia} , {mid_usia + 0.5} ]" # Domain (Rendah) Usia
himpunan_fuzzy.loc[1, 'Domain'] = f"[ {mid_usia - 0.5} , {max_usia} ]" # Domain pembicaraan (Tinggi) Usia
# Fuzzykasi Berat
himpunan_fuzzy.loc[2, 'Semesta Pembicaraan'] = f"[ {min_berat} , {max_berat} ]" # Semesta pembicaraan (Rendah) Berat
himpunan_fuzzy.loc[3, 'Semesta Pembicaraan'] = f"[ {min_berat} , {max_berat} ]" # Semesta pembicaraan (Tinggi) Berat
himpunan_fuzzy.loc[2, 'Domain'] = f"[ {min_berat} , {mid_berat + 10} ]" # Domain (Rendah) Berat
himpunan_fuzzy.loc[3, 'Domain'] = f"[ {mid_berat - 10} , {max_berat} ]" # Domain pembicaraan (Tinggi) Berat
# Fuzzykasi Keliling
himpunan_fuzzy.loc[4, 'Semesta Pembicaraan'] = f"[ {min_keliling} , {max_keliling} ]" # Semesta pembicaraan (Rendah) Keliling
himpunan_fuzzy.loc[5, 'Semesta Pembicaraan'] = f"[ {min_keliling} , {max_keliling} ]" # Semesta pembicaraan (Tinggi) Keliling
himpunan_fuzzy.loc[4, 'Domain'] = f"[ {min_keliling} , {mid_keliling + 1} ]" # Domain (Rendah) Keliling
himpunan_fuzzy.loc[5, 'Domain'] = f"[ {mid_keliling - 1} , {max_keliling} ]" # Domain pembicaraan (Tinggi) Keliling
# Fuzzykasi Keliling
himpunan_fuzzy.loc[4, 'Semesta Pembicaraan'] = f"[ {min_keliling} , {max_keliling} ]" # Semesta pembicaraan (Rendah) Keliling
himpunan_fuzzy.loc[5, 'Semesta Pembicaraan'] = f"[ {min_keliling} , {max_keliling} ]" # Semesta pembicaraan (Tinggi) Keliling
himpunan_fuzzy.loc[4, 'Domain'] = f"[ {min_keliling} , {mid_keliling + 1} ]" # Domain (Rendah) Keliling
himpunan_fuzzy.loc[5, 'Domain'] = f"[ {mid_keliling - 1} , {max_keliling} ]" # Domain pembicaraan (Tinggi) Keliling
# Fuzzykasi Ukuran Batang
himpunan_fuzzy.loc[6, 'Semesta Pembicaraan'] = f"[ {min_ukuran_batang} , {max_ukuran_batang} ]" # Semesta pembicaraan (Rendah) Ukuran Batang
himpunan_fuzzy.loc[7, 'Semesta Pembicaraan'] = f"[ {min_ukuran_batang} , {max_ukuran_batang} ]" # Semesta pembicaraan (Tinggi) Ukuran Batang
himpunan_fuzzy.loc[6, 'Domain'] = f"[ {min_ukuran_batang} , {mid_ukuran_batang + 0.5} ]" # Domain (Rendah) Ukuran Batang
himpunan_fuzzy.loc[7, 'Domain'] = f"[ {mid_ukuran_batang - 0.5} , {max_ukuran_batang} ]" # Domain pembicaraan (Tinggi) Ukuran Batang
# Fuzzykasi Jarak Duri
himpunan_fuzzy.loc[8, 'Semesta Pembicaraan'] = f"[ {min_jarak_duri} , {max_jarak_duri} ]" # Semesta pembicaraan (Rendah) Jarak Duri
himpunan_fuzzy.loc[9, 'Semesta Pembicaraan'] = f"[ {min_jarak_duri} , {max_jarak_duri} ]" # Semesta pembicaraan (Tinggi) Jarak Duri
himpunan_fuzzy.loc[8, 'Domain'] = f"[ {min_jarak_duri} , {mid_jarak_duri + 0.75} ]" # Domain (Rendah) Jarak Duri
himpunan_fuzzy.loc[9, 'Domain'] = f"[ {mid_jarak_duri - 0.25} , {max_jarak_duri} ]" # Domain pembicaraan (Tinggi) Jarak Duri
# Fuzzykasi Keterangan
himpunan_fuzzy.loc[10, 'Semesta Pembicaraan'] = f"[ 0 , 1 ]" # Semesta pembicaraan (Rendah) Keterangan
himpunan_fuzzy.loc[11, 'Semesta Pembicaraan'] = f"[ 0 , 1 ]" # Semesta pembicaraan (Tinggi) Keterangan
himpunan_fuzzy.loc[10, 'Domain'] = f"[ 0 , 0.5 ]" # Domain (Rendah) Keterangan
himpunan_fuzzy.loc[11, 'Domain'] = f"[ 0.5 , 1 ]" # Domain pembicaraan (Tinggi) Keterangan
# print(himpunan_fuzzy.to_dict())
himpunan_fuzzy.to_csv('out.csv',index=False)
with open("out.csv", "r") as f:
reader = csv.DictReader(f)
a = list(reader)
await asyncio.sleep(0.2)
# print(a)
return a
async def fuzzy(status, usianya = None , beratnya = None , kelilingnya = None , ukuran_batangnya = None , jarak_durinya = None):
dataset = None
data_durian = pd.read_csv("dataset/dataset.csv")
# await asyncio.sleep(0.5)
with open("dataset/dataset.csv", "r") as f:
reader = csv.DictReader(f)
dataset = list(reader)
await asyncio.sleep(0.1)
# data usia
data_usia = pd.DataFrame(data_durian)
data_usia = data_usia['Usia'].tolist()
_data_usia = data_usia
min_usia = min(data_usia) - 1
max_usia = max(data_usia) +1
mid_usia =np.median(data_usia)
await asyncio.sleep(0.1)
# data berat
data_berat = pd.DataFrame(data_durian)
data_berat = data_berat['Berat'].tolist()
_data_berat = data_berat
min_berat = min(data_berat) - 50
max_berat = max(data_berat) + 50
mid_berat =np.median(data_berat)
# data keliling
data_keliling = pd.DataFrame(data_durian)
data_keliling = data_keliling['Keliling'].tolist()
_data_keliling = data_keliling
min_keliling = min(data_keliling) - 1
max_keliling = max(data_keliling) + 1
# mid_keliling = get_average(min_keliling,max_keliling) #42.0
mid_keliling =np.median(data_keliling)
# data ukuran batang
data_ukuran_batang = pd.DataFrame(data_durian)
data_ukuran_batang = data_ukuran_batang['Ukuran_batang'].tolist()
_data_ukuran_batang = data_ukuran_batang
min_ukuran_batang = min(data_ukuran_batang) - 0.5
max_ukuran_batang = max(data_ukuran_batang) + 0.5
# mid_ukuran_batang = get_average(min_ukuran_batang,max_ukuran_batang) #4.0
mid_ukuran_batang = np.median(data_ukuran_batang)
# data jarak duri
data_jarak_duri = pd.DataFrame(data_durian)
data_jarak_duri = data_jarak_duri['Jarak_duri'].tolist()
_data_jarak_duri = data_jarak_duri
# print(data_jarak_duri)
min_jarak_duri = min(data_jarak_duri) - 0.5
max_jarak_duri = max(data_jarak_duri) + 0.5
mid_jarak_duri = get_average(min_jarak_duri,max_jarak_duri)#1.0
var_himpunan_fuzzy = await himpunan_fuzzy(min_usia,mid_usia,max_usia,min_berat,mid_berat,max_berat,min_keliling,mid_keliling,max_keliling,min_ukuran_batang,mid_ukuran_batang,max_ukuran_batang,min_jarak_duri,mid_jarak_duri,max_jarak_duri)
# fuzzy untuk field usia
x_usia = RangeSubjektif(min_usia , max_usia , 1)
r_usia = np.array([
[min_usia,min_usia,mid_usia,mid_usia],
[mid_usia,mid_usia,max_usia,max_usia]
])
lo_usia , hi_usia = FuzzyShow(r_usia , x_usia, 'Umur (minggu)',"usia")
# fuzzy untuk field berat
x_berat = RangeSubjektif(min_berat , max_berat , 1)
r_berat = np.array([
[min_berat,min_berat,mid_berat,mid_berat+10],
[mid_berat,mid_berat+10,max_berat,max_berat]
])
lo_berat , hi_berat = FuzzyShow1(r_berat , x_berat, 'Berat (kg)', "berat")
# fuzzy untuk field keliling
x_keliling = RangeSubjektif(min_keliling , max_keliling , 1)
r_keliling = np.array([
[min_keliling,min_keliling,mid_keliling,mid_keliling],
[mid_keliling,mid_keliling,max_keliling,max_keliling]
])
lo_keliling , hi_keliling = FuzzyShow(r_keliling , x_keliling, 'Keliling (cm)', "keliling")
# fuzzy untuk field ukuran batang
x_ukuran_batang = RangeSubjektif(min_ukuran_batang , max_ukuran_batang , 1)
r_ukuran_batang = np.array([
[min_ukuran_batang,min_ukuran_batang,mid_ukuran_batang,mid_ukuran_batang],
[mid_ukuran_batang,mid_ukuran_batang,max_ukuran_batang,max_ukuran_batang]
])
lo_ukuran_batang , hi_ukuran_batang = FuzzyShow(r_ukuran_batang , x_ukuran_batang, 'Keliling (cm)', "ukuran_batang")
# fuzzy untuk field jarak duri
x_jarak_duri = RangeSubjektif(min_jarak_duri , max_jarak_duri , 1)
r_jarak_duri = np.array([
[min_jarak_duri,min_jarak_duri,mid_jarak_duri,mid_jarak_duri],
[mid_jarak_duri,mid_jarak_duri,max_jarak_duri,max_jarak_duri]
])
lo_jarak_duri , hi_jarak_duri = FuzzyShow(r_jarak_duri , x_jarak_duri, 'Jarak Duri (mm)', "jarak_duri")
# Keanggotaan untuk usia
i = 0
anggota_usia = []
for usia in _data_usia:
ini_dia = FungsiKeanggotaan(x_usia,lo_usia,hi_usia,usia)
anggota_usia.append(ini_dia)
i = i+1
# print(anggota_usia)
# Keanggotaan untuk berat
anggota_berat = []
for berat in _data_berat:
ini_dia = FungsiKeanggotaan(x_berat,lo_berat,hi_berat,berat)
anggota_berat.append(ini_dia)
# Keanggotaan untuk keliling
anggota_keliling = []
for keliling in _data_keliling:
ini_dia = FungsiKeanggotaan(x_keliling,lo_keliling,hi_keliling,keliling)
anggota_keliling.append(ini_dia)
# Keanggotaan untuk ukuran batang
anggota_ukuran_batang = []
for ukuran_batang in _data_ukuran_batang:
ini_dia = FungsiKeanggotaan(x_ukuran_batang,lo_ukuran_batang,hi_ukuran_batang,ukuran_batang)
# print(ini_dia)
anggota_ukuran_batang.append(ini_dia)
# Keanggotaan untuk jarak duri
anggota_jarak_duri = []
for jarak_duri in _data_jarak_duri:
ini_dia = FungsiKeanggotaan(x_jarak_duri,lo_jarak_duri,hi_jarak_duri,jarak_duri)
anggota_jarak_duri.append(ini_dia)
rule_base = None
with open("dataset/rule.csv", "r") as f:
reader = csv.DictReader(f)
rule_base = list(reader)
keanggotaannya = await contoh_dulu(data_durian,anggota_usia,anggota_berat,anggota_keliling,anggota_ukuran_batang,anggota_jarak_duri,i)
# print(keanggotaannya)
data_usia = {'min':min_usia, 'max':max_usia}
data_berat = {'min':min_berat, 'max':max_berat}
data_keliling = {'min':min_keliling, 'max':max_keliling}
data_ukuran_batang = {'min':min_ukuran_batang, 'max':max_ukuran_batang}
data_jarak_duri = {'min':min_jarak_duri, 'max':max_jarak_duri}
detail_attribut = {'usia':data_usia, 'berat':data_berat, 'keliling':data_keliling, 'ukuran_batang':data_ukuran_batang, 'jarak_duri':data_jarak_duri}
if(status == 'ambil_dataset'):
context = {'detail_attribute':detail_attribut, 'rule_base':rule_base, 'keanggotaan':keanggotaannya, 'dataset' : dataset, 'himpunan_fuzzy' : var_himpunan_fuzzy}
elif (status == 'load_fuzzy'):
def hitungan_keterangan(usia,berat,keliling,ukuran_batang,jarak_duri):
df = pd.read_csv("dataset/rule.csv")
rule_length = len(df.index)
list_rule = df
keterangan = None
ket_usia = "Tinggi" if usia[0] < usia[1] else "Rendah"
ket_berat = "Tinggi" if berat[0] < berat[1] else "Rendah"
ket_keliling = "Tinggi" if keliling[0] <= keliling[1] else "Rendah"
ket_ukuran_batang = "Tinggi" if ukuran_batang[0] <= ukuran_batang[1] else "Rendah"
ket_jarak_duri = "Tinggi" if jarak_duri[0] < jarak_duri[1] else "Rendah"
for n in range(rule_length):
if str(list_rule.at[n,'Usia']) == ket_usia and str(list_rule.at[n,'Berat']) == ket_berat and str(list_rule.at[n,'Keliling']) == ket_keliling and str(list_rule.at[n,'Ukuran Batang']) == ket_ukuran_batang and str(list_rule.at[n,'Jarak Duri']) == ket_jarak_duri:
keterangan = str(list_rule.at[n,'Keterangan'])
break
return keterangan
usia = usianya
berat = beratnya
keliling = kelilingnya
ukuran_batang = ukuran_batangnya
jarak_duri = jarak_durinya
keanggotaan_usia = FungsiKeanggotaan(x_usia,lo_usia,hi_usia,usia)
print(keanggotaan_usia)
keanggotaan_berat = FungsiKeanggotaan(x_berat,lo_berat,hi_berat,berat)
print(keanggotaan_berat)
keanggotaan_keliling = FungsiKeanggotaan(x_keliling,lo_keliling,hi_keliling,keliling)
print(keanggotaan_keliling)
keanggotaan_ukuran_batang = FungsiKeanggotaan(x_ukuran_batang,lo_ukuran_batang,hi_ukuran_batang,ukuran_batang)
print(keanggotaan_ukuran_batang)
keanggotaan_jarak_duri =FungsiKeanggotaan(x_jarak_duri,lo_jarak_duri,hi_jarak_duri,jarak_duri)
print(keanggotaan_jarak_duri)
datanya = hitungan_keterangan(keanggotaan_usia,keanggotaan_berat,keanggotaan_keliling,keanggotaan_ukuran_batang,keanggotaan_jarak_duri)
context = datanya
# hitungan fuzzy tsukamoto berdasarkan data latih
return context