347 lines
15 KiB
Python
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 |