gusucode.com > 模糊控制工具箱 fuzzy logic toolbox源码程序 > fuzzy/fuzdemos/trips.m
%% Modeling Traffic Patterns using Subtractive Clustering % This demo demonstrates the use of subtractive clustering to model traffic % patterns in an area based on the area's demographics. % % Copyright 1994-2005 The MathWorks, Inc. % $Revision: 1.12.2.2.2.1 $Date: 2005/07/17 06:06:22 $ % %% The problem: Understanding Traffic Patterns % In this demo we attempt to understand the relationship between the number % of automobile trips generated from an area and the area's demographics. % Demographic and trip data were collected from traffic analysis zones % in New Castle County, Delaware. Five demographic factors are considered: % population, number of dwelling units, vehicle ownership, median household % income and total employment. % % Hereon, the demographic factors will be addressed as inputs and the % trips generated will be addressed as output. Hence our problem has five % input variables (five demographic factors) and one output variable % (num of trips generated). % %% The Data % We will now load the input and output variables used for this demo into % the workspace. % tripdata %% % Two variables are loaded in the workspace, |datin| and |datout|. |datin| % has 5 columns representing the 5 input variables and |datout| has 1 % column representing the 1 output variable. % subplot(2,1,1) plot(datin) legend('population', 'num. of dwelling units', 'vehicle ownership',... 'median household income', 'total employment'); title('Input Variables') subplot(2,1,2) plot(datout) legend('num of trips'); title('Output Variable') %% % *Figure 1:* Input and Output variables %% % The number of rows in |datin| and |datout|, 75, represent the number of % observations or samples or datapoints available. A row in |datin|, say % row 11, constitutes a set of observed values of the 5 input variables % (population, number of dwelling units, vehicle ownership, median % household income and total employment) and the corresponding row, row 11, % in |datout| represents the observed value for the number of trips % generated given the observations made for the input variables. % % We will model the relationship between the input variables (demographics) % and the output variable (trips) by first clustering the data. The cluster % centers will then be used as a basis to define a Fuzzy Inference System % (FIS) which can then be used to explore and understand traffic patterns. % %% Why clustering and fuzzy logic? % Clustering can be a very effective technique to identify natural % groupings in data from a large data set, thereby allowing concise % representation of relationships embedded in the data. In this example, % clustering allows us to group traffic patterns into broad categories % hence allowing for easier understandability. % % Fuzzy logic is an effective paradigm to handle uncertainty. It can be % used to take fuzzy or imprecise observations for inputs and yet arrive at % crisp and precise values for outputs. Also, the % <matlab:helpview([docroot,'/toolbox/fuzzy/fuzzy.map'],'fuzzy_inference_systems') Fuzzy Inference System (FIS)> % is a simple and commonsensical way to build systems without using complex % analytical equations. % % In our example, fuzzy logic will be employed to capture the broad % categories identified during clustering into a Fuzzy Inference System % (FIS). The FIS will then act as a model that will reflect the % relationship between demographics and auto trips. % % Clustering and fuzzy logic together provide a simple yet powerful means % to model the traffic relationship that we want to study. % %% Clustering the data % |subclust| is the function that implements a clustering technique called % subtractive clustering. Subtractive clustering, [Chi94], is a fast, % one-pass algorithm for estimating the number of clusters and the cluster % centers in a dataset. % % In this section, we will see how subtractive clustering is performed on a % dataset and in the next section we will explore independently how % clustering is used to build a Fuzzy Inference System(FIS). [C,S] = subclust([datin datout],0.5); %% % The first argument to the |subclust| function is the data to be % clustered. The second argument to the function is the |radii| which % marks a cluster's radius of influence in the <#28 input space>. % % The variable |C| now holds all the centers of the clusters that have been % identified by |subclust|. Each row of |C| contains the position of a % cluster. C %% % In this case, |C| has 3 rows representing 3 clusters with 6 columns % representing the positions of the clusters in each dimension. % % |subclust| has hence identified 3 natural groupings in the % demographic-trip dataset being considered. The following plot shows how % the clusters have been identified in the 'total employment' and 'trips' % dimensions of the input space. clf; plot(datin(:,5), datout(:,1), '.', C(:,5),C(:,6),'r*') legend('Data points', 'Cluster centers', 'Location', 'SouthEast') xlabel('total employment') ylabel('num of trips') title('Data and Clusters in selected two dimensions of the input space') %% % *Figure 2:* Cluster centers in the 'total employment' and 'trips' % dimensions of the input space %% % The variable |S| contains the sigma values that specify the range of % influence of a cluster center in each of the data dimensions. All cluster % centers share the same set of sigma values. S %% % |S| in this case has 6 columns representing the influence of the cluster % centers on each of the 6 dimensions. % %% Generating the Fuzzy Inference System (FIS) % % |genfis2| is the function that creates a FIS using subtractive % clustering. |genfis2| employs |subclust| behind the scenes to cluster the % data and uses the cluster centers and their range of influences to build % a FIS which will then be used to explore and understand traffic patterns. myfis=genfis2(datin,datout,0.5); %% % The first argument is the input variables matrix |datin|, the second % argument is the output variables matrix |datout| and the third argument % is the |radii| that should be used while using |subclust|. % % |genfis2| assigns default names for inputs, outputs and membership % functions. For our understanding it is beneficial to rename the inputs % and outputs meaningfully. % Assign names to inputs and outputs myfis = setfis(myfis, 'input',1,'name','population'); myfis = setfis(myfis, 'input',2,'name','dwelling units'); myfis = setfis(myfis, 'input',3,'name','num vehicles'); myfis = setfis(myfis, 'input',4,'name','income'); myfis = setfis(myfis, 'input',5,'name','employment'); myfis = setfis(myfis, 'output',1,'name','num of trips'); %% Understanding the clusters-FIS relationship % A FIS is composed of inputs, outputs and rules. Each input and % output can have any number of membership functions. The rules dictate the % behavior of the fuzzy system based on inputs, outputs and membership % functions. |genfis2| constructs the FIS in an attempt to capture the the % position and influence of each cluster in the input space. % % |myfis| is the FIS that |genfis2| has generated. Since the dataset has 5 % input variables and 1 output variable, |genfis2| constructs a FIS with % 5 inputs and 1 output. Each input and output has as many membership % functions as the number of clusters that |subclust| has identified. As % seen previously, for the current dataset |subclust| identified 3 % clusters. Therefore each input and output will be characterized by 3 % membership functions. Also, the number of rules equals the number of % clusters and hence 3 rules are created. % % We can now probe the FIS to understand how the clusters got converted % internally into membership functions and rules. fuzzy(myfis) %% % *Figure 3:* The graphical editor for building Fuzzy Inference Systems % (FIS) %% % |fuzzy| is the function that launches the graphical editor for building % fuzzy systems. |fuzzy(myfis)| launches the editor set up to edit % |myfis|, the FIS that we just generated. As can be seen, the FIS has 5 % inputs and 1 output with the inputs mapped to the outputs through a % rulebase (white box in the figure). % % Let's now try to analyze how the cluster centers and the membership % functions are related. mfedit(myfis) %% % *Figure 4:* The graphical membership function editor %% % |mfedit(myfis)| launches the graphical membership function editor. It % can also be launched by clicking on the inputs or the outputs in the % FIS editor launched by |fuzzy|. % % Notice that all the inputs and outputs have exactly 3 membership % functions. The 3 membership functions represent the 3 clusters that were % identified by |subclust|. % % Each input in the FIS represents an input variable in the input dataset % |datin| and each output in the FIS represents an output variable in the % output dataset |datout|. % % By default, the first membership function, |in1cluster1|, of the first % input |population| would be selected in the membership function editor. % Notice that the membership function type is "gaussmf" (gaussian type % membership function) and the parameters of the membership function are % |[1.162 1.877]|, where |1.162| represents the spread coefficient of the % gaussian curve and |1.877| represents the center of the gaussian curve. % |in1cluster1| captures the position and influence of the first cluster % for the input variable |population|. |(C(1,1)=1.877, S(1)=1.1621 )| % % Similarly, the position and influence of the other 2 clusters for the % input variable |population| are captured by the other two membership % functions |in1cluster2| and |in1cluster3|. % % The rest of the 4 inputs follow the exact pattern mimicking the position % and influence of the 3 clusters along their respective dimensions in the % dataset. % % Now, let's explore how the fuzzy rules are constructed. ruleedit(myfis) %% % *Figure 5:* The graphical rule editor %% % |ruleedit| is the graphical fuzzy rule editor. As you can notice, there % are exactly three rules. Each rule attempts to map a cluster in the input % space to a cluster in the output space. % % The first rule can be explained simply as follows. If the inputs to the % FIS, |population|, |dwelling units|, |num vehicles|, |income|, and % |employment|, strongly belong to their respective |cluster1| membership % functions then the output, |num of trips|, must strongly belong to its % |cluster1| membership function. The (1) at the end of the rule is to % indicate that the rule has a weight or an importance of "1". Weights can % take any value between 0 and 1. Rules with lesser weights will count for % less in the final output. % % The significance of the rule is that it succinctly maps cluster 1 in % the input space to cluster 1 in the output space. Similarly the other % two rules map cluster 2 and cluster 3 in the input space to cluster 2 % and cluster 3 in the output space. % % If a datapoint closer to the first cluster, or in other words % having strong membership to the first cluster, is fed as input to |myfis| % then rule1 will fire with more <#28 firing strength> than the other two % rules. Similarly, an input with strong membership to the second cluster % will fire the second rule will with more firing strength than the other % two rules and so on. % % The output of the rules (firing strengths) are then used to generate the % output of the FIS through the output membership functions. % % The one output of the FIS, |num of trips|, has 3 linear membership % functions representing the 3 clusters identified by |subclust|. The % coefficients of the linear membership functions though are not taken % directly from the cluster centers. Instead, they are estimated from the % dataset using least squares estimation technique. % % All 3 membership functions in this case will be of the form |a*population % + b*dwelling units + c*num vehicles + d*income + e*employment + f|, where % |a|, |b|, |c|, |d|, |e| and |f| represent the coefficients of the linear % membership function. Click on any of the |num of trips| membership % functions in the membership function editor to observe the parameters of % these linear membership functions. % %% Using the FIS for data exploration % You can now use the FIS that has been constructed to understand the % underlying dynamics of relationship being modeled. surfview(myfis) %% % *Figure 6:* Input-Output Surface viewer %% % |surfview| is the surface viewer that helps view the input-output % surface of the fuzzy system. In other words, this tool simulates the % response of the fuzzy system for the entire range of inputs that the % system is configured to work for. Thereafter, the output or the response % of the FIS to the inputs are plotted against the inputs as a surface. % This visualization is very helpful to understand how the system is going % to behave for the entire range of values in the input space. % % In the plot above the surface viewer shows the output surface for two % inputs |population| and |num of dwelling units|. As you can see the % number of auto trips increases with increase in population and dwelling % units, which sounds very rational. You can change the inputs in the X and % Y drop-down boxes to observe the output surface with respect to the inputs % you choose. ruleview(myfis) %% % *Figure 7:* Rule viewer that simulates the entire fuzzy inference process %% % |ruleview| is the graphical simulator for simulating the FIS response for % specific values of the input variables. Now, having built the fuzzy system, % if we want to understand how many trips will occur for a particular % demographic setup, say an area with a particular population, a certain % number of dwelling units and so on, this tool will help you simulate the % FIS response for the input of your choice. % % Another feature of this GUI tool is, it gives you a snapshot of the % entire fuzzy inference process, right from how the membership functions % are being satisfied in every rule to how the final output is being % generated through <#28 defuzzification>. % %% Conclusion % This example has attempted to convey how clustering and fuzzy logic can % be employed as effective techniques for data modeling and analysis. % % Fuzzy logic has also found various % applications in other areas of technology like non-linear control, % automatic control, signal processing, system identification, pattern % recognition, time series prediction, data mining, financial applications % etc., % % Explore other demos and the documentation for more insight into fuzzy % logic and its applications. % %% Glossary % % *input space* - it is a term used to define the range of all possible % values in the dataset. When using |subclust| the input space refers to % the entire range of values between the maximum and minimum in each % dimension (column) of the dataset. % % *defuzzification* - the process of transforming a fuzzy output of a fuzzy % inference system into a crisp output. % % *firing strength* - The degree to which the antecedent part of a fuzzy % rule is satisfied. Also known as degree of fulfillment. % % *fuzzy inference system (FIS)* - The overall name for a system that uses % fuzzy reasoning to map an input space to an output space % % *Reference:* % % [Chi94] - S. Chiu, "Fuzzy Model Identification Based on Cluster % Estimation," J. of Intelligent & Fuzzy Systems, Vol. 2, No. 3, 1994. displayEndOfDemoMessage(mfilename)