def error(R, D): # R: Rules # D: Data err = 0. myIT2FLS.rules = [] for rule in R: myIT2FLS.add_rule([("x1", X1Sets[rule[0]]), ("x2", X2Sets[rule[1]])], [("y1", Y1Sets[rule[2]]), ("y2", Y2Sets[rule[3]])]) for i in range(D.shape[1]): tr = myIT2FLS.evaluate({"x1": D[0, i], "x2": D[1, i]}) err += (crisp(tr["y1"]) - D[2, i])**2 + (crisp(tr["y2"]) - D[3, i])**2 return err
def inference(self, observation: Dict) -> Dict: """ perform inference at the fuzzy system """ vel = observation['velocity'] * 3.6 #m/s -> Km/h acc = observation['acceleration'] #m/s^2 dec = observation['deceleration'] #m/s^2 ljk = observation['lateral_jerk'] #std (m/s^3) _in = {} _in['Velocity'] = vel _in['Acceleration'] = acc _in['Deceleration'] = dec _in['LateralJerk'] = ljk it2out, tr = self.fuzz_inf.evaluate(_in, min_t_norm, max_s_norm, np.linspace(0, 1, 1001)) _c = crisp(tr['DrivingStyle']) y = [] l = [] y, l = self._fuzz_driving_style(value=_c) result = {} result['class'] = np.argmax([(m[0] + m[1]) / 2. for m in y]) result['crisp'] = _c result['membership_values'] = np.asarray(y) result['set_labels'] = np.asarray(l) return result
def IT2FL_v1_fun(y): # print("chenggong") domain = linspace(-1, 1., 100) NB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1]) NS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1]) MM = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) PS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) PB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) # IT2FS_plot(NB, NS, MM,PS,PB, legends=["NB", "NS", "NN","PS","PB"], filename="v1_input_$y") BB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1]) BS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1]) ZO = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) GS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) GB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) # IT2FS_plot(GB,GS,ZO,BS,BB, legends=["GB", "GS", "ZO","BS","BB"], filename="V1_output") #输入和输出都只有一个,输入为y方向的偏离值,输出为速度大小即前进或者后退的快慢 myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("x1") myIT2FLS.add_output_variable("y1") myIT2FLS.add_rule([("x1", NB)], [("y1", GB)]) myIT2FLS.add_rule([("x1", NS)], [("y1", GS)]) myIT2FLS.add_rule([("x1", MM)], [("y1", ZO)]) myIT2FLS.add_rule([("x1", PS)], [("y1", BS)]) myIT2FLS.add_rule([("x1", PB)], [("y1", BB)]) it2out, tr = myIT2FLS.evaluate({"x1": y}, min_t_norm, max_s_norm, domain) # it2out["y1"].plot(filename="y1_out") # TR_plot(domain, tr["y1"], filename="y1_tr") print("v1_output:", crisp(tr["y1"])) if crisp(tr["y1"]) < 0: print("速度大小:后退", crisp(tr["y1"]) * 2) elif crisp(tr["y1"]) == 0: print("速度大小:0") else: print("速度大小:前进", crisp(tr["y1"]) * 2)
def IT2FL_fun(x, y): # print("chenggong") domain = linspace(0., 1., 100) # domain = linspace(-1., 1., 100) Small = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) Medium = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) Large = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) # IT2FS_plot(Small, Medium, Large, legends=["Small", "Medium", "large"], filename="asb(x1,x2)_ex_sets") S = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) M = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) L = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) # IT2FS_plot(S, M, L, legends=["S", "M", "L"], filename="y1_ex_sets") myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("x1") myIT2FLS.add_input_variable("x2") myIT2FLS.add_output_variable("y1") #myIT2FLS.add_output_variable("y2") myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", S)]) myIT2FLS.add_rule([("x1", Small), ("x2", Medium)], [("y1", S)]) myIT2FLS.add_rule([("x1", Small), ("x2", Large)], [("y1", M)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Small)], [("y1", S)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", M)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Large)], [("y1", L)]) myIT2FLS.add_rule([("x1", Large), ("x2", Small)], [("y1", M)]) myIT2FLS.add_rule([("x1", Large), ("x2", Medium)], [("y1", L)]) myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", L)]) # it2out, tr = myIT2FLS.evaluate({"x1":0.6, "x2":0.8}, min_t_norm, max_s_norm, domain) it2out, tr = myIT2FLS.evaluate({ "x1": x, "x2": y }, min_t_norm, max_s_norm, domain) # it2out["y1"].plot(filename="y1_out") # TR_plot(domain, tr["y1"], filename="y1_tr") print("v1_output:", crisp(tr["y1"]))
Medium, Large, legends=["Small", "Medium", "large"], filename="simp_ex_sets") myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("x1") myIT2FLS.add_input_variable("x2") myIT2FLS.add_output_variable("y1") myIT2FLS.add_output_variable("y2") myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", Small), ("y2", Large)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", Medium), ("y2", Small)]) myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", Large), ("y2", Small)]) it2out, tr = myIT2FLS.evaluate({ "x1": 0.9, "x2": 0.9 }, min_t_norm, max_s_norm, domain) it2out["y1"].plot(filename="y1_out") TR_plot(domain, tr["y1"], filename="y1_tr") print(crisp(tr["y1"])) it2out["y2"].plot(filename="y2_out") TR_plot(domain, tr["y2"], filename="y2_tr") print(crisp(tr["y2"]))
myIT2FLS.add_rule([("x1", B), ("x2", S)], [("y1", A1)]) myIT2FLS.add_rule([("x1", B), ("x2", Z)], [("y1", A1)]) myIT2FLS.add_rule([("x1", B), ("x2", B)], [("y1", A1)]) myIT2FLS.add_rule([("x1", SS), ("x2", SS)], [("y2", B4)]) myIT2FLS.add_rule([("x1", SS), ("x2", ZZ)], [("y2", B5)]) myIT2FLS.add_rule([("x1", SS), ("x2", BB)], [("y2", B6)]) myIT2FLS.add_rule([("x1", ZZ), ("x2", SS)], [("y2", B3)]) myIT2FLS.add_rule([("x1", ZZ), ("x2", ZZ)], [("y2", B9)]) myIT2FLS.add_rule([("x1", ZZ), ("x2", BB)], [("y2", B7)]) myIT2FLS.add_rule([("x1", BB), ("x2", SS)], [("y2", B2)]) myIT2FLS.add_rule([("x1", BB), ("x2", ZZ)], [("y2", B1)]) myIT2FLS.add_rule([("x1", BB), ("x2", BB)], [("y2", B8)]) it2out1, tr1 = myIT2FLS.evaluate({"x1":0.9, "x2":0.9}, min_t_norm, max_s_norm, domain) it2out2, tr2 = myIT2FLS.evaluate({"x1":-0.8, "x2":0.8}, min_t_norm, max_s_norm, domain) it2out1["y1"].plot(filename="y1_out") TR_plot(domain, tr1["y1"], filename="y1_tr") print(crisp(tr1["y1"])) it2out2["y2"].plot(filename="y2_out") TR_plot(domain, tr2["y2"], filename="y2_tr") print(crisp(tr2["y2"]))
myIT2FLS.add_rule([("x1", Large1), ("x2", Small2)], [("y1", High1), ("y2", Low2)]) myIT2FLS.add_rule([("x1", Large1), ("x2", Medium2)], [("y1", High1), ("y2", High2)]) myIT2FLS.add_rule([("x1", Large1), ("x2", Large2)], [("y1", High1), ("y2", High2)]) # Evaluating the outputs of the myIT2FLS for the points in the input domain, # and plotting the output surfaces. X1, X2 = meshgrid(domain1, domain2) Z1 = zeros(shape=(len(domain1), len(domain2))) Z2 = zeros(shape=(len(domain1), len(domain2))) for i, x1 in zip(range(len(domain1)), domain1): for j, x2 in zip(range(len(domain2)), domain2): it2out, tr = myIT2FLS.evaluate({"x1": x1, "x2": x2}) Z1[i, j], Z2[i, j] = crisp(tr["y1"]), crisp(tr["y2"]) fig = plt.figure() ax = fig.gca(projection="3d") surf = ax.plot_surface(X1, X2, Z1, cmap=cm.coolwarm, linewidth=0, antialiased=False) ax.zaxis.set_major_locator(LinearLocator(10)) ax.zaxis.set_major_formatter(FormatStrFormatter('%.02f')) fig.colorbar(surf, shrink=0.5, aspect=5) plt.show() fig = plt.figure()
def calculate_FLS(cough_inp, fever_inp, breath_inp, age, env_inp, hypertension_inp, diabetes_inp, cardiovascular_inp, respiratory_inp, immune_inp): severity = linspace(0.0, 10.0, 100) # For IT2FS_Gaussian_UncertMean, the parameters define: # 1 - The tip of the center point of the curve # 2 - The width of the lower curve (higher value = lower width) # 3 - The height of the lower curve (higher value = higher tip) # 4 - The height of the center point of the outer curve. Cough_neg = IT2FS(severity, trapezoid_mf, [0., 0.001, 3, 7, 1.0], tri_mf, [0, 0.001, 2, 0.5]) Cough_pos = IT2FS(severity, trapezoid_mf, [5, 8, 9.999, 10, 1.0], tri_mf, [8.5, 9.999, 10, 0.5]) Fever_low = IT2FS_Gaussian_UncertMean(severity, [0, 2.65, 1, 1.0]) Fever_mod = IT2FS_Gaussian_UncertMean(severity, [5, 2.65, 1, 1.0]) Fever_high = IT2FS_Gaussian_UncertMean(severity, [10, 2.65, 1, 1.0]) BreathDiff_low = IT2FS_Gaussian_UncertMean(severity, [0, 1.75, 1, 1.0]) BreathDiff_mod = IT2FS_Gaussian_UncertMean(severity, [5, 2.5, 1, 1.0]) BreathDiff_extr = IT2FS_Gaussian_UncertMean(severity, [10, 1.75, 1, 1.0]) Add_low = IT2FS_Gaussian_UncertMean(severity, [0, 5, 2, 1.0]) Add_high = IT2FS_Gaussian_UncertMean(severity, [10, 5, 2, 1.0]) Risk_low = IT2FS_Gaussian_UncertMean(severity, [0, 3, 1, 1.0]) Risk_high = IT2FS_Gaussian_UncertMean(severity, [6.5, 2, 1, 1.0]) Risk_veryhigh = IT2FS_Gaussian_UncertMean(severity, [10.7, 1, 1, 1.0]) def plot_cough_mf(): IT2FS_plot( Cough_neg, Cough_pos, title="Cough", legends=["Negative", "Positive"], ) def plot_fever_mf(): IT2FS_plot( Fever_low, Fever_mod, Fever_high, title="Fever", legends=["Low", "Moderate", "High"], ) def plot_additional_mf(): IT2FS_plot( Add_low, Add_high, title="Additional Risks", legends=["Low", "High"], ) def plot_breathdiff_mf(): IT2FS_plot( BreathDiff_low, BreathDiff_mod, BreathDiff_extr, title="Breathing Difficulty", legends=["Low", "Moderate", "High"], ) def plot_risk_mf(): IT2FS_plot( Risk_low, Risk_high, Risk_veryhigh, title="Overall Risk", legends=["Unlikely", "Likely", "Extremely Likely"], ) plot_fever_mf() plot_cough_mf() plot_breathdiff_mf() plot_additional_mf() plot_risk_mf() myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("cough") myIT2FLS.add_input_variable("fever") myIT2FLS.add_input_variable("breath") myIT2FLS.add_input_variable("add") myIT2FLS.add_output_variable("risk") myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_low), ("breath", BreathDiff_low), ("add", Add_low)], [("risk", Risk_low)]) myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod), ("breath", BreathDiff_low), ("add", Add_low)], [("risk", Risk_low)]) myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high), ("breath", BreathDiff_low), ("add", Add_low)], [("risk", Risk_low)]) myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high), ("breath", BreathDiff_low), ("add", Add_high)], [("risk", Risk_low)]) myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_low), ("breath", BreathDiff_extr), ("add", Add_low)], [("risk", Risk_high)]) myIT2FLS.add_rule([("cough", Cough_neg), ("fever", Fever_high), ("breath", BreathDiff_mod), ("add", Add_low)], [("risk", Risk_high)]) myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod), ("breath", BreathDiff_mod), ("add", Add_high)], [("risk", Risk_veryhigh)]) myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_low), ("breath", BreathDiff_extr), ("add", Add_high)], [("risk", Risk_veryhigh)]) myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_mod), ("breath", BreathDiff_mod), ("add", Add_high)], [("risk", Risk_veryhigh)]) myIT2FLS.add_rule([("cough", Cough_pos), ("fever", Fever_high), ("breath", BreathDiff_extr), ("add", Add_high)], [("risk", Risk_veryhigh)]) # cough_inp = float(input("Enter severity of coughing, between 0 and 10: ")) # fever_inp = float(input("Enter severity of fever, between 0 and 10: ")) # breath_inp = float(input("Enter severity of breathing difficulty, between 0 and 10: ")) # print("Input age and other additional risk factors.") add_inp = calc_additional_risks(age, env_inp, hypertension_inp, diabetes_inp, cardiovascular_inp, respiratory_inp, immune_inp) it2out, tr = myIT2FLS.evaluate( { "cough": cough_inp, "fever": fever_inp, "breath": breath_inp, "add": add_inp }, min_t_norm, max_s_norm, severity, method="Centroid", algorithm="EKM") print(tr) print(it2out) it2out["risk"].plot(title="Type-2 output MF converted to Type-1") TR_plot(severity, tr["risk"]) print("Chance of C19 Infection: ", int((crisp(tr["risk"])) * 10), "%") return int((crisp(tr["risk"])) * 10)
def IT2FL_v2(x,y): #domain = linspace(0., 1., 100) domain = linspace(-1., 1., 100) ''' Small = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) Medium = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) Large = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) IT2FS_plot(Small, Medium, Large, legends=["Small", "Medium", "large"], filename="asb(x1,x2)_ex_sets") S = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) M = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) L = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) IT2FS_plot(S, M, L, legends=["S", "M", "L"], filename="y1_ex_sets") myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("x1") myIT2FLS.add_input_variable("x2") myIT2FLS.add_output_variable("y1") #myIT2FLS.add_output_variable("y2") myIT2FLS.add_rule([("x1", Small), ("x2", Small)], [("y1", S)]) myIT2FLS.add_rule([("x1", Small), ("x2", Medium)], [("y1", S)]) myIT2FLS.add_rule([("x1", Small), ("x2", Large)], [("y1", M)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Small)], [("y1", S)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Medium)], [("y1", M)]) myIT2FLS.add_rule([("x1", Medium), ("x2", Large)], [("y1", L)]) myIT2FLS.add_rule([("x1", Large), ("x2", Small)], [("y1", M)]) myIT2FLS.add_rule([("x1", Large), ("x2", Medium)], [("y1", L)]) myIT2FLS.add_rule([("x1", Large), ("x2", Large)], [("y1", L)]) it2out, tr = myIT2FLS.evaluate({"x1":0.8, "x2":0.4}, min_t_norm, max_s_norm, domain) it2out["y1"].plot(filename="y1_out") TR_plot(domain, tr["y1"], filename="y1_tr") print(crisp(tr["y1"])) ''' NB = IT2FS_Gaussian_UncertStd(domain, [-1, 0.15, 0.1]) NS = IT2FS_Gaussian_UncertStd(domain, [-0.5, 0.15, 0.1]) ZO= IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) PS = IT2FS_Gaussian_UncertStd(domain, [0.5, 0.15, 0.1]) PB = IT2FS_Gaussian_UncertStd(domain, [1., 0.15, 0.1]) # IT2FS_plot(NB, NS, ZO,PS,PB, legends=["NB", "NS", "ZO","PS","PB"], filename="asb(x1,x2)_ex_sets") LVB = IT2FS_Gaussian_UncertStd(domain, [-0.875, 0.15, 0.1]) LB = IT2FS_Gaussian_UncertStd(domain, [-0.625, 0.15, 0.1]) LS= IT2FS_Gaussian_UncertStd(domain, [-0.375, 0.15, 0.1]) LVS = IT2FS_Gaussian_UncertStd(domain, [-0.125, 0.15, 0.1]) Z = IT2FS_Gaussian_UncertStd(domain, [0, 0.15, 0.1]) RVS = IT2FS_Gaussian_UncertStd(domain, [0.125, 0.15, 0.1]) RS = IT2FS_Gaussian_UncertStd(domain, [0.375, 0.15, 0.1]) RB= IT2FS_Gaussian_UncertStd(domain, [0.625, 0.15, 0.1]) RVB = IT2FS_Gaussian_UncertStd(domain, [0.875, 0.15, 0.1]) # IT2FS_plot(LVB, LB, LS,LVS,Z,RVS,RS,RB,RVB, legends=["LVB", "LB", "LS","LVS","Z","RVS","RS","RB","RVB"], filename="y2_ex_sets") myIT2FLS = IT2FLS() myIT2FLS.add_input_variable("x1") myIT2FLS.add_input_variable("x2") #myIT2FLS.add_output_variable("y1") myIT2FLS.add_output_variable("y2") myIT2FLS.add_rule([("x1", NB), ("x2", NB)], [("y2", LS)]) myIT2FLS.add_rule([("x1", NB), ("x2", NS)], [("y2", LS)]) myIT2FLS.add_rule([("x1", NB), ("x2", ZO)], [("y2", LS)]) myIT2FLS.add_rule([("x1", NB), ("x2", PS)], [("y2", LB)]) myIT2FLS.add_rule([("x1", NB), ("x2", PB)], [("y2", LVB)]) myIT2FLS.add_rule([("x1", NS), ("x2", NB)], [("y2", LVS)]) myIT2FLS.add_rule([("x1", NS), ("x2", NS)], [("y2", LS)]) myIT2FLS.add_rule([("x1", NS), ("x2", ZO)], [("y2", LS)]) myIT2FLS.add_rule([("x1", NS), ("x2", PS)], [("y2", LVB)]) myIT2FLS.add_rule([("x1", NS), ("x2", PB)], [("y2", LVB)]) myIT2FLS.add_rule([("x1", ZO), ("x2", NB)], [("y2", Z)]) myIT2FLS.add_rule([("x1", ZO), ("x2", NS)], [("y2", Z)]) myIT2FLS.add_rule([("x1", ZO), ("x2", ZO)], [("y2", Z)]) myIT2FLS.add_rule([("x1", ZO), ("x2", PS)], [("y2", LVB)]) myIT2FLS.add_rule([("x1", ZO), ("x2", PB)], [("y2", LVB)]) myIT2FLS.add_rule([("x1", PS), ("x2", NB)], [("y2", RVS)]) myIT2FLS.add_rule([("x1", PS), ("x2", NS)], [("y2", RS)]) myIT2FLS.add_rule([("x1", PS), ("x2", ZO)], [("y2", RB)]) myIT2FLS.add_rule([("x1", PS), ("x2", PS)], [("y2", RVB)]) myIT2FLS.add_rule([("x1", PS), ("x2", PB)], [("y2", RVB)]) myIT2FLS.add_rule([("x1", PB), ("x2", NB)], [("y2", RS)]) myIT2FLS.add_rule([("x1", PB), ("x2", NS)], [("y2", RS)]) myIT2FLS.add_rule([("x1", PB), ("x2", ZO)], [("y2", RB)]) myIT2FLS.add_rule([("x1", PB), ("x2", PS)], [("y2", RB)]) myIT2FLS.add_rule([("x1", PB), ("x2", PB)], [("y2", RVB)]) it2out, tr = myIT2FLS.evaluate({"x1":x, "x2":y}, min_t_norm, max_s_norm, domain) print("v2_output:",crisp(tr["y2"]))
def __call__(self, att1, att2, att3): o, tr = self.DM.evaluate({"ATT1": att1, "ATT2": att2, "ATT3": att3}) return crisp(tr["DECI"])