4 Xây dựng công cụ phân tích dữ liệu nông nghiệp
4.3.3 Lập trình thử nghiệm giải thuật Fuzzy Logic
Trong ứng dụng này, tôi sử dụng lại bài toán tipping problem. Các biến đầu vào gồm có chất lượng dịch vụ (service), chất lượng thức ăn (food), và chất lượng không khí (atm). Áp dụng Fuzzy Logic sẽ cho ra kết quả số tiền tip mà nhân viên nhận được. Ngưỡng giá trị (universe of discourse) của các biến trên từ 0 đến 10. Fuzzy Sets của các biến được mô tả như sau.
Chương 4. Xây dựng công cụ phân tích dữ liệu nông nghiệp 58
HÌNH4.30: Fuzzy Sets of Food
Chương 4. Xây dựng công cụ phân tích dữ liệu nông nghiệp 59
HÌNH4.32: Fuzzy Sets of Tip
//Step 1 : S e t t i n g SparkSession val spark= SparkSession . builder ( )
. appName( " FuzzySparkVersion " ) . getOrCreate ( )
val sc = spark . sparkContext
//Step 2 : Define the inputs , output
val s e r v i c e = v a r i a b l e ( " s e r v i c e " , ( 0 , 1 0 ) , 0 . 5 ) val food = v a r i a b l e ( " food " , ( 0 , 1 0 ) , 0 . 5 )
val atm = v a r i a b l e ( " atm " , ( 0 , 1 0 ) , 0 . 5 ) // output
val t i p = v a r i a b l e ( " t i p " , ( 0 , 10) )
//Step 3 : Define the Fuzzy Sets with membershipFunc val poor = trimf ( " poor " , 0 , 2 , 2 ) ;
val good = trimf ( " good " , 1 , 5 , 9 ) ;
val e x c e l l e n t = trimf ( " e x c e l l e n t " , 3 , 7 , 10) val rancid = trimf ( " rancid " , 0 , 0 , 5 ) ;
val d e l i c i o u s = trimf ( " d e l i c i o u s " , 3 , 9 , 10) val cool = trimf ( " cool " , 0 , 0 , 4 ) ;
val warm = trimf ( "warm" , 1 , 5 , 9 ) ; val hot = trimf ( " hot " , 6 , 10 , 14)
Chương 4. Xây dựng công cụ phân tích dữ liệu nông nghiệp 60 val cheap = trimf ( " cheap " , 0 , 0 , 5 ) ;
val average = trimf ( " average " , 1 , 5 , 8 ) ; val generous = trimf ( " generous " , 5 , 10 , 10) //Step 4 : Define the Fuzzy Inference System
val f i s = FIS_Mamdani (name = " tipdemo " , input = L i s t ( service , food , atm ) , output = L i s t ( t i p ) ,
andMethod = AndMethod . Min , orMethod = OrMethod . Max,
aggregation = Aggregation . Max,
d e f u z z i f i c a t i o n = Defuzzificaton . centroid , step = 1000000000)
//Pass the param value to inputs f i s . setInput ( L i s t ( 3 , 2 , 5 ) )
//Step 5 : Describe the r u l e s If−Then
f i s . I f ( atm i s hot ) Then ( t i p will_be cheap ) f i s I f ( ( s e r v i c e is_not good )
or ( food i s d e l i c i o u s ) or ( atm i s warm ) )
Then ( t i p will_be cheap ) f i s I f ( ( s e r v i c e i s e x c e l l e n t )
or ( food i s rancid ) or ( atm i s cool ) )
Then ( t i p will_be generous )
//Step 6 : D e f u z z i f i c a t i o n and show the r e s u l t p r i n t l n ( f i s . defuzz ( t i p ) )
spark . stop ( )