1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141
|
## Copyright (C) 2011-2025 L. Markowsky <lmarkowsky@gmail.com>
##
## This file is part of the fuzzy-logic-toolkit.
##
## The fuzzy-logic-toolkit is free software; you can redistribute it
## and/or modify it under the terms of the GNU General Public License
## as published by the Free Software Foundation; either version 3 of
## the License, or (at your option) any later version.
##
## The fuzzy-logic-toolkit is distributed in the hope that it will be
## useful, but WITHOUT ANY WARRANTY; without even the implied warranty
## of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
## General Public License for more details.
##
## You should have received a copy of the GNU General Public License
## along with the fuzzy-logic-toolkit; see the file COPYING. If not,
## see <http://www.gnu.org/licenses/>.
## -*- texinfo -*-
## @deftypefn {Function File} {@var{vxb} =} xie_beni_index (@var{input_data}, @var{cluster_centers}, @var{soft_partition})
##
## Return the Xie-Beni validity index for a given soft partition.
##
## The arguments to xie_beni_index are:
## @itemize @w
## @item
## @var{input_data}: a matrix of input data points; each row corresponds to one point
## @item
## @var{cluster_centers}: a matrix of cluster centers; each row corresponds to one point
## @item
## @var{soft_partition}: the membership degree of each input data point in each cluster
## @end itemize
##
## The return value is:
## @itemize @w
## @item
## @var{vxb}: the Xie-Beni validity index for the given partition
## @end itemize
##
## To run demonstration code that uses this function, type "@t{demo fcm}"
## or "@t{demo gustafson_kessel}" (without the quotation marks) at the
## Octave prompt.
##
## For more information about the @var{input_data}, @var{cluster_centers},
## and @var{soft_partition} matrices, please see the documentation for function
## fcm.
##
## @seealso{fcm, gustafson_kessel, partition_coeff, partition_entropy}
##
## @end deftypefn
## Author: L. Markowsky
## Keywords: fuzzy-logic-toolkit fuzzy xie beni cluster validity
## Directory: fuzzy-logic-toolkit/inst/
## Filename: xie_beni_index.m
## Last-Modified: 13 Jun 2024
function vxb = xie_beni_index (input_data, cluster_centers, ...
soft_partition)
## If xie_beni_index was called with an incorrect number of arguments,
## or the argument does not have the correct type, print an error
## message and halt.
if (nargin != 3)
error ("xie_beni_index requires 3 arguments\n");
elseif (!is_real_matrix (input_data))
error ("xie_beni_index's first argument must be matrix of reals\n");
elseif (!(is_real_matrix (cluster_centers) &&
(columns (cluster_centers) == columns (input_data))))
error ("xie_beni_index's 2nd arg must be matrix of reals with same #cols as input_data\n");
elseif (!(is_real_matrix (soft_partition) &&
(min (min (soft_partition)) >= 0) &&
(max (max (soft_partition)) <= 1)))
error ("xie_beni_index's 3rd arg must be a matrix of reals 0.0-1.0\n");
endif
## Compute and return the Xie-Beni index.
vxb = xie_beni_private (input_data, cluster_centers, soft_partition);
endfunction
##----------------------------------------------------------------------
## Function: xie_beni_private
## Purpose: Return the Xie-Beni index for the given soft partition.
## Note: The following is an implementation of Equations 13.11,
## 13.12, and 13.13 in Fuzzy Logic: Intelligence, Control and
## Information, by J. Yen and R. Langari, Prentice Hall, 1999,
## page 384 (International Edition).
##----------------------------------------------------------------------
function vxb = xie_beni_private (X, V, Mu)
sqr_dist = square_distance_matrix (X, V);
sum_sigma = sum (sum (Mu .* sqr_dist));
n = rows (X);
d_sqr_min = min_sqr_dist_between_centers (V);
vxb = sum_sigma / (n * d_sqr_min);
endfunction
##----------------------------------------------------------------------
## Function: min_sqr_dist_between_centers
## Purpose: Return the square of the minimum distance between
## cluster centers.
##----------------------------------------------------------------------
function d_sqr_min = min_sqr_dist_between_centers (V)
k = rows (V);
d_sqr_matrix = NaN(k, k);
for i = 1 : (k - 1)
Vi = V(i, :);
for j = (i + 1) : k
Vi_to_Vj = V(j, :) - Vi;
d_sqr_matrix(i, j) = sum (Vi_to_Vj .* Vi_to_Vj);
endfor
endfor
d_sqr_min = min (min (d_sqr_matrix));
endfunction
## Test input validation
%!error <xie_beni_index requires 3 arguments>
%! xie_beni_index()
%!error <xie_beni_index requires 3 arguments>
%! xie_beni_index(1)
%!error <xie_beni_index requires 3 arguments>
%! xie_beni_index(1, 2)
%!error <xie_beni_index: function called with too many inputs>
%! xie_beni_index(1, 2, 3, 4)
%!error <xie_beni_index's first argument must be matrix of reals>
%! xie_beni_index(1j, 2, 3)
%!error <xie_beni_index's 2nd arg must be matrix of reals with same #cols as input_data>
%! xie_beni_index(1, [2 2], 3)
%!error <xie_beni_index's 3rd arg must be a matrix of reals 0.0-1.0>
%! xie_beni_index([1 1], [2 2], 3j)
|