e1071/0000755000175100001440000000000014534036526011035 5ustar hornikuserse1071/NAMESPACE0000644000175100001440000000436214533656767012277 0ustar hornikusersuseDynLib("e1071", .registration = TRUE, .fixes = "R_") import(graphics) import(grDevices) importFrom("stats", "cmdscale", "complete.cases", "cutree", ".getXlevels", "delete.response", "dnorm", "fft", "fitted", "kmeans", "median", "model.extract", "model.frame", "model.matrix", "model.response", "na.fail", "na.omit", "na.pass", "napredict", "optim", "pchisq", "pnorm", "ppoints", "predict", "qnorm", "quantile", "rnorm", "runif", "sd", "terms", "time", "ts", "var", "xtabs") importFrom("proxy", "dist") importFrom("utils", "head") importFrom("methods", "as", "getClass", "new") importFrom("class", "knn", "knn1") if(getRversion() >= "2.5.0") importFrom("utils", "write.table") export(ddiscrete, pdiscrete, qdiscrete, rdiscrete, bclust, hclust.bclust, centers.bclust, clusters.bclust, bincombinations, bootstrap.lca, classAgreement, cmeans, countpattern, cshell, element, fclustIndex, gknn, hamming.distance, hamming.window, hanning.window, ica, impute, interpolate, kurtosis, lca, matchControls, matchClasses, compareMatchedClasses, moment, naiveBayes, permutations, rbridge, read.matrix.csr, write.matrix.csr, rectangle.window, rwiener, allShortestPaths, extractPath, sigmoid, dsigmoid, d2sigmoid, skewness, stft, svm, tune, tune.control, write.svm, probplot, hsv_palette, scale_data_frame) exportPattern("tune\\..+", "best\\..+") S3method(boxplot, bclust) S3method(coef, svm) S3method(gknn, default) S3method(gknn, formula) S3method(lines, probplot) S3method(naiveBayes, default) S3method(naiveBayes, formula) S3method(plot, bclust) S3method(plot, ica) S3method(plot, stft) S3method(plot, svm) S3method(plot, tune) S3method(predict, lca) S3method(predict, naiveBayes) S3method(predict, svm) S3method(predict, gknn) S3method(print, bootstrap.lca) S3method("print", "fclust") S3method(print, gknn) S3method(print, ica) S3method(print, lca) S3method(print, summary.lca) S3method(print, naiveBayes) S3method(print, svm) S3method(print, summary.svm) S3method(print, tune) S3method(print, summary.tune) S3method(summary, lca) S3method(summary, svm) S3method(summary, tune) S3method(svm, default) S3method(svm, formula) e1071/man/0000755000175100001440000000000014325173527011611 5ustar hornikuserse1071/man/svm.Rd0000644000175100001440000002546714173734133012720 0ustar hornikusers\name{svm} \alias{svm} \alias{svm.default} \alias{svm.formula} \alias{summary.svm} \alias{print.summary.svm} \alias{coef.svm} \alias{print.svm} \title{Support Vector Machines} \description{ \code{svm} is used to train a support vector machine. It can be used to carry out general regression and classification (of nu and epsilon-type), as well as density-estimation. A formula interface is provided. } \usage{ \method{svm}{formula}(formula, data = NULL, ..., subset, na.action = na.omit, scale = TRUE) \method{svm}{default}(x, y = NULL, scale = TRUE, type = NULL, kernel = "radial", degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x), coef0 = 0, cost = 1, nu = 0.5, class.weights = NULL, cachesize = 40, tolerance = 0.001, epsilon = 0.1, shrinking = TRUE, cross = 0, probability = FALSE, fitted = TRUE, ..., subset, na.action = na.omit) } \arguments{ \item{formula}{a symbolic description of the model to be fit.} \item{data}{an optional data frame containing the variables in the model. By default the variables are taken from the environment which \sQuote{svm} is called from.} \item{x}{a data matrix, a vector, or a sparse matrix (object of class \code{\link[Matrix]{Matrix}} provided by the \pkg{Matrix} package, or of class \code{\link[SparseM]{matrix.csr}} provided by the \pkg{SparseM} package, or of class \code{\link[slam]{simple_triplet_matrix}} provided by the \pkg{slam} package).} \item{y}{a response vector with one label for each row/component of \code{x}. Can be either a factor (for classification tasks) or a numeric vector (for regression).} \item{scale}{A logical vector indicating the variables to be scaled. If \code{scale} is of length 1, the value is recycled as many times as needed. Per default, data are scaled internally (both \code{x} and \code{y} variables) to zero mean and unit variance. The center and scale values are returned and used for later predictions.} \item{type}{\code{svm} can be used as a classification machine, as a regression machine, or for novelty detection. Depending of whether \code{y} is a factor or not, the default setting for \code{type} is \code{C-classification} or \code{eps-regression}, respectively, but may be overwritten by setting an explicit value.\cr Valid options are: \itemize{ \item \code{C-classification} \item \code{nu-classification} \item \code{one-classification} (for novelty detection) \item \code{eps-regression} \item \code{nu-regression} } } \item{kernel}{the kernel used in training and predicting. You might consider changing some of the following parameters, depending on the kernel type.\cr \describe{ \item{linear:}{\eqn{u'v}{u'*v}} \item{polynomial:}{\eqn{(\gamma u'v + coef0)^{degree}}{(gamma*u'*v + coef0)^degree}} \item{radial basis:}{\eqn{e^(-\gamma |u-v|^2)}{exp(-gamma*|u-v|^2)}} \item{sigmoid:}{\eqn{tanh(\gamma u'v + coef0)}{tanh(gamma*u'*v + coef0)}} } } \item{degree}{parameter needed for kernel of type \code{polynomial} (default: 3)} \item{gamma}{parameter needed for all kernels except \code{linear} (default: 1/(data dimension))} \item{coef0}{parameter needed for kernels of type \code{polynomial} and \code{sigmoid} (default: 0)} \item{cost}{cost of constraints violation (default: 1)---it is the \sQuote{C}-constant of the regularization term in the Lagrange formulation.} \item{nu}{parameter needed for \code{nu-classification}, \code{nu-regression}, and \code{one-classification}} \item{class.weights}{a named vector of weights for the different classes, used for asymmetric class sizes. Not all factor levels have to be supplied (default weight: 1). All components have to be named. Specifying \code{"inverse"} will choose the weights \emph{inversely} proportional to the class distribution.} \item{cachesize}{cache memory in MB (default 40)} \item{tolerance}{tolerance of termination criterion (default: 0.001)} \item{epsilon}{epsilon in the insensitive-loss function (default: 0.1)} \item{shrinking}{option whether to use the shrinking-heuristics (default: \code{TRUE})} \item{cross}{if a integer value k>0 is specified, a k-fold cross validation on the training data is performed to assess the quality of the model: the accuracy rate for classification and the Mean Squared Error for regression} \item{fitted}{logical indicating whether the fitted values should be computed and included in the model or not (default: \code{TRUE})} \item{probability}{logical indicating whether the model should allow for probability predictions.} \item{\dots}{additional parameters for the low level fitting function \code{svm.default}} \item{subset}{An index vector specifying the cases to be used in the training sample. (NOTE: If given, this argument must be named.)} \item{na.action}{A function to specify the action to be taken if \code{NA}s are found. The default action is \code{na.omit}, which leads to rejection of cases with missing values on any required variable. An alternative is \code{na.fail}, which causes an error if \code{NA} cases are found. (NOTE: If given, this argument must be named.)} } \value{ An object of class \code{"svm"} containing the fitted model, including: \item{SV}{The resulting support vectors (possibly scaled).} \item{index}{The index of the resulting support vectors in the data matrix. Note that this index refers to the preprocessed data (after the possible effect of \code{na.omit} and \code{subset})} \item{coefs}{The corresponding coefficients times the training labels.} \item{rho}{The negative intercept.} \item{sigma}{In case of a probabilistic regression model, the scale parameter of the hypothesized (zero-mean) laplace distribution estimated by maximum likelihood.} \item{probA, probB}{numeric vectors of length k(k-1)/2, k number of classes, containing the parameters of the logistic distributions fitted to the decision values of the binary classifiers (1 / (1 + exp(a x + b))).} } \details{ For multiclass-classification with k levels, k>2, \code{libsvm} uses the \sQuote{one-against-one}-approach, in which k(k-1)/2 binary classifiers are trained; the appropriate class is found by a voting scheme. \code{libsvm} internally uses a sparse data representation, which is also high-level supported by the package \pkg{SparseM}. If the predictor variables include factors, the formula interface must be used to get a correct model matrix. \code{plot.svm} allows a simple graphical visualization of classification models. The probability model for classification fits a logistic distribution using maximum likelihood to the decision values of all binary classifiers, and computes the a-posteriori class probabilities for the multi-class problem using quadratic optimization. The probabilistic regression model assumes (zero-mean) laplace-distributed errors for the predictions, and estimates the scale parameter using maximum likelihood. For linear kernel, the coefficients of the regression/decision hyperplane can be extracted using the \code{coef} method (see examples). } \note{ Data are scaled internally, usually yielding better results. Parameters of SVM-models usually \emph{must} be tuned to yield sensible results! } \references{ \itemize{ \item Chang, Chih-Chung and Lin, Chih-Jen:\cr \emph{LIBSVM: a library for Support Vector Machines}\cr \url{https://www.csie.ntu.edu.tw/~cjlin/libsvm/} \item Exact formulations of models, algorithms, etc. can be found in the document:\cr Chang, Chih-Chung and Lin, Chih-Jen:\cr \emph{LIBSVM: a library for Support Vector Machines}\cr \url{https://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.ps.gz} \item More implementation details and speed benchmarks can be found on: Rong-En Fan and Pai-Hsune Chen and Chih-Jen Lin:\cr \emph{Working Set Selection Using the Second Order Information for Training SVM}\cr \url{https://www.csie.ntu.edu.tw/~cjlin/papers/quadworkset.pdf} } } \author{ David Meyer (based on C/C++-code by Chih-Chung Chang and Chih-Jen Lin)\cr \email{David.Meyer@R-project.org} } \seealso{ \code{\link{predict.svm}} \code{\link{plot.svm}} \code{\link{tune.svm}} \code{\link[SparseM]{matrix.csr}} (in package \pkg{SparseM}) } \examples{ data(iris) attach(iris) ## classification mode # default with factor response: model <- svm(Species ~ ., data = iris) # alternatively the traditional interface: x <- subset(iris, select = -Species) y <- Species model <- svm(x, y) print(model) summary(model) # test with train data pred <- predict(model, x) # (same as:) pred <- fitted(model) # Check accuracy: table(pred, y) # compute decision values and probabilities: pred <- predict(model, x, decision.values = TRUE) attr(pred, "decision.values")[1:4,] # visualize (classes by color, SV by crosses): plot(cmdscale(dist(iris[,-5])), col = as.integer(iris[,5]), pch = c("o","+")[1:150 \%in\% model$index + 1]) ## try regression mode on two dimensions # create data x <- seq(0.1, 5, by = 0.05) y <- log(x) + rnorm(x, sd = 0.2) # estimate model and predict input values m <- svm(x, y) new <- predict(m, x) # visualize plot(x, y) points(x, log(x), col = 2) points(x, new, col = 4) ## density-estimation # create 2-dim. normal with rho=0: X <- data.frame(a = rnorm(1000), b = rnorm(1000)) attach(X) # traditional way: m <- svm(X, gamma = 0.1) # formula interface: m <- svm(~., data = X, gamma = 0.1) # or: m <- svm(~ a + b, gamma = 0.1) # test: newdata <- data.frame(a = c(0, 4), b = c(0, 4)) predict (m, newdata) # visualize: plot(X, col = 1:1000 \%in\% m$index + 1, xlim = c(-5,5), ylim=c(-5,5)) points(newdata, pch = "+", col = 2, cex = 5) ## weights: (example not particularly sensible) i2 <- iris levels(i2$Species)[3] <- "versicolor" summary(i2$Species) wts <- 100 / table(i2$Species) wts m <- svm(Species ~ ., data = i2, class.weights = wts) ## extract coefficients for linear kernel # a. regression x <- 1:100 y <- x + rnorm(100) m <- svm(y ~ x, scale = FALSE, kernel = "linear") coef(m) plot(y ~ x) abline(m, col = "red") # b. classification # transform iris data to binary problem, and scale data setosa <- as.factor(iris$Species == "setosa") iris2 = scale(iris[,-5]) # fit binary C-classification model m <- svm(setosa ~ Petal.Width + Petal.Length, data = iris2, kernel = "linear") # plot data and separating hyperplane plot(Petal.Length ~ Petal.Width, data = iris2, col = setosa) (cf <- coef(m)) abline(-cf[1]/cf[3], -cf[2]/cf[3], col = "red") # plot margin and mark support vectors abline(-(cf[1] + 1)/cf[3], -cf[2]/cf[3], col = "blue") abline(-(cf[1] - 1)/cf[3], -cf[2]/cf[3], col = "blue") points(m$SV, pch = 5, cex = 2) } \keyword{neural} \keyword{nonlinear} \keyword{classif} e1071/man/plot.svm.Rd0000755000175100001440000000437314173734134013672 0ustar hornikusers\name{plot.svm} \alias{plot.svm} %- Also NEED an `\alias' for EACH other topic documented here. \title{Plot SVM Objects} \description{ Generates a scatter plot of the input data of a \code{svm} fit for classification models by highlighting the classes and support vectors. Optionally, draws a filled contour plot of the class regions. } \usage{ \method{plot}{svm}(x, data, formula, fill = TRUE, grid = 50, slice = list(), symbolPalette = palette(), svSymbol = "x", dataSymbol = "o", ...) } %- maybe also `usage' for other objects documented here. \arguments{ \item{x}{An object of class \code{svm}} \item{data}{data to visualize. Should be the same used for fitting.} \item{formula}{formula selecting the visualized two dimensions. Only needed if more than two input variables are used.} \item{fill}{switch indicating whether a contour plot for the class regions should be added.} \item{grid}{granularity for the contour plot.} \item{slice}{a list of named values for the dimensions held constant (only needed if more than two variables are used). The defaults for unspecified dimensions are 0 (for numeric variables) and the first level (for factors). Factor levels can either be specified as factors or character vectors of length 1.} \item{symbolPalette}{Color palette used for the class the data points and support vectors belong to.} \item{svSymbol}{Symbol used for support vectors.} \item{dataSymbol}{Symbol used for data points (other than support vectors).} \item{\dots}{additional graphics parameters passed to \code{filled.contour} and \code{plot}.} } \author{David Meyer\cr \email{David.Meyer@R-project.org}} \seealso{\code{\link{svm}}} \examples{ ## a simple example data(cats, package = "MASS") m <- svm(Sex~., data = cats) plot(m, cats) ## more than two variables: fix 2 dimensions data(iris) m2 <- svm(Species~., data = iris) plot(m2, iris, Petal.Width ~ Petal.Length, slice = list(Sepal.Width = 3, Sepal.Length = 4)) ## plot with custom symbols and colors plot(m, cats, svSymbol = 1, dataSymbol = 2, symbolPalette = rainbow(4), color.palette = terrain.colors) } \keyword{neural}% at least one, from doc/KEYWORDS \keyword{classif}% __ONLY ONE__ keyword per line \keyword{nonlinear}% __ONLY ONE__ keyword per line e1071/man/tune.Rd0000644000175100001440000001115614325173527013057 0ustar hornikusers\name{tune} \alias{tune} \alias{best.tune} \alias{print.tune} \alias{summary.tune} \alias{print.summary.tune} \title{Parameter Tuning of Functions Using Grid Search} \description{ This generic function tunes hyperparameters of statistical methods using a grid search over supplied parameter ranges. } \usage{ tune(METHOD, train.x, train.y = NULL, data = list(), validation.x = NULL, validation.y = NULL, ranges = NULL, predict.func = predict, tunecontrol = tune.control(), ...) best.tune(...) } \arguments{ \item{METHOD}{either the function to be tuned, or a character string naming such a function.} \item{train.x}{either a formula or a matrix of predictors.} \item{train.y}{the response variable if \code{train.x} is a predictor matrix. Ignored if \code{train.x} is a formula.} \item{data}{data, if a formula interface is used. Ignored, if predictor matrix and response are supplied directly.} \item{validation.x}{an optional validation set. Depending on whether a formula interface is used or not, the response can be included in \code{validation.x} or separately specified using \code{validation.y}. Only used for bootstrap and fixed validation set (see \code{\link{tune.control}})} \item{validation.y}{if no formula interface is used, the response of the (optional) validation set. Only used for bootstrap and fixed validation set (see \code{\link{tune.control}})} \item{ranges}{a named list of parameter vectors spanning the sampling space. The vectors will usually be created by \code{seq}.} \item{predict.func}{optional predict function, if the standard \code{predict} behavior is inadequate.} \item{tunecontrol}{object of class \code{"tune.control"}, as created by the function \code{tune.control()}. If omitted, \code{tune.control()} gives the defaults.} \item{\dots}{Further parameters passed to the training functions.} } \value{ For \code{tune}, an object of class \code{tune}, including the components: \item{best.parameters}{a 1 x k data frame, k number of parameters.} \item{best.performance}{best achieved performance.} \item{performances}{if requested, a data frame of all parameter combinations along with the corresponding performance results.} \item{train.ind}{list of index vectors used for splits into training and validation sets.} \item{best.model}{if requested, the model trained on the complete training data using the best parameter combination.} \code{best.tune()} returns the best model detected by \code{tune}. } \details{ As performance measure, the classification error is used for classification, and the mean squared error for regression. It is possible to specify only one parameter combination (i.e., vectors of length 1) to obtain an error estimation of the specified type (bootstrap, cross-classification, etc.) on the given data set. For convenience, there are several \code{tune.foo()} wrappers defined, e.g., for \code{nnet()}, \code{randomForest()}, \code{rpart()}, \code{svm()}, and \code{knn()}. Cross-validation randomizes the data set before building the splits which---once created---remain constant during the training process. The splits can be recovered through the \code{train.ind} component of the returned object. } \author{ David Meyer\cr \email{David.Meyer@R-project.org} } \seealso{\code{\link{tune.control}}, \code{\link{plot.tune}}, \code{\link{tune.svm}}, \link{tune.wrapper}} \examples{ data(iris) ## tune `svm' for classification with RBF-kernel (default in svm), ## using one split for training/validation set obj <- tune(svm, Species~., data = iris, ranges = list(gamma = 2^(-1:1), cost = 2^(2:4)), tunecontrol = tune.control(sampling = "fix") ) ## alternatively: ## obj <- tune.svm(Species~., data = iris, gamma = 2^(-1:1), cost = 2^(2:4)) summary(obj) plot(obj) ## tune `knn' using a convenience function; this time with the ## conventional interface and bootstrap sampling: x <- iris[,-5] y <- iris[,5] obj2 <- tune.knn(x, y, k = 1:5, tunecontrol = tune.control(sampling = "boot")) summary(obj2) plot(obj2) ## tune `gknn' using the formula interface. ## (Use Euclidean distances instead of Gower metric) obj3 <- tune.gknn(Species ~ ., data = iris, k = 1:5, method = "Euclidean") summary(obj3) plot(obj3) ## tune `rpart' for regression, using 10-fold cross validation (default) data(mtcars) obj4 <- tune.rpart(mpg~., data = mtcars, minsplit = c(5,10,15)) summary(obj4) plot(obj4) ## simple error estimation for lm using 10-fold cross validation tune(lm, mpg~., data = mtcars) } \keyword{models} e1071/man/hanning.window.Rd0000755000175100001440000000142314173734134015031 0ustar hornikusers\name{hanning.window} \title{Computes the Coefficients of a Hanning Window.} \usage{hanning.window(n)} \alias{hanning.window} \arguments{ \item{n}{The length of the window.} } \description{The filter coefficients \eqn{w_i}{w(i)} of a Hanning window of length \code{n} are computed according to the formula \deqn{w_i = 0.5 - 0.5 \cos\frac{2\pi i}{n-1}}{ w(i) = 0.5 - 0.5*cos(2*pi*i/(n-1))} } \value{A vector containing the filter coefficients.} \references{For a definition of the Hanning window, see for example\cr Alan V. Oppenheim and Roland W. Schafer: "Discrete-Time Signal Processing", Prentice-Hall, 1989.} \author{Andreas Weingessel} \seealso{stft, hamming.window} \examples{hanning.window(10) x<-rnorm(500) y<-stft(x, wtype="hanning.window") plot(y) } \keyword{ts} e1071/man/kurtosis.Rd0000755000175100001440000000317014173734133013764 0ustar hornikusers\name{kurtosis} \alias{kurtosis} \title{Kurtosis} \description{ Computes the kurtosis. } \usage{ kurtosis(x, na.rm = FALSE, type = 3) } \arguments{ \item{x}{a numeric vector containing the values whose kurtosis is to be computed.} \item{na.rm}{a logical value indicating whether \code{NA} values should be stripped before the computation proceeds.} \item{type}{an integer between 1 and 3 selecting one of the algorithms for computing kurtosis detailed below.} } \details{ If \code{x} contains missings and these are not removed, the kurtosis is \code{NA}. Otherwise, write \eqn{x_i} for the non-missing elements of \code{x}, \eqn{n} for their number, \eqn{\mu}{mu} for their mean, \eqn{s} for their standard deviation, and \eqn{m_r = \sum_i (x_i - \mu)^r / n}{m_r = \sum_i (x_i - mu)^r / n} for the sample moments of order \eqn{r}. Joanes and Gill (1998) discuss three methods for estimating kurtosis: \describe{ \item{Type 1:}{ \eqn{g_2 = m_4 / m_2^2 - 3}. This is the typical definition used in many older textbooks.} \item{Type 2:}{ \eqn{G_2 = ((n+1) g_2 + 6) * (n-1) / ((n-2)(n-3))}. Used in SAS and SPSS. } \item{Type 3:}{ \eqn{b_2 = m_4 / s^4 - 3 = (g_2 + 3) (1 - 1/n)^2 - 3}. Used in MINITAB and BMDP.} } Only \eqn{G_2} (corresponding to \code{type = 2}) is unbiased under normality. } \value{ The estimated kurtosis of \code{x}. } \references{ D. N. Joanes and C. A. Gill (1998), Comparing measures of sample skewness and kurtosis. \emph{The Statistician}, \bold{47}, 183--189. } \examples{ x <- rnorm(100) kurtosis(x) } \keyword{univar} e1071/man/hamming.distance.Rd0000755000175100001440000000122714173734134015314 0ustar hornikusers\name{hamming.distance} \alias{hamming.distance} \title{Hamming Distances of Vectors} \usage{ hamming.distance(x, y) } \arguments{ \item{x}{a vector or matrix.} \item{y}{an optional vector.} } \description{ If both \code{x} and \code{y} are vectors, \code{hamming.distance} returns the Hamming distance (number of different elements) between this two vectors. If \code{x} is a matrix, the Hamming distances between the rows of \code{x} are computed and \code{y} is ignored. } \examples{ x <- c(1, 0, 0) y <- c(1, 0, 1) hamming.distance(x, y) z <- rbind(x,y) rownames(z) <- c("Fred", "Tom") hamming.distance(z) hamming.distance(1:3, 3:1) } \keyword{multivariate} e1071/man/scale_data_frame.Rd0000644000175100001440000000571614024346715015340 0ustar hornikusers\name{scale_data_frame} \alias{scale_data_frame} \title{Scaling and Centering of Data Frames} \description{ \code{scale_data_frame} centers and/or scales the columns of a data frame (or matrix). } \usage{ scale_data_frame(x, center = TRUE, scale = TRUE) } \arguments{ \item{x}{a data frame or a numeric matrix (or vector). For matrices or vectors, \code{scale()} is used.} \item{center}{either a logical value or numeric-alike vector of length equal to the number of columns of \code{x}, where \sQuote{numeric-alike} means that \code{\link{as.numeric}(.)} will be applied successfully if \code{\link{is.numeric}(.)} is not true.} \item{scale}{either a logical value or a numeric-alike vector of length equal to the number of columns of \code{x}.} } \value{ For \code{scale.default}, the centered, scaled data frame. Non-numeric columns are ignored. Note that logicals are treated as 0/1-numerics to be consistent with \code{scale()}. The numeric centering and scalings used (if any) are returned as attributes \code{"scaled:center"} and \code{"scaled:scale"} - but only for the numeric/logical columns. } \details{ The value of \code{center} determines how column centering is performed. If \code{center} is a numeric-alike vector with length equal to the number of numeric/logical columns of \code{x}, then each column of \code{x} has the corresponding value from \code{center} subtracted from it. If \code{center} is \code{TRUE} then centering is done by subtracting the column means (omitting \code{NA}s) of \code{x} from their corresponding columns, and if \code{center} is \code{FALSE}, no centering is done. The value of \code{scale} determines how column scaling is performed (after centering). If \code{scale} is a numeric-alike vector with length equal to the number of numeric/logiocal columns of \code{x}, then each column of \code{x} is divided by the corresponding value from \code{scale}. If \code{scale} is \code{TRUE} then scaling is done by dividing the (centered) columns of \code{x} by their standard deviations if \code{center} is \code{TRUE}, and the root mean square otherwise. If \code{scale} is \code{FALSE}, no scaling is done. The root-mean-square for a (possibly centered) column is defined as \eqn{\sqrt{\sum(x^2)/(n-1)}}{sqrt(sum(x^2)/(n-1))}, where \eqn{x} is a vector of the non-missing values and \eqn{n} is the number of non-missing values. In the case \code{center = TRUE}, this is the same as the standard deviation, but in general it is not. (To scale by the standard deviations without centering, use \code{scale(x, center = FALSE, scale = apply(x, 2, sd, na.rm = TRUE))}.) } \references{ Becker, R. A., Chambers, J. M. and Wilks, A. R. (1988) \emph{The New S Language}. Wadsworth & Brooks/Cole. } \seealso{ \code{\link{sweep}} which allows centering (and scaling) with arbitrary statistics. } \examples{ require(stats) data(iris) summary(scale_data_frame(iris)) } \keyword{array} e1071/man/tune.control.Rd0000755000175100001440000000523014173734134014533 0ustar hornikusers\name{tune.control} \alias{tune.control} \title{Control Parameters for the Tune Function} \description{ Creates an object of class \code{tune.control} to be used with the \code{tune} function, containing various control parameters. } \usage{ tune.control(random = FALSE, nrepeat = 1, repeat.aggregate = mean, sampling = c("cross", "fix", "bootstrap"), sampling.aggregate = mean, sampling.dispersion = sd, cross = 10, fix = 2/3, nboot = 10, boot.size = 9/10, best.model = TRUE, performances = TRUE, error.fun = NULL) } \arguments{ \item{random}{if an integer value is specified, \code{random} parameter vectors are drawn from the parameter space.} \item{nrepeat}{specifies how often training shall be repeated.} \item{repeat.aggregate}{function for aggregating the repeated training results.} \item{sampling}{sampling scheme. If \code{sampling = "cross"}, a \code{cross}-times cross validation is performed. If \code{sampling = "boot"}, \code{nboot} training sets of size \code{boot.size} (part) are sampled (with replacement) from the supplied data. If \code{sampling = "fix"}, a single split into training/validation set is used, the training set containing a \code{fix} part of the supplied data. Note that a separate validation set can be supplied via \code{validation.x} and \code{validation.y}. It is only used for \code{sampling = "boot"} and \code{sampling = "fix"}; in the latter case, \code{fix} is set to 1.} \item{sampling.aggregate,sampling.dispersion}{functions for aggregating the training results on the generated training samples (default: mean and standard deviation).} \item{cross}{number of partitions for cross-validation.} \item{fix}{part of the data used for training in fixed sampling.} \item{nboot}{number of bootstrap replications.} \item{boot.size}{size of the bootstrap samples.} \item{best.model}{if \code{TRUE}, the best model is trained and returned (the best parameter set is used for training on the complete training set).} \item{performances}{if \code{TRUE}, the performance results for all parameter combinations are returned.} \item{error.fun}{function returning the error measure to be minimized. It takes two arguments: a vector of true values and a vector of predicted values. If \code{NULL}, the misclassification error is used for categorical predictions and the mean squared error for numeric predictions.} } \value{ An object of class \code{"tune.control"} containing all the above parameters (either the defaults or the user specified values). } \author{ David Meyer\cr \email{David.Meyer@R-project.org} } \seealso{\code{\link{tune}}} \keyword{models} e1071/man/hamming.window.Rd0000755000175100001440000000142714173734134015033 0ustar hornikusers\name{hamming.window} \title{Computes the Coefficients of a Hamming Window.} \usage{hamming.window(n)} \alias{hamming.window} \arguments{ \item{n}{The length of the window.} } \description{The filter coefficients \eqn{w_i}{w(i)} of a Hamming window of length \code{n} are computed according to the formula \deqn{w_i = 0.54 - 0.46 \cos\frac{2\pi i}{n-1}}{ w(i) = 0.54 - 0.46*cos(2*pi*i/(n-1))} } \value{A vector containing the filter coefficients.} \references{For a definition of the Hamming window, see for example\cr Alan V. Oppenheim and Roland W. Schafer: "Discrete-Time Signal Processing", Prentice-Hall, 1989.} \author{Andreas Weingessel} \seealso{stft, hanning.window} \examples{hamming.window(10) x<-rnorm(500) y<-stft(x, wtype="hamming.window") plot(y) } \keyword{ts} e1071/man/bclust.Rd0000644000175100001440000001160114246371156013373 0ustar hornikusers\name{bclust} \alias{bclust} \alias{hclust.bclust} \alias{plot.bclust} \alias{centers.bclust} \alias{clusters.bclust} \title{Bagged Clustering} \usage{ bclust(x, centers=2, iter.base=10, minsize=0, dist.method="euclidean", hclust.method="average", base.method="kmeans", base.centers=20, verbose=TRUE, final.kmeans=FALSE, docmdscale=FALSE, resample=TRUE, weights=NULL, maxcluster=base.centers, ...) hclust.bclust(object, x, centers, dist.method=object$dist.method, hclust.method=object$hclust.method, final.kmeans=FALSE, docmdscale = FALSE, maxcluster=object$maxcluster) \method{plot}{bclust}(x, maxcluster=x$maxcluster, main, ...) centers.bclust(object, k) clusters.bclust(object, k, x=NULL) } \arguments{ \item{x}{Matrix of inputs (or object of class \code{"bclust"} for plot).} \item{centers, k}{Number of clusters.} \item{iter.base}{Number of runs of the base cluster algorithm.} \item{minsize}{Minimum number of points in a base cluster.} \item{dist.method}{Distance method used for the hierarchical clustering, see \code{\link{dist}} for available distances.} \item{hclust.method}{Linkage method used for the hierarchical clustering, see \code{\link{hclust}} for available methods.} \item{base.method}{Partitioning cluster method used as base algorithm.} \item{base.centers}{Number of centers used in each repetition of the base method.} \item{verbose}{Output status messages.} \item{final.kmeans}{If \code{TRUE}, a final kmeans step is performed using the output of the bagged clustering as initialization.} \item{docmdscale}{Logical, if \code{TRUE} a \code{\link{cmdscale}} result is included in the return value.} \item{resample}{Logical, if \code{TRUE} the base method is run on bootstrap samples of \code{x}, else directly on \code{x}.} \item{weights}{Vector of length \code{nrow(x)}, weights for the resampling. By default all observations have equal weight.} \item{maxcluster}{Maximum number of clusters memberships are to be computed for.} \item{object}{Object of class \code{"bclust"}.} \item{main}{Main title of the plot.} \item{\dots}{Optional arguments top be passed to the base method in \code{bclust}, ignored in \code{plot}.} } \description{ Cluster the data in \code{x} using the bagged clustering algorithm. A partitioning cluster algorithm such as \code{\link{kmeans}} is run repeatedly on bootstrap samples from the original data. The resulting cluster centers are then combined using the hierarchical cluster algorithm \code{\link{hclust}}. } \details{ First, \code{iter.base} bootstrap samples of the original data in \code{x} are created by drawing with replacement. The base cluster method is run on each of these samples with \code{base.centers} centers. The \code{base.method} must be the name of a partitioning cluster function returning a list with the same components as the return value of \code{\link{kmeans}}. This results in a collection of \code{iter.base * base.centers} centers, which are subsequently clustered using the hierarchical method \code{\link{hclust}}. Base centers with less than \code{minsize} points in there respective partitions are removed before the hierarchical clustering. The resulting dendrogram is then cut to produce \code{centers} clusters. Hence, the name of the argument \code{centers} is a little bit misleading as the resulting clusters need not be convex, e.g., when single linkage is used. The name was chosen for compatibility with standard partitioning cluster methods such as \code{\link{kmeans}}. A new hierarchical clustering (e.g., using another \code{hclust.method}) re-using previous base runs can be performed by running \code{hclust.bclust} on the return value of \code{bclust}. } \value{ \code{bclust} and \code{hclust.bclust} return objects of class \code{"bclust"} including the components \item{hclust}{Return value of the hierarchical clustering of the collection of base centers (Object of class \code{"hclust"}).} \item{cluster}{Vector with indices of the clusters the inputs are assigned to.} \item{centers}{Matrix of centers of the final clusters. Only useful, if the hierarchical clustering method produces convex clusters.} \item{allcenters}{Matrix of all \code{iter.base * base.centers} centers found in the base runs.} } \author{Friedrich Leisch} \references{ Friedrich Leisch. Bagged clustering. Working Paper 51, SFB ``Adaptive Information Systems and Modeling in Economics and Management Science'', August 1999. \url{https://epub.wu.ac.at/1272/1/document.pdf}} \seealso{\code{\link{hclust}}, \code{\link{kmeans}}, \code{\link{boxplot.bclust}}} \keyword{multivariate} \keyword{cluster} \examples{ data(iris) bc1 <- bclust(iris[,1:4], 3, base.centers=5) plot(bc1) table(clusters.bclust(bc1, 3)) centers.bclust(bc1, 3) } e1071/man/gknn.Rd0000644000175100001440000000752514077325003013036 0ustar hornikusers\name{gknn} \alias{gknn} \alias{gknn.default} \alias{gknn.formula} \alias{print.gknn} \alias{predict.gknn} \title{Generalized k-Nearest Neighbors Classification or Regression} \description{ \code{gknn} is an implementation of the k-nearest neighbours algorithm making use of general distance measures. A formula interface is provided. } \usage{ \method{gknn}{formula}(formula, data = NULL, ..., subset, na.action = na.pass, scale = TRUE) \method{gknn}{default}(x, y, k = 1, method = NULL, scale = TRUE, use_all = TRUE, FUN = mean, ...) \method{predict}{gknn}(object, newdata, type = c("class", "votes", "prob"), ..., na.action = na.pass) } \arguments{ \item{formula}{a symbolic description of the model to be fit.} \item{data}{an optional data frame containing the variables in the model. By default the variables are taken from the environment which \sQuote{gknn} is called from.} \item{x}{a data matrix.} \item{y}{a response vector with one label for each row/component of \code{x}. Can be either a factor (for classification tasks) or a numeric vector (for regression).} \item{k}{number of neighbours considered.} \item{scale}{a logical vector indicating the variables to be scaled. If \code{scale} is of length 1, the value is recycled as many times as needed. By default, numeric \emph{matrices} are scaled to zero mean and unit variance. The center and scale values are returned and used for later predictions. Note that the default metric for data frames is the Gower metric which \emph{standardizes} the values to the unit interval.} \item{method}{Argument passed to \code{dist()} from the \code{proxy} package to select the distance metric used: a function, or a mnemonic string referencing the distance measure. Defaults to \code{"Euclidean"} for metric matrices, to \code{"Jaccard"} for logical matrices and to \code{"Gower"} for data frames. } \item{use_all}{controls handling of ties. If true, all distances equal to the kth largest are included. If false, a random selection of distances equal to the kth is chosen to use exactly k neighbours.} \item{FUN}{function used to aggregate the k nearest target values in case of regression.} \item{object}{object of class \code{gknn}.} \item{newdata}{matrix or data frame with new instances.} \item{type}{character specifying the return type in case of class predictions: for \code{"class"}, the class labels; for \code{"prob"}, the class distribution for all k neighbours considered; for \code{"votes"}, the raw counts.} \item{\dots}{additional parameters passed to \code{dist()}} \item{subset}{An index vector specifying the cases to be used in the training sample. (NOTE: If given, this argument must be named.)} \item{na.action}{A function to specify the action to be taken if \code{NA}s are found. The default action is \code{na.pass}. (NOTE: If given, this argument must be named.)} } \value{ For \code{gknn()}, an object of class \code{"gknn"} containing the data and the specified parameters. For \code{predict.gknn()}, a vector of predictions, or a matrix with votes for all classes. In case of an overall class tie, the predicted class is chosen by random. } \author{ David Meyer (\email{David.Meyer@R-project.org}) } \seealso{ \code{\link[proxy]{dist}} (in package \pkg{proxy}) } \examples{ data(iris) model <- gknn(Species ~ ., data = iris) predict(model, iris[c(1, 51, 101),]) test = c(45:50, 95:100, 145:150) model <- gknn(Species ~ ., data = iris[-test,], k = 3, method = "Manhattan") predict(model, iris[test,], type = "votes") model <- gknn(Species ~ ., data = iris[-test], k = 3, method = "Manhattan") predict(model, iris[test,], type = "prob") } \keyword{nonlinear} \keyword{classif} e1071/man/lca.Rd0000644000175100001440000000412514246371156012641 0ustar hornikusers\name{lca} \alias{lca} \alias{print.lca} \alias{summary.lca} \alias{print.summary.lca} \alias{predict.lca} \title{Latent Class Analysis (LCA)} \usage{ lca(x, k, niter=100, matchdata=FALSE, verbose=FALSE) } \arguments{ \item{x}{Either a data matrix of binary observations or a list of patterns as created by \code{\link{countpattern}}} \item{k}{Number of classes used for LCA} \item{niter}{Number of Iterations} \item{matchdata}{If \code{TRUE} and \code{x} is a data matrix, the class membership of every data point is returned, otherwise the class membership of every pattern is returned.} \item{verbose}{If \code{TRUE} some output is printed during the computations.} } \description{ A latent class analysis with \code{k} classes is performed on the data given by \code{x}. } \value{ An object of class \code{"lca"} is returned, containing \item{w}{Probabilities to belong to each class} \item{p}{Probabilities of a `1' for each variable in each class} \item{matching}{Depending on \code{matchdata} either the class membership of each pattern or of each data point} \item{logl, loglsat}{The LogLikelihood of the model and of the saturated model} \item{bic, bicsat}{The BIC of the model and of the saturated model} \item{chisq}{Pearson's Chisq} \item{lhquot}{Likelihood quotient of the model and the saturated model} \item{n}{Number of data points.} \item{np}{Number of free parameters.} } \references{Anton K. Formann: ``Die Latent-Class-Analysis'', Beltz Verlag 1984} \author{Andreas Weingessel} \seealso{ \code{\link{countpattern}}, \code{\link{bootstrap.lca}} } \examples{ ## Generate a 4-dim. sample with 2 latent classes of 500 data points each. ## The probabilities for the 2 classes are given by type1 and type2. type1 <- c(0.8, 0.8, 0.2, 0.2) type2 <- c(0.2, 0.2, 0.8, 0.8) x <- matrix(runif(4000), nrow = 1000) x[1:500,] <- t(t(x[1:500,]) < type1) * 1 x[501:1000,] <- t(t(x[501:1000,]) < type2) * 1 l <- lca(x, 2, niter=5) print(l) summary(l) p <- predict(l, x) table(p, c(rep(1,500),rep(2,500))) } \keyword{multivariate} \keyword{cluster} e1071/man/predict.svm.Rd0000755000175100001440000000755214173734134014350 0ustar hornikusers\name{predict.svm} \alias{predict.svm} \title{Predict Method for Support Vector Machines} \description{ This function predicts values based upon a model trained by \code{svm}. } \usage{ \method{predict}{svm}(object, newdata, decision.values = FALSE, probability = FALSE, ..., na.action = na.omit) } \arguments{ \item{object}{Object of class \code{"svm"}, created by \code{svm}.} \item{newdata}{An object containing the new input data: either a matrix or a sparse matrix (object of class \code{\link[Matrix]{Matrix}} provided by the \pkg{Matrix} package, or of class \code{\link[SparseM]{matrix.csr}} provided by the \pkg{SparseM} package, or of class \code{\link[slam]{simple_triplet_matrix}} provided by the \pkg{slam} package). A vector will be transformed to a n x 1 matrix.} \item{decision.values}{Logical controlling whether the decision values of all binary classifiers computed in multiclass classification shall be computed and returned.} \item{probability}{Logical indicating whether class probabilities should be computed and returned. Only possible if the model was fitted with the \code{probability} option enabled.} \item{na.action}{A function to specify the action to be taken if \sQuote{NA}s are found. The default action is \code{na.omit}, which leads to rejection of cases with missing values on any required variable. An alternative is \code{na.fail}, which causes an error if \code{NA} cases are found. (NOTE: If given, this argument must be named.)} \item{\dots}{Currently not used.} } \value{ A vector of predicted values (for classification: a vector of labels, for density estimation: a logical vector). If \code{decision.value} is \code{TRUE}, the vector gets a \code{"decision.values"} attribute containing a n x c matrix (n number of predicted values, c number of classifiers) of all c binary classifiers' decision values. There are k * (k - 1) / 2 classifiers (k number of classes). The colnames of the matrix indicate the labels of the two classes. If \code{probability} is \code{TRUE}, the vector gets a \code{"probabilities"} attribute containing a n x k matrix (n number of predicted values, k number of classes) of the class probabilities. } \note{ If the training set was scaled by \code{svm} (done by default), the new data is scaled accordingly using scale and center of the training data. } \author{ David Meyer (based on C++-code by Chih-Chung Chang and Chih-Jen Lin)\cr \email{David.Meyer@R-project.org} } \seealso{ \code{\link{svm}} } \examples{ data(iris) attach(iris) ## classification mode # default with factor response: model <- svm(Species ~ ., data = iris) # alternatively the traditional interface: x <- subset(iris, select = -Species) y <- Species model <- svm(x, y, probability = TRUE) print(model) summary(model) # test with train data pred <- predict(model, x) # (same as:) pred <- fitted(model) # compute decision values and probabilites pred <- predict(model, x, decision.values = TRUE, probability = TRUE) attr(pred, "decision.values")[1:4,] attr(pred, "probabilities")[1:4,] ## try regression mode on two dimensions # create data x <- seq(0.1, 5, by = 0.05) y <- log(x) + rnorm(x, sd = 0.2) # estimate model and predict input values m <- svm(x, y) new <- predict(m, x) # visualize plot (x, y) points (x, log(x), col = 2) points (x, new, col = 4) ## density-estimation # create 2-dim. normal with rho=0: X <- data.frame(a = rnorm(1000), b = rnorm(1000)) attach(X) # traditional way: m <- svm(X, gamma = 0.1) # formula interface: m <- svm(~., data = X, gamma = 0.1) # or: m <- svm(~ a + b, gamma = 0.1) # test: newdata <- data.frame(a = c(0, 4), b = c(0, 4)) predict (m, newdata) # visualize: plot(X, col = 1:1000 \%in\% m$index + 1, xlim = c(-5,5), ylim=c(-5,5)) points(newdata, pch = "+", col = 2, cex = 5) } \keyword{neural} \keyword{nonlinear} \keyword{classif} e1071/man/write.svm.Rd0000644000175100001440000000410714246406243014034 0ustar hornikusers\name{write.svm} \alias{write.svm} \title{Write SVM Object to File} \description{ This function exports an SVM object (trained by \code{svm}) to two specified files. One is in the format that the function 'svm_load_model()' of libsvm can read. The other is for scaling data, containing a data with centers and scales for all variables. } \usage{ write.svm(object, svm.file = "Rdata.svm", scale.file = "Rdata.scale", yscale.file = "Rdata.yscale") } \arguments{ \item{object}{Object of class \code{"svm"}, created by \code{svm}.} \item{svm.file}{filename to export the svm object to.} \item{scale.file}{filename to export the scaling data of the explanatory variables to.} \item{yscale.file}{filename to export the scaling data of the dependent variable to, if any.} } \details{ This function is useful when SVM models trained in R shall be used in other environments. The SVM model is saved in the standard format of libsvm. The scaling data are written to separate files because scaling data are not included in the standard format of libsvm. The format of the scaling data file is a n times 2 matrix: the n-th row corresponds to the n-th dimension of the data, the columns being formed of the corresponding mean and scale. If scaling information for the dependent variable exists (in case of regression models), it is stored in yet another file (1 times 2 matrix). } \author{ Tomomi TAKASHINA (based on 'predict.svm' by David Meyer) \email{t.takashina@computer.org} } \seealso{ \code{\link{svm}} } \examples{ data(iris) attach(iris) ## classification mode # default with factor response: model <- svm (Species~., data=iris) # export SVM object to (temporary) files svm_file <- tempfile() scale_file <- tempfile() write.svm(model, svm.file = svm_file, scale.file = scale_file) # read scale file # the n-th row is corresponding to n-th dimension. The 1st column contains the # center value, the 2nd column is the scale value. read.table(scale_file) # clean up unlink(svm_file) unlink(scale_file) } \keyword{neural} \keyword{nonlinear} \keyword{classif} e1071/man/skewness.Rd0000755000175100001440000000325714173734134013752 0ustar hornikusers\name{skewness} \alias{skewness} \title{Skewness} \description{ Computes the skewness. } \usage{ skewness(x, na.rm = FALSE, type = 3) } \arguments{ \item{x}{a numeric vector containing the values whose skewness is to be computed.} \item{na.rm}{a logical value indicating whether \code{NA} values should be stripped before the computation proceeds.} \item{type}{an integer between 1 and 3 selecting one of the algorithms for computing skewness detailed below.} } \details{ If \code{x} contains missings and these are not removed, the skewness is \code{NA}. Otherwise, write \eqn{x_i} for the non-missing elements of \code{x}, \eqn{n} for their number, \eqn{\mu}{mu} for their mean, \eqn{s} for their standard deviation, and \eqn{m_r = \sum_i (x_i - \mu)^r / n}{m_r = \sum_i (x_i - mu)^r / n} for the sample moments of order \eqn{r}. Joanes and Gill (1998) discuss three methods for estimating skewness: \describe{ \item{Type 1:}{ \eqn{g_1 = m_3 / m_2^{3/2}}{g_1 = m_3 / m_2^(3/2)}. This is the typical definition used in many older textbooks.} \item{Type 2:}{ \eqn{G_1 = g_1 \sqrt{n(n-1)} / (n-2)}{ G_1 = g_1 * sqrt(n(n-1)) / (n-2)}. Used in SAS and SPSS. } \item{Type 3:}{ \eqn{b_1 = m_3 / s^3 = g_1 ((n-1)/n)^{3/2}}{ b_1 = m_3 / s^3 = g_1 ((n-1)/n)^(3/2)}. Used in MINITAB and BMDP.} } All three skewness measures are unbiased under normality. } \value{ The estimated skewness of \code{x}. } \references{ D. N. Joanes and C. A. Gill (1998), Comparing measures of sample skewness and kurtosis. \emph{The Statistician}, \bold{47}, 183--189. } \examples{ x <- rnorm(100) skewness(x) } \keyword{univar} e1071/man/naiveBayes.Rd0000755000175100001440000000764314173734134014201 0ustar hornikusers\name{naiveBayes} \alias{naiveBayes} \alias{naiveBayes.default} \alias{naiveBayes.formula} \alias{print.naiveBayes} \alias{predict.naiveBayes} \title{Naive Bayes Classifier} \description{ Computes the conditional a-posterior probabilities of a categorical class variable given independent predictor variables using the Bayes rule. } \usage{ \S3method{naiveBayes}{formula}(formula, data, laplace = 0, ..., subset, na.action = na.pass) \S3method{naiveBayes}{default}(x, y, laplace = 0, ...) \S3method{predict}{naiveBayes}(object, newdata, type = c("class", "raw"), threshold = 0.001, eps = 0, ...) } \arguments{ \item{x}{A numeric matrix, or a data frame of categorical and/or numeric variables.} \item{y}{Class vector.} \item{formula}{A formula of the form \code{class ~ x1 + x2 + \dots}. Interactions are not allowed.} \item{data}{Either a data frame of predictors (categorical and/or numeric) or a contingency table.} \item{laplace}{positive double controlling Laplace smoothing. The default (0) disables Laplace smoothing.} \item{\dots}{Currently not used.} \item{subset}{For data given in a data frame, an index vector specifying the cases to be used in the training sample. (NOTE: If given, this argument must be named.)} \item{na.action}{A function to specify the action to be taken if \code{NA}s are found. The default action is not to count them for the computation of the probability factors. An alternative is na.omit, which leads to rejection of cases with missing values on any required variable. (NOTE: If given, this argument must be named.)} \item{object}{An object of class \code{"naiveBayes"}.} \item{newdata}{A dataframe with new predictors (with possibly fewer columns than the training data). Note that the column names of \code{newdata} are matched against the training data ones.} \item{type}{If \code{"raw"}, the conditional a-posterior probabilities for each class are returned, and the class with maximal probability else.} \item{threshold}{Value replacing cells with probabilities within \code{eps} range.} \item{eps}{double for specifying an epsilon-range to apply laplace smoothing (to replace zero or close-zero probabilities by \code{theshold}.)} } \value{ An object of class \code{"naiveBayes"} including components: \item{apriori}{Class distribution for the dependent variable.} \item{tables}{A list of tables, one for each predictor variable. For each categorical variable a table giving, for each attribute level, the conditional probabilities given the target class. For each numeric variable, a table giving, for each target class, mean and standard deviation of the (sub-)variable.} } \details{ The standard naive Bayes classifier (at least this implementation) assumes independence of the predictor variables, and Gaussian distribution (given the target class) of metric predictors. For attributes with missing values, the corresponding table entries are omitted for prediction. } \author{David Meyer \email{David.Meyer@R-project.org}. Laplace smoothing enhancement by Jinghao Xue.} \examples{ ## Categorical data only: data(HouseVotes84, package = "mlbench") model <- naiveBayes(Class ~ ., data = HouseVotes84) predict(model, HouseVotes84[1:10,]) predict(model, HouseVotes84[1:10,], type = "raw") pred <- predict(model, HouseVotes84) table(pred, HouseVotes84$Class) ## using laplace smoothing: model <- naiveBayes(Class ~ ., data = HouseVotes84, laplace = 3) pred <- predict(model, HouseVotes84[,-1]) table(pred, HouseVotes84$Class) ## Example of using a contingency table: data(Titanic) m <- naiveBayes(Survived ~ ., data = Titanic) m predict(m, as.data.frame(Titanic)) ## Example with metric predictors: data(iris) m <- naiveBayes(Species ~ ., data = iris) ## alternatively: m <- naiveBayes(iris[,-5], iris[,5]) m table(predict(m, iris), iris[,5]) } \keyword{classif} \keyword{category} e1071/man/rbridge.Rd0000755000175100001440000000113214173734134013514 0ustar hornikusers\name{rbridge} \alias{rbridge} \title{Simulation of Brownian Bridge} \usage{ rbridge(end = 1, frequency = 1000) } \arguments{ \item{end}{the time of the last observation.} \item{frequency}{the number of observations per unit of time.} } \description{ \code{rwiener} returns a time series containing a simulated realization of the Brownian bridge on the interval [0,\code{end}]. If W(t) is a Wiener process, then the Brownian bridge is defined as W(t) - t W(1). } \seealso{ rwiener } \examples{ # simulate a Brownian bridge on [0,1] and plot it x <- rbridge() plot(x,type="l") } \keyword{distribution} e1071/man/read.matrix.csr.Rd0000755000175100001440000000302214173734134015102 0ustar hornikusers\name{read.matrix.csr} \alias{read.matrix.csr} \alias{write.matrix.csr} %- Also NEED an `\alias' for EACH other topic documented here. \title{Read/Write Sparse Data} \description{ reads and writes a file in sparse data format. } \usage{ read.matrix.csr(file, fac = TRUE, ncol = NULL) write.matrix.csr(x, file = "out.dat", y = NULL, fac = TRUE) } %- maybe also `usage' for other objects documented here. \arguments{ \item{x}{An object of class \code{matrix.csr}} \item{y}{A vector (either numeric or a factor)} \item{file}{The filename.} \item{fac}{If \code{TRUE}, the y-values (if any) are interpreted as factor levels.} \item{ncol}{Number of columns, detected automatically. Can be used to add empty columns (possibly not stored in the sparse format).} } \value{ If the data file includes no y variable, \code{read.matrix.csr} returns an object of class \code{matrix.csr}, else a list with components: \item{x}{object of class \code{matrix.csr}} \item{y}{vector of numeric values or factor levels, depending on \code{fac}.} } \author{ David Meyer\cr \email{David.Meyer@R-project.org} } \seealso{\code{\link[SparseM]{matrix.csr}}} \examples{ \dontrun{ library(methods) if (require(SparseM)) { data(iris) x <- as.matrix(iris[,1:4]) y <- iris[,5] xs <- as.matrix.csr(x) write.matrix.csr(xs, y = y, file = "iris.dat") xs2 <- read.matrix.csr("iris.dat")$x if (!all(as.matrix(xs) == as.matrix(xs2))) stop("Error: objects are not equal!") } } } \keyword{IO}% at least one, from doc/KEYWORDS e1071/man/ica.Rd0000755000175100001440000000342314173734134012637 0ustar hornikusers\name{ica} \alias{ica} \alias{plot.ica} \alias{print.ica} \title{Independent Component Analysis} \usage{ ica(X, lrate, epochs=100, ncomp=dim(X)[2], fun="negative") } \arguments{ \item{X}{The matrix for which the ICA is to be computed} \item{lrate}{learning rate} \item{epochs}{number of iterations} \item{ncomp}{number of independent components} \item{fun}{function used for the nonlinear computation part} } \description{ This is an R-implementation of the Matlab-Function of Petteri.Pajunen@hut.fi. For a data matrix X independent components are extracted by applying a nonlinear PCA algorithm. The parameter \code{fun} determines which nonlinearity is used. \code{fun} can either be a function or one of the following strings "negative kurtosis", "positive kurtosis", "4th moment" which can be abbreviated to uniqueness. If \code{fun} equals "negative (positive) kurtosis" the function tanh (x-tanh(x)) is used which provides ICA for sources with negative (positive) kurtosis. For \code{fun == "4th moments"} the signed square function is used. } \value{ An object of class \code{"ica"} which is a list with components \item{weights}{ICA weight matrix} \item{projection}{Projected data} \item{epochs}{Number of iterations} \item{fun}{Name of the used function} \item{lrate}{Learning rate used} \item{initweights}{Initial weight matrix} } \references{ Oja et al., ``Learning in Nonlinear Constrained Hebbian Networks'', in Proc. ICANN-91, pp. 385--390. Karhunen and Joutsensalo, ``Generalizations of Principal Component Analysis, Optimization Problems, and Neural Networks'', Neural Networks, v. 8, no. 4, pp. 549--562, 1995. } \note{Currently, there is no reconstruction from the ICA subspace to the original input space.} \author{Andreas Weingessel} \keyword{multivariate} e1071/man/hsv_palette.Rd0000755000175100001440000000143514173734134014422 0ustar hornikusers\name{hsv_palette} \alias{hsv_palette} \title{Sequential color palette based on HSV colors} \description{ Computes a sequential color palette based on HSV colors by varying the saturation, given hue and value. } \usage{ hsv_palette(h = 2/3, from = 0.7, to = 0.2, v = 1) } %- maybe also 'usage' for other objects documented here. \arguments{ \item{h}{hue} \item{from}{lower bound for saturation} \item{to}{upper bound for saturation} \item{v}{value} } \value{ A function with one argument: the size of the palette, i.e., the number of colors. } \author{David Meyer \email{David.Meyer@R-project.org}} \seealso{\code{\link[grDevices]{hsv}}} \examples{ pie(rep(1, 10), col = hsv_palette()(10)) pie(rep(1, 10), col = hsv_palette(h = 0)(10)) } \keyword{hplot}% __ONLY ONE__ keyword per line e1071/man/rectangle.window.Rd0000755000175100001440000000106514173734134015355 0ustar hornikusers\name{rectangle.window} \title{Computes the Coefficients of a Rectangle Window.} \usage{rectangle.window(n)} \alias{rectangle.window} \arguments{ \item{n}{The length of the window.} } \description{Returns the filter coefficients of a rectangle window. That is a vector of \code{n} 1. The purpose of this function is just to have a name for the R command \code{rep (1, n)}. } \value{A vector of length \code{n} filled with 1.} \author{Andreas Weingessel} \seealso{stft} \examples{x<-rnorm(500) y<-stft(x, wtype="rectangle.window") plot(y) } \keyword{ts} e1071/man/classAgreement.Rd0000755000175100001440000000610414173734133015036 0ustar hornikusers\name{classAgreement} \alias{classAgreement} \title{Coefficients Comparing Classification Agreement} \description{ \code{classAgreement()} computes several coefficients of agreement between the columns and rows of a 2-way contingency table. } \usage{ classAgreement(tab, match.names=FALSE) } \arguments{ \item{tab}{A 2-dimensional contingency table.} \item{match.names}{Flag whether row and columns should be matched by name.} } \details{ Suppose we want to compare two classifications summarized by the contingency table \eqn{T=[t_{ij}]} where \eqn{i,j=1,\ldots,K} and \eqn{t_{ij}} denotes the number of data points which are in class \eqn{i} in the first partition and in class \eqn{j} in the second partition. If both classifications use the same labels, then obviously the two classification agree completely if only elements in the main diagonal of the table are non-zero. On the other hand, large off-diagonal elements correspond to smaller agreement between the two classifications. If \code{match.names} is \code{TRUE}, the class labels as given by the row and column names are matched, i.e. only columns and rows with the same dimnames are used for the computation. If the two classification do not use the same set of labels, or if identical labels can have different meaning (e.g., two outcomes of cluster analysis on the same data set), then the situation is a little bit more complicated. Let \eqn{A} denote the number of all pairs of data points which are either put into the same cluster by both partitions or put into different clusters by both partitions. Conversely, let \eqn{D} denote the number of all pairs of data points that are put into one cluster in one partition, but into different clusters by the other partition. Hence, the partitions disagree for all pairs \eqn{D} and agree for all pairs \eqn{A}. We can measure the agreement by the Rand index \eqn{A/(A+D)} which is invariant with respect to permutations of the columns or rows of \eqn{T}. Both indices have to be corrected for agreement by chance if the sizes of the classes are not uniform. } \value{ A list with components \item{diag}{Percentage of data points in the main diagonal of \code{tab}.} \item{kappa}{\code{diag} corrected for agreement by chance.} \item{rand}{Rand index.} \item{crand}{Rand index corrected for agreement by chance.} } \references{ J.~Cohen. A coefficient of agreement for nominal scales. Educational and Psychological Measurement, 20, 37--46, 1960. Lawrence Hubert and Phipps Arabie. Comparing partitions. Journal of Classification, 2, 193--218, 1985. } \author{Friedrich Leisch} \seealso{\code{\link{matchClasses}}} \examples{ ## no class correlations: both kappa and crand almost zero g1 <- sample(1:5, size=1000, replace=TRUE) g2 <- sample(1:5, size=1000, replace=TRUE) tab <- table(g1, g2) classAgreement(tab) ## let pairs (g1=1,g2=1) and (g1=3,g2=3) agree better k <- sample(1:1000, size=200) g1[k] <- 1 g2[k] <- 1 k <- sample(1:1000, size=200) g1[k] <- 3 g2[k] <- 3 tab <- table(g1, g2) ## both kappa and crand should be significantly larger than before classAgreement(tab) } \keyword{category} e1071/man/cmeans.Rd0000755000175100001440000001206714173734134013355 0ustar hornikusers\name{cmeans} \alias{cmeans} \alias{print.fclust} \title{Fuzzy C-Means Clustering} \description{ The fuzzy version of the known \emph{k}means clustering algorithm as well as an on-line variant (Unsupervised Fuzzy Competitive learning). } \usage{ cmeans(x, centers, iter.max = 100, verbose = FALSE, dist = "euclidean", method = "cmeans", m = 2, rate.par = NULL, weights = 1, control = list()) } \arguments{ \item{x}{The data matrix where columns correspond to variables and rows to observations.} \item{centers}{Number of clusters or initial values for cluster centers.} \item{iter.max}{Maximum number of iterations.} \item{verbose}{If \code{TRUE}, make some output during learning.} \item{dist}{Must be one of the following: If \code{"euclidean"}, the mean square error, if \code{"manhattan"}, the mean absolute error is computed. Abbreviations are also accepted.} \item{method}{If \code{"cmeans"}, then we have the \eqn{c}-means fuzzy clustering method, if \code{"ufcl"} we have the on-line update. Abbreviations are also accepted.} \item{m}{A number greater than 1 giving the degree of fuzzification.} \item{rate.par}{A number between 0 and 1 giving the parameter of the learning rate for the on-line variant. The default corresponds to \eqn{0.3}.} \item{weights}{a numeric vector with non-negative case weights. Recycled to the number of observations in \code{x} if necessary.} \item{control}{a list of control parameters. See \bold{Details}.} } \details{ The data given by \code{x} is clustered by generalized versions of the fuzzy \emph{c}-means algorithm, which use either a fixed-point or an on-line heuristic for minimizing the objective function \deqn{\sum_i \sum_j w_i u_{ij}^m d_{ij},} where \eqn{w_i} is the weight of observation \eqn{i}, \eqn{u_{ij}} is the membership of observation \eqn{i} in cluster \eqn{j}, and \eqn{d_{ij}} is the distance (dissimilarity) between observation \eqn{i} and center \eqn{j}. The dissimilarities used are the sums of squares (\code{"euclidean"}) or absolute values (\code{"manhattan"}) of the element-wise differences. If \code{centers} is a matrix, its rows are taken as the initial cluster centers. If \code{centers} is an integer, \code{centers} rows of \code{x} are randomly chosen as initial values. The algorithm stops when the maximum number of iterations (given by \code{iter.max}) is reached, or when the algorithm is unable to reduce the current value \code{val} of the objective function by \code{reltol * (abs(val) * reltol)} at a step. The relative convergence tolerance \code{reltol} can be specified as the \code{reltol} component of the list of control parameters, and defaults to \code{sqrt(.Machine$double.eps)}. If \code{verbose} is \code{TRUE}, each iteration displays its number and the value of the objective function. If \code{method} is \code{"cmeans"}, then we have the \eqn{c}-means fuzzy clustering method, see for example Bezdek (1981). If \code{"ufcl"}, we have the On-line Update (Unsupervised Fuzzy Competitive Learning) method due to Chung and Lee (1992), see also Pal et al (1996). This method works by performing an update directly after each input signal (i.e., for each single observation). The parameters \code{m} defines the degree of fuzzification. It is defined for real values greater than 1 and the bigger it is the more fuzzy the membership values of the clustered data points are. } \value{ An object of class \code{"fclust"} which is a list with components: \item{centers}{the final cluster centers.} \item{size}{the number of data points in each cluster of the closest hard clustering.} \item{cluster}{a vector of integers containing the indices of the clusters where the data points are assigned to for the closest hard clustering, as obtained by assigning points to the (first) class with maximal membership.} \item{iter}{the number of iterations performed.} \item{membership}{a matrix with the membership values of the data points to the clusters.} \item{withinerror}{the value of the objective function.} \item{call}{the call used to create the object.} } \author{ Evgenia Dimitriadou and Kurt Hornik } \references{ J. C. Bezdek (1981). \emph{Pattern recognition with fuzzy objective function algorithms}. New York: Plenum. Fu Lai Chung and Tong Lee (1992). Fuzzy competitive learning. \emph{Neural Networks}, \bold{7}(3), 539--551. Nikhil R. Pal, James C. Bezdek, and Richard J. Hathaway (1996). Sequential competitive learning and the fuzzy c-means clustering algorithms. \emph{Neural Networks}, \bold{9}(5), 787--796. } \examples{ # a 2-dimensional example x<-rbind(matrix(rnorm(100,sd=0.3),ncol=2), matrix(rnorm(100,mean=1,sd=0.3),ncol=2)) cl<-cmeans(x,2,20,verbose=TRUE,method="cmeans",m=2) print(cl) # a 3-dimensional example x<-rbind(matrix(rnorm(150,sd=0.3),ncol=3), matrix(rnorm(150,mean=1,sd=0.3),ncol=3), matrix(rnorm(150,mean=2,sd=0.3),ncol=3)) cl<-cmeans(x,6,20,verbose=TRUE,method="cmeans") print(cl) } \keyword{cluster} e1071/man/probplot.Rd0000755000175100001440000000433414173734134013746 0ustar hornikusers\name{probplot} \alias{probplot} \alias{lines.probplot} \title{Probability Plot} \description{ Generates a probability plot for a specified theoretical distribution, i.e., basically a \code{\link[stats]{qqplot}} where the y-axis is labeled with probabilities instead of quantiles. The function is mainly intended for teaching the concept of quantile plots. } \usage{ probplot(x, qdist=qnorm, probs=NULL, line=TRUE, xlab=NULL, ylab="Probability in \%", ...) \S3method{lines}{probplot}(x, h=NULL, v=NULL, bend=FALSE, ...) } \arguments{ \item{x}{A data vector for \code{probplot}, an object of class \code{probplot} for the \code{lines} method.} \item{qdist}{A character string or a function for the quantiles of the target distribution.} \item{probs}{Vector of probabilities at which horizontal lines should be drawn.} \item{line}{Add a line passing through the quartiles to the plot?} \item{xlab, ylab}{Graphical parameters.} \item{h}{The y-value for a horizontal line.} \item{v}{The x-value for a vertical line.} \item{bend}{If \code{TRUE}, lines are ``bent'' at the quartile line, else regular \code{abline}s are added. See examples.} \item{\dots}{Further arguments for \code{qdist} and graphical parameters for lines.} } \author{Friedrich Leisch} \seealso{\code{\link[stats]{qqplot}}} \examples{ ## a simple example x <- rnorm(100, mean=5) probplot(x) ## the same with horizontal tickmarks at the y-axis opar <- par("las") par(las=1) probplot(x) ## this should show the lack of fit at the tails probplot(x, "qunif") ## for increasing degrees of freedom the t-distribution converges to ## normal probplot(x, qt, df=1) probplot(x, qt, df=3) probplot(x, qt, df=10) probplot(x, qt, df=100) ## manually add the line through the quartiles p <- probplot(x, line=FALSE) lines(p, col="green", lty=2, lwd=2) ## Make the line at prob=0.5 red lines(p, h=0.5, col="red") ### The following use the estimted distribution given by the green ### line: ## What is the probability that x is smaller than 7? lines(p, v=7, bend=TRUE, col="blue") ## Median and 90\% confidence interval lines(p, h=.5, col="red", lwd=3, bend=TRUE) lines(p, h=c(.05, .95), col="red", lwd=2, lty=3, bend=TRUE) par(opar) } \keyword{hplot} e1071/man/countpattern.Rd0000755000175100001440000000202414173734134014625 0ustar hornikusers\name{countpattern} \alias{countpattern} \title{Count Binary Patterns} \usage{ countpattern(x, matching=FALSE) } \arguments{ \item{x}{A matrix of binary observations} \item{matching}{If TRUE an additional vector is returned which stores which row belongs to which pattern} } \description{ Every row of the binary matrix \code{x} is transformed into a binary pattern and these patterns are counted. } \value{ A vector of length \code{2\^ncol(x)} giving the number of times each pattern occurs in the rows of \code{x}. The names of this vector are the binary patterns. They are sorted according to their numeric value. If \code{matching} is \code{TRUE}, a list of the following two vectors is returned. \item{pat}{Numbers of patterns as described above.} \item{matching}{Vector giving the position of the pattern of each row of \code{x} in \code{pat}.} } \author{Andreas Weingessel} \examples{ xx <- rbind(c(1,0,0),c(1,0,0),c(1,0,1),c(0,1,1),c(0,1,1)) countpattern(xx) countpattern(xx, matching=TRUE) } \keyword{multivariate} e1071/man/moment.Rd0000755000175100001440000000231214173734134013376 0ustar hornikusers\name{moment} \alias{moment} \title{Statistical Moment} \description{ Computes the (optionally centered and/or absolute) sample moment of a certain order. } \usage{ moment(x, order=1, center=FALSE, absolute=FALSE, na.rm=FALSE) } \arguments{ \item{x}{a numeric vector containing the values whose moment is to be computed.} \item{order}{order of the moment to be computed, the default is to compute the first moment, i.e., the mean.} \item{center}{a logical value indicating whether centered moments are to be computed.} \item{absolute}{a logical value indicating whether absolute moments are to be computed.} \item{na.rm}{a logical value indicating whether \code{NA} values should be stripped before the computation proceeds.} } \details{ When \code{center} and \code{absolute} are both \code{FALSE}, the moment is simply \code{sum(x ^ order) / length(x)}. } \author{Kurt Hornik and Friedrich Leisch} \seealso{ \code{\link{mean}}, \code{\link{var}}} \examples{ x <- rnorm(100) ## Compute the mean moment(x) ## Compute the 2nd centered moment (!= var) moment(x, order=2, center=TRUE) ## Compute the 3rd absolute centered moment moment(x, order=3, center=TRUE, absolute=TRUE) } \keyword{univar} e1071/man/impute.Rd0000755000175100001440000000101014173734134013374 0ustar hornikusers\name{impute} \alias{impute} \title{Replace Missing Values} \usage{ impute(x, what = c("median", "mean")) } \arguments{ \item{x}{A matrix or dataframe.} \item{what}{What to impute.} } \description{ Replaces missing values of a matrix or dataframe with the medians (\code{what="median"}) or means (\code{what="mean"}) of the respective columns.} \value{ A matrix or dataframe. } \author{Friedrich Leisch} \examples{ x<- matrix(1:10, ncol=2) x[c(1,3,7)] <- NA print(x) print(impute(x)) } \keyword{manip} e1071/man/bootstrap.lca.Rd0000644000175100001440000000523314246371156014656 0ustar hornikusers\name{bootstrap.lca} \alias{bootstrap.lca} \alias{print.bootstrap.lca} \title{Bootstrap Samples of LCA Results} \description{ This function draws bootstrap samples from a given LCA model and refits a new LCA model for each sample. The quality of fit of these models is compared to the original model. } \usage{ bootstrap.lca(l, nsamples=10, lcaiter=30, verbose=FALSE) } \arguments{ \item{l}{An LCA model as created by \code{\link{lca}}} \item{nsamples}{Number of bootstrap samples} \item{lcaiter}{Number of LCA iterations} \item{verbose}{If \code{TRUE} some output is printed during the computations.} } \details{ From a given LCA model \code{l}, \code{nsamples} bootstrap samples are drawn. For each sample a new LCA model is fitted. The goodness of fit for each model is computed via Likelihood Ratio and Pearson's Chisquare. The values for the fitted models are compared with the values of the original model \code{l}. By this method it can be tested whether the data to which \code{l} was originally fitted come from an LCA model. } \value{ An object of class \code{bootstrap.lca} is returned, containing \item{logl, loglsat}{The LogLikelihood of the models and of the corresponding saturated models} \item{lratio}{Likelihood quotient of the models and the corresponding saturated models} \item{lratiomean, lratiosd}{Mean and Standard deviation of \code{lratio}} \item{lratioorg}{Likelihood quotient of the original model and the corresponding saturated model} \item{zratio}{Z-Statistics of \code{lratioorg}} \item{pvalzratio, pvalratio}{P-Values for \code{zratio}, computed via normal distribution and empirical distribution} \item{chisq}{Pearson's Chisq of the models} \item{chisqmean, chisqsd}{Mean and Standard deviation of \code{chisq}} \item{chisqorg}{Pearson's Chisq of the original model} \item{zchisq}{Z-Statistics of \code{chisqorg}} \item{pvalzchisq, pvalchisq}{P-Values for \code{zchisq}, computed via normal distribution and empirical distribution} \item{nsamples}{Number of bootstrap samples} \item{lcaiter}{Number of LCA Iterations} } \references{Anton K. Formann: ``Die Latent-Class-Analysis'', Beltz Verlag 1984} \author{Andreas Weingessel} \seealso{\code{\link{lca}}} \examples{ ## Generate a 4-dim. sample with 2 latent classes of 500 data points each. ## The probabilities for the 2 classes are given by type1 and type2. type1 <- c(0.8, 0.8, 0.2, 0.2) type2 <- c(0.2, 0.2, 0.8, 0.8) x <- matrix(runif(4000), nrow = 1000) x[1:500,] <- t(t(x[1:500,]) < type1) * 1 x[501:1000,] <- t(t(x[501:1000,]) < type2) * 1 l <- lca(x, 2, niter=5) bl <- bootstrap.lca(l,nsamples=3,lcaiter=5) bl } \keyword{multivariate} e1071/man/matchClasses.Rd0000755000175100001440000000667014173734134014524 0ustar hornikusers\name{matchClasses} \alias{matchClasses} \alias{compareMatchedClasses} \title{Find Similar Classes in Two-way Contingency Tables} \usage{ matchClasses(tab, method="rowmax", iter=1, maxexact=9, verbose=TRUE) compareMatchedClasses(x, y, method="rowmax", iter=1, maxexact=9, verbose=FALSE) } \arguments{ \item{tab}{Two-way contingency table of class memberships} \item{method}{One of \code{"rowmax"}, \code{"greedy"} or \code{"exact"}.} \item{iter}{Number of iterations used in greedy search.} \item{verbose}{If \code{TRUE}, display some status messages during computation.} \item{maxexact}{Maximum number of variables for which all possible permutations are computed.} \item{x, y}{Vectors or matrices with class memberships.} } \description{ Try to find a mapping between the two groupings, such that as many cases as possible are in one of the matched pairs. } \details{ If \code{method="rowmax"}, then each class defining a row in the contingency table is mapped to the column of the corresponding row maximum. Hence, some columns may be mapped to more than one row (while each row is mapped to a single column). If \code{method="greedy"} or \code{method="exact"}, then the contingency table must be a square matrix and a unique mapping is computed. This corresponds to a permutation of columns and rows, such that sum of the main diagonal, i.e., the trace of the matrix, gets as large as possible. For both methods, first all pairs where row and columns maxima correspond and are bigger than the sum of all other elements in the corresponding columns and rows together are located and fixed (this is a necessary condition for maximal trace). If \code{method="exact"}, then for the remaining rows and columns, all possible permutations are computed and the optimum is returned. This can get computationally infeasible very fast. If more than \code{maxexact} rows and columns remain after applying the necessary condition, then \code{method} is reset to \code{"greedy"}. If \code{method="greedy"}, then a greedy heuristic is tried \code{iter} times. Repeatedly a row is picked at random and matched to the free column with the maximum value. \code{compareMatchedClasses()} computes the contingency table for each combination of columns from \code{x} and \code{y} and applies \code{matchClasses} to that table. The columns of the table are permuted accordingly and then the table is passed to \code{\link{classAgreement}}. The resulting agreement coefficients (diag, kappa, \ldots) are returned. The return value of \code{compareMatchedClasses()} is a list containing a matrix for each coefficient; with element (k,l) corresponding to the k-th column of \code{x} and l-th column of \code{y}. If \code{y} is missing, then the columns of \code{x} are compared with each other. } \author{Friedrich Leisch} \seealso{\code{\link{classAgreement}}} \examples{ ## a stupid example with no class correlations: g1 <- sample(1:5, size=1000, replace=TRUE) g2 <- sample(1:5, size=1000, replace=TRUE) tab <- table(g1, g2) matchClasses(tab, "exact") ## let pairs (g1=1,g2=4) and (g1=3,g2=1) agree better k <- sample(1:1000, size=200) g1[k] <- 1 g2[k] <- 4 k <- sample(1:1000, size=200) g1[k] <- 3 g2[k] <- 1 tab <- table(g1, g2) matchClasses(tab, "exact") ## get agreement coefficients: compareMatchedClasses(g1, g2, method="exact") } \keyword{category} e1071/man/sigmoid.Rd0000755000175100001440000000073714173734134013543 0ustar hornikusers\name{sigmoid} \alias{sigmoid} \alias{dsigmoid} \alias{d2sigmoid} \title{The Logistic Function and Derivatives} \description{ Sigmoid \eqn{1/(1 + \exp(-x))}{1/(1 + exp(-x))}, first and second derivative.} \usage{ sigmoid(x) dsigmoid(x) d2sigmoid(x) } \arguments{ \item{x}{a numeric vector} } \author{Friedrich Leisch} \examples{ plot(sigmoid, -5, 5, ylim = c(-.2, 1)) plot(dsigmoid, -5, 5, add = TRUE, col = 2) plot(d2sigmoid, -5, 5, add = TRUE, col = 3) } \keyword{math} e1071/man/plot.tune.Rd0000755000175100001440000000375214173734134014040 0ustar hornikusers\name{plot.tune} \alias{plot.tune} %- Also NEED an `\alias' for EACH other topic documented here. \title{Plot Tuning Object} \description{ Visualizes the results of parameter tuning. } \usage{ \method{plot}{tune}(x, type = c("contour", "perspective"), theta = 60, col = "lightblue", main = NULL, xlab = NULL, ylab = NULL, swapxy = FALSE, transform.x = NULL, transform.y = NULL, transform.z = NULL, color.palette = hsv_palette(), nlevels = 20, ...) } %- maybe also `usage' for other objects documented here. \arguments{ \item{x}{an object of class \code{tune}} \item{type}{choose whether a contour plot or a perspective plot is used if two parameters are to be visualized. Ignored if only one parameter has been tuned.} \item{theta}{angle of azimuthal direction.} \item{col}{the color(s) of the surface facets. Transparent colors are ignored.} \item{main}{main title} \item{xlab, ylab}{titles for the axes. N.B. These must be character strings; expressions are not accepted. Numbers will be coerced to character strings.} \item{swapxy}{if \code{TRUE}, the parameter axes are swaped (only used in case of two parameters).} \item{transform.x, transform.y, transform.z}{functions to transform the parameters (\code{x} and \code{y}) and the error measures (\code{z}). Ignored if \code{NULL}.} \item{color.palette}{color palette used in contour plot.} \item{nlevels}{number of levels used in contour plot.} \item{\dots}{Further graphics parameters.} } \author{ David Meyer (based on C/C++-code by Chih-Chung Chang and Chih-Jen Lin)\cr \email{David.Meyer@R-project.org} } \seealso{\code{\link{tune}}} \examples{ data(iris) obj <- tune.svm(Species~., data = iris, sampling = "fix", gamma = 2^c(-8,-4,0,4), cost = 2^c(-8,-4,-2,0)) plot(obj, transform.x = log2, transform.y = log2) plot(obj, type = "perspective", theta = 120, phi = 45) } \keyword{models}% __ONLY ONE__ keyword per line e1071/man/cshell.Rd0000644000175100001440000000660514246371156013361 0ustar hornikusers\name{cshell} \alias{cshell} \title{Fuzzy C-Shell Clustering} \usage{ cshell(x, centers, iter.max=100, verbose=FALSE, dist="euclidean", method="cshell", m=2, radius = NULL) } \arguments{ \item{x}{The data matrix, were columns correspond to the variables and rows to observations.} \item{centers}{Number of clusters or initial values for cluster centers} \item{iter.max}{Maximum number of iterations} \item{verbose}{If \code{TRUE}, make some output during learning} \item{dist}{Must be one of the following: If \code{"euclidean"}, the mean square error, if \code{"manhattan"}, the mean absolute error is computed. Abbreviations are also accepted.} \item{method}{Currently, only the \code{"cshell"} method; the c-shell fuzzy clustering method} \item{m}{The degree of fuzzification. It is defined for values greater than \emph{1}} \item{radius}{The radius of resulting clusters} } \description{ The \emph{c}-shell clustering algorithm, the shell prototype-based version (ring prototypes) of the fuzzy \emph{k}means clustering method. } \details{ The data given by \code{x} is clustered by the fuzzy \emph{c}-shell algorithm. If \code{centers} is a matrix, its rows are taken as the initial cluster centers. If \code{centers} is an integer, \code{centers} rows of \code{x} are randomly chosen as initial values. The algorithm stops when the maximum number of iterations (given by \code{iter.max}) is reached. If \code{verbose} is \code{TRUE}, it displays for each iteration the number the value of the objective function. If \code{dist} is \code{"euclidean"}, the distance between the cluster center and the data points is the Euclidean distance (ordinary kmeans algorithm). If \code{"manhattan"}, the distance between the cluster center and the data points is the sum of the absolute values of the distances of the coordinates. If \code{method} is \code{"cshell"}, then we have the \emph{c}-shell fuzzy clustering method. The parameters \code{m} defines the degree of fuzzification. It is defined for real values greater than 1 and the bigger it is the more fuzzy the membership values of the clustered data points are. The parameter \code{radius} is by default set to \emph{0.2} for every cluster. } \value{ \code{cshell} returns an object of class \code{"cshell"}. \item{centers}{The final cluster centers.} \item{size}{The number of data points in each cluster.} \item{cluster}{Vector containing the indices of the clusters where the data points are assigned to. The maximum membership value of a point is considered for partitioning it to a cluster.} \item{iter}{The number of iterations performed.} \item{membership}{a matrix with the membership values of the data points to the clusters.} \item{withinerror}{Returns the sum of square distances within the clusters.} \item{call}{Returns a call in which all of the arguments are specified by their names.} } \author{Evgenia Dimitriadou} \references{ Rajesh N. Dave. \emph{Fuzzy Shell-Clustering and Applications to Circle Detection in Digital Images.} Int. J. of General Systems, Vol. \bold{16}, pp. 343-355, 1996. } \examples{ ## a 2-dimensional example x <- rbind(matrix(rnorm(50, sd = 0.3), ncol = 2), matrix(rnorm(50, mean = 1, sd=0.3), ncol = 2)) cl <- cshell(x, 2, 20, verbose = TRUE, method = "cshell", m = 2) print(cl) } \keyword{cluster} e1071/man/element.Rd0000755000175100001440000000064514173734134013537 0ustar hornikusers\name{element} \title{Extract Elements of an Array} \usage{ element(x, i) } \alias{element} \arguments{ \item{x}{Array of arbitrary dimensionality.} \item{i}{Vector of the same length as \code{x} has dimension.} } \description{ Returns the element of \code{x} specified by \code{i}. } \author{Friedrich Leisch} \seealso{\link{Extract}} \examples{ x <- array(1:20, dim=c(2,5,2)) element(x, c(1,4,2)) } \keyword{array} e1071/man/fclustIndex.Rd0000755000175100001440000001753314173734134014402 0ustar hornikusers\name{fclustIndex} \title{Fuzzy Cluster Indexes (Validity/Performance Measures)} \usage{fclustIndex(y, x, index = "all")} \alias{fclustIndex} \arguments{ \item{y}{An object of a fuzzy clustering result of class \code{"fclust"}} \item{x}{Data matrix} \item{index}{The validity measures used: \code{"gath.geva"}, \code{"xie.beni"}, \code{"fukuyama.sugeno"}, \code{"partition.coefficient"}, \code{"partition.entropy"}, \code{"proportion.exponent"}, \code{"separation.index"} and \code{"all"} for all the indexes.}} \description{ Calculates the values of several fuzzy validity measures. The values of the indexes can be independently used in order to evaluate and compare clustering partitions or even to determine the number of clusters existing in a data set.} \details{ The validity measures and a short description of them follows, where \eqn{N} is the number of data points, \eqn{u_{ij}} the values of the membership matrix, \eqn{v_j} the centers of the clusters and \eqn{k} te number of clusters. \describe{ \item{\bold{gath.geva}:}{ Gath and Geva introduced 2 main criteria for comparing and finding optimal partitions based on the heuristics that a better clustering assumes clear separation between the clusters, minimal volume of the clusters and maximal number of data points concentrated in the vicinity of the cluster centroids. These indexes are only for the cmeans clustering algorithm valid. For the first, the ``fuzzy hypervolume'' we have: \eqn{F_{HV}=\sum_{j=1}^{c}{[\det(F_j)]}^{1/2}}, where \eqn{F_j=\frac{\sum_{i=1}^N u_{ij}(x_i-v_j)(x_i-v_j)^T}{\sum_{i=1}^{N}u_{ij}}}, for the case when the defuzzification parameter is 2. For the second, the ``average partition density'': \eqn{D_{PA}=\frac{1}{k}\sum_{j=1}^k\frac{S_j}{{[\det(F_j)]}^{1/2}}}, where \eqn{S_j=\sum_{i=1}^N u_{ij}}. Moreover, the ``partition density'' which expresses the general partition density according to the physical definition of density is calculated by: \eqn{P_D=\frac{S}{F_{HV}}}, where \eqn{S=\sum_{j=1}^k\sum_{i=1}^N u_{ij}}. } \item{\bold{xie.beni}:}{ This index is a function of the data set and the centroids of the clusters. Xie and Beni explained this index by writing it as a ratio of the total variation of the partition and the centroids $(U,V)$ and the separation of the centroids vectors. The minimum values of this index under comparison support the best partitions. \eqn{u_{XB}(U,V;X)=\frac{\sum_{j=1}^k\sum_{i=1}^Nu_{ij}^2{||x_i-v_j||}^2}{N(\min_{j\neq l}\{{||v_j-v_l||}^2\})}} } \item{\bold{fukuyama.sugeno}:}{ This index consists of the difference of two terms, the first combining the fuzziness in the membership matrix with the geometrical compactness of the representation of the data set via the prototypes, and the second the fuzziness in its row of the partition matrix with the distance from the $i$th prototype to the grand mean of the data. The minimum values of this index also propose a good partition. \eqn{u_{FS}(U,V;X)=\sum_{i=1}^{N}\sum_{j=1}^k (u_{ij}^2)^q(||x_i-v_j||^2-||v_j-\bar v||^2)} } \item{\bold{partition.coefficient}:}{ An index which measures the fuzziness of the partition but without considering the data set itself. It is a heuristic measure since it has no connection to any property of the data. The maximum values of it imply a good partition in the meaning of a least fuzzy clustering. \eqn{F(U;k)=\frac{tr (UU^T)}{N}=\frac{}{N}=\frac{||U||^2}{N}} \itemize{ \item \eqn{F(U;k)} shows the fuzziness or the overlap of the partition and depends on \eqn{kN} elements. \item \eqn{1/k\leq F(U;k)\leq 1}, where if \eqn{F(U;k)=1} then \eqn{U} is a hard partition and if \eqn{F(U;k)=1/k} then \eqn{U=[1/k]} is the centroid of the fuzzy partion space \eqn{P_{fk}}. The converse is also valid. } } \item{\bold{partition.entropy}:}{ It is a measure that provides information about the membership matrix without also considering the data itself. The minimum values imply a good partition in the meaning of a more crisp partition. \eqn{H(U;k)=\sum_{i=1}^{N} h(u_i)/N}, where \eqn{h(u)=-\sum_{j=1}^{k} u_j\,\log _a (u_j)} the Shannon's entropy. \itemize{ \item \eqn{H(U;k)} shows the uncertainty of a fuzzy partition and depends also on \eqn{kN} elements. Specifically, \eqn{h(u_i)} is interpreted as the amount of fuzzy information about the membership of \eqn{x_i} in \eqn{k} classes that is retained by column \eqn{u_j}. Thus, at \eqn{U=[1/k]} the most information is withheld since the membership is the fuzziest possible. \item \eqn{0\leq H(U;k)\leq \log_a(k)}, where for \eqn{H(U;k)=0} \eqn{U} is a hard partition and for \eqn{H(U;k)=\log_a(k)} \eqn{U=[1/k]}. } } \item{\bold{proportion.exponent}:}{ It is a measure \eqn{P(U;k)} of fuzziness adept to detect structural variations in the partition matrix as it becomes more fuzzier. A crisp cluster in the partition matrix can drive it to infinity when the partition coefficient and the partition entropy are more sensitive to small changes when approaching a hard partition. Its evaluation does not also involve the data or the algorithm used to partition them and its maximum implies the optimal partition but without knowing what maximum is a statistically significant maximum. \itemize{ \item \eqn{0\leq P(U;k)<\infty}, since the \eqn{[0,1]} values explode to \eqn{[0,\infty)} due to the natural logarithm. Specifically, \eqn{P=0} when and only when \eqn{U=[1/k]}, while \eqn{P\rightarrow\infty} when any column of \eqn{U} is crisp. \item \eqn{P(U;k)} can easily explode and it is good for partitions with large column maximums and at detecting structural variations. } } \item{\bold{separation.index (known as CS Index)}:}{ This index identifies unique cluster structure with well-defined properties that depend on the data and a measure of distance. It answers the question if the clusters are compact and separated, but it rather seems computationally infeasible for big data sets since a distance matrix between all the data membership values has to be calculated. It also presupposes that a hard partition is derived from the fuzzy one.\cr \eqn{D_1(U;k;X,d)=\min_{i+1\,\leq\,l\,\leq\,k-1}\left\{\min_{1\,\leq\,j\,\leq\,k}\left\{\frac{dis(u_j,u_l)}{\max_{1\leq m\leq k}\{dia(u_m)\}}\right\}\right\}}, where \eqn{dia} is the diameter of the subset, \eqn{dis} the distance of two subsets, and \eqn{d} a metric. \eqn{U} is a CS partition of \eqn{X} \eqn{\Leftrightarrow D_1>1}. When this holds then \eqn{U} is unique. } } } \value{ Returns a vector with the validity measures values. } \references{ James C. Bezdek, \emph{Pattern Recognition with Fuzzy Objective Function Algorithms}, Plenum Press, 1981, NY.\cr L. X. Xie and G. Beni, \emph{Validity measure for fuzzy clustering}, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. \bold{3}, n. 8, p. 841-847, 1991.\cr I. Gath and A. B. Geva, \emph{Unsupervised Optimal Fuzzy Clustering}, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol. \bold{11}, n. 7, p. 773-781, 1989.\cr Y. Fukuyama and M. Sugeno, \emph{A new method of choosing the number of clusters for the fuzzy $c$-means method}, Proc. 5th Fuzzy Syst. Symp., p. 247-250, 1989 (in japanese).} \author{Evgenia Dimitriadou} \seealso{\code{\link{cmeans}}} \examples{ # a 2-dimensional example x<-rbind(matrix(rnorm(100,sd=0.3),ncol=2), matrix(rnorm(100,mean=1,sd=0.3),ncol=2)) cl<-cmeans(x,2,20,verbose=TRUE,method="cmeans") resultindexes <- fclustIndex(cl,x, index="all") resultindexes } \keyword{cluster} e1071/man/bincombinations.Rd0000755000175100001440000000052314173734133015256 0ustar hornikusers\name{bincombinations} \title{Binary Combinations} \usage{ bincombinations(p) } \alias{bincombinations} \arguments{ \item{p}{Length of binary vectors} } \description{ Returns a matrix containing the \eqn{2^p} vectors of length \code{p}. } \author{Friedrich Leisch} \examples{ bincombinations(2) bincombinations(3) } \keyword{utilities} e1071/man/permutations.Rd0000755000175100001440000000054414173734134014636 0ustar hornikusers\name{permutations} \alias{permutations} \title{All Permutations of Integers 1:n} \description{ Returns a matrix containing all permutations of the integers \code{1:n} (one permutation per row). } \usage{ permutations(n) } \arguments{ \item{n}{Number of element to permute.} } \author{Friedrich Leisch} \examples{ permutations(3) } \keyword{datagen} e1071/man/boxplot.bclust.Rd0000755000175100001440000000214514173734133015064 0ustar hornikusers\name{boxplot.bclust} \alias{boxplot.bclust} \title{Boxplot of Cluster Profiles} \usage{ \method{boxplot}{bclust}(x, n=nrow(x$centers), bycluster=TRUE, main=deparse(substitute(x)), oneplot=TRUE, which=1:n, ...) } \arguments{ \item{x}{Clustering result, object of class \code{"bclust"}.}% \item{n}{Number of clusters to plot, by default the number of clusters used in the call of \code{\link{bclust}}.} \item{bycluster}{If \code{TRUE} (default), a boxplot for each cluster is plotted. If \code{FALSE}, a boxplot for each variable is plotted.} \item{main}{Main title of the plot, by default the name of the cluster object.} \item{oneplot}{If \code{TRUE}, all boxplots appear on one screen (using an appropriate rectangular layout).} \item{which}{Number of clusters which should be plotted, default is all clusters.} \item{...}{Additional arguments for \code{\link{boxplot}}.} } \description{ Makes boxplots of the results of a bagged clustering run. } \author{Friedrich Leisch} \keyword{hplot} \examples{ data(iris) bc1 <- bclust(iris[,1:4], 3, base.centers=5) boxplot(bc1) } e1071/man/stft.Rd0000755000175100001440000000317214173734134013064 0ustar hornikusers\name{stft} \title{Computes the Short Time Fourier Transform of a Vector} \usage{stft(X, win=min(80,floor(length(X)/10)), inc=min(24, floor(length(X)/30)), coef=64, wtype="hanning.window")} \alias{stft} \arguments{ \item{X}{The vector from which the stft is computed.} \item{win}{Length of the window. For long vectors the default window size is 80, for short vectors the window size is chosen so that 10 windows fit in the vector.} \item{inc}{Increment by which the window is shifted. For long vectors the default increment is 24, for short vectors the increment is chosen so that 30 increments fit in the vector.} \item{coef}{Number of Fourier coefficients} \item{wtype}{Type of window used} } \description{This function computes the Short Time Fourier Transform of a given vector \code{X}. First, time-slices of length \code{win} are extracted from the vector. The shift of one time-slice to the next one is given by \code{inc}. The values of these time-slices are smoothed by mulitplying them with a window function specified in \code{wtype}. For the thus obtained windows, the Fast Fourier Transform is computed.} \value{Object of type stft. Contains the values of the stft and information about the parameters. \item{values}{A matrix containing the results of the stft. Each row of the matrix contains the \code{coef} Fourier coefficients of one window.} \item{windowsize}{The value of the parameter \code{win}} \item{increment}{The value of the parameter \code{inc}} \item{windowtype}{The value of the parameter \code{wtype}} } \author{Andreas Weingessel} \seealso{plot.stft} \examples{x<-rnorm(500) y<-stft(x) plot(y) } \keyword{ts} e1071/man/matchControls.Rd0000755000175100001440000000545014173734134014725 0ustar hornikusers\name{matchControls} \alias{matchControls} \title{Find Matched Control Group} \usage{ matchControls(formula, data = list(), subset, contlabel = "con", caselabel = NULL, dogrep = TRUE, replace = FALSE) } \arguments{ \item{formula}{A formula indicating cases, controls and the variables to be matched. Details are described below.} \item{data}{an optional data frame containing the variables in the model. By default the variables are taken from the environment which \code{matchControls} is called from.} \item{subset}{an optional vector specifying a subset of observations to be used in the matching process.} \item{contlabel}{A string giving the label of the control group.} \item{caselabel}{A string giving the labels of the cases.} \item{dogrep}{If \code{TRUE}, then \code{contlabel} and \code{contlabel} are matched using \code{\link{grep}}, else string comparison (exact equality) is used.} \item{replace}{If \code{FALSE}, then every control is used only once.} } \description{ Finds controls matching the cases as good as possible. } \details{ The left hand side of the \code{formula} must be a factor determining whether an observation belongs to the case or the control group. By default, all observations where a grep of \code{contlabel} matches, are used as possible controls, the rest is taken as cases. If \code{caselabel} is given, then only those observations are taken as cases. If \code{dogrep = TRUE}, then both \code{contlabel} and \code{caselabel} can be regular expressions. The right hand side of the \code{formula} gives the variables that should be matched. The matching is done using the \code{\link{daisy}} distance from the \code{cluster} package, i.e., a model frame is built from the formula and used as input for \code{\link{daisy}}. For each case, the nearest control is selected. If \code{replace = FALSE}, each control is used only once. } \value{ Returns a list with components \item{cases}{Row names of cases.} \item{controls}{Row names of matched controls.} \item{factor}{A factor with 2 levels indicating cases and controls (the rest is set to \code{NA}.} } \author{Friedrich Leisch} \examples{ Age.case <- 40 + 5 * rnorm(50) Age.cont <- 45 + 10 * rnorm(150) Age <- c(Age.case, Age.cont) Sex.case <- sample(c("M", "F"), 50, prob = c(.4, .6), replace = TRUE) Sex.cont <- sample(c("M", "F"), 150, prob = c(.6, .4), replace = TRUE) Sex <- as.factor(c(Sex.case, Sex.cont)) casecont <- as.factor(c(rep("case", 50), rep("cont", 150))) ## now look at the group properties: boxplot(Age ~ casecont) barplot(table(Sex, casecont), beside = TRUE) m <- matchControls(casecont ~ Sex + Age) ## properties of the new groups: boxplot(Age ~ m$factor) barplot(table(Sex, m$factor)) } \keyword{manip} e1071/man/interpolate.Rd0000755000175100001440000000214214173734134014426 0ustar hornikusers\name{interpolate} \title{Interpolate Values of Array} \usage{ interpolate(x, a, adims=lapply(dimnames(a), as.numeric), method="linear") } \alias{interpolate} \arguments{ \item{x}{Matrix of values at which interpolation shall take place.} \item{a}{Array of arbitrary dimension.} \item{adims}{List of the same structure as \code{dimnames(a)}.} \item{method}{Interpolation method, one of \code{"linear"} or \code{"constant"}.} } \description{ For each row in matrix \code{x}, the hypercube of \code{a} containing this point is searched. The corners of the hypercube are linearly interpolated. By default, \code{dimnames(a)} is taken to contain the coordinate values for each point in \code{a}. This can be overridden using \code{adims}. If \code{method=="constant"}, the value of the ``lower left'' corner of the hypercube is returned. } \author{Friedrich Leisch} \seealso{\code{\link{approx}}, \code{\link{spline}}} \examples{ x <- seq(0,3,0.2) z <- outer(x,x, function(x,y) sin(x*y)) dimnames(z) <- list(x,x) sin(1.1*2.1) interpolate(c(1.1, 2.1),z) } \keyword{arith} \keyword{multivariate} e1071/man/rwiener.Rd0000755000175100001440000000075714173734134013565 0ustar hornikusers\name{rwiener} \alias{rwiener} \title{Simulation of Wiener Process} \usage{ rwiener(end = 1, frequency = 1000) } \arguments{ \item{end}{the time of the last observation.} \item{frequency}{the number of observations per unit of time.} } \description{ \code{rwiener} returns a time series containing a simulated realization of the Wiener process on the interval [0,\code{end}] } \examples{ # simulate a Wiener process on [0,1] and plot it x <- rwiener() plot(x,type="l") } \keyword{distribution} e1071/man/shortestPaths.Rd0000755000175100001440000000422014173734134014752 0ustar hornikusers\name{allShortestPaths} \alias{allShortestPaths} \alias{extractPath} \title{Find Shortest Paths Between All Nodes in a Directed Graph} \description{ \code{allShortestPaths} finds all shortest paths in a directed (or undirected) graph using Floyd's algorithm. \code{extractPath} can be used to actually extract the path between a given pair of nodes. } \usage{ allShortestPaths(x) extractPath(obj, start, end) } \arguments{ \item{x}{matrix or distance object} \item{obj}{return value of \code{allShortestPaths}} \item{start}{integer, starting point of path} \item{end}{integer, end point of path} } \details{ If \code{x} is a matrix, then \code{x[i,j]} has to be the length of the direct path from point \code{i} to point \code{j}. If no direct connection from point \code{i} to point \code{j} exist, then \code{x[i,j]} should be either \code{NA} or \code{Inf}. Note that the graph can be directed, hence \code{x[i,j]} need not be the same as \code{x[j,i]}. The main diagonal of \code{x} is ignored. Alternatively, \code{x} can be a distance object as returned by \code{\link{dist}} (corresponding to an undirected graph). } \value{ \code{allShortestPaths} returns a list with components \item{length}{A matrix with the total lengths of the shortest path between each pair of points.} \item{middlePoints}{A matrix giving a point in the middle of each shortest path (or 0 if the direct connection is the shortest path), this is mainly used as input for \code{extractPath}.} \code{extractPath} returns a vector of node numbers giving with the shortest path between two points. } \references{Kumar, V., Grama, A., Gupta, A. and Karypis, G. Introduction to Parallel Programming - Design and Analysis of Algorithms, Benjamin Cummings Publishing, 1994, ISBN 0-8053-3170-0} \author{Friedrich Leisch} \examples{ ## build a graph with 5 nodes x <- matrix(NA, 5, 5) diag(x) <- 0 x[1,2] <- 30; x[1,3] <- 10 x[2,4] <- 70; x[2,5] <- 40 x[3,4] <- 50; x[3,5] <- 20 x[4,5] <- 60 x[5,4] <- 10 print(x) ## compute all path lengths z <- allShortestPaths(x) print(z) ## the following should give 1 -> 3 -> 5 -> 4 extractPath(z, 1, 4) } \keyword{optimize} e1071/man/tune.wrapper.Rd0000644000175100001440000000512114324555763014536 0ustar hornikusers\name{tune.wrapper} \alias{tune.wrapper} \alias{tune.rpart} \alias{best.rpart} \alias{tune.svm} \alias{best.svm} \alias{tune.nnet} \alias{best.nnet} \alias{tune.randomForest} \alias{best.randomForest} \alias{tune.gknn} \alias{best.gknn} \alias{tune.knn} \title{Convenience Tuning Wrapper Functions} \description{ Convenience tuning wrapper functions, using \code{tune}. } \usage{ tune.svm(x, y = NULL, data = NULL, degree = NULL, gamma = NULL, coef0 = NULL, cost = NULL, nu = NULL, class.weights = NULL, epsilon = NULL, ...) best.svm(x, tunecontrol = tune.control(), ...) tune.nnet(x, y = NULL, data = NULL, size = NULL, decay = NULL, trace = FALSE, tunecontrol = tune.control(nrepeat = 5), ...) best.nnet(x, tunecontrol = tune.control(nrepeat = 5), ...) tune.rpart(formula, data, na.action = na.omit, minsplit = NULL, minbucket = NULL, cp = NULL, maxcompete = NULL, maxsurrogate = NULL, usesurrogate = NULL, xval = NULL, surrogatestyle = NULL, maxdepth = NULL, predict.func = NULL, ...) best.rpart(formula, tunecontrol = tune.control(), ...) tune.randomForest(x, y = NULL, data = NULL, nodesize = NULL, mtry = NULL, ntree = NULL, ...) best.randomForest(x, tunecontrol = tune.control(), ...) tune.gknn(x, y = NULL, data = NULL, k = NULL, ...) best.gknn(x, tunecontrol = tune.control(), ...) tune.knn(x, y, k = NULL, l = NULL, ...) } \arguments{ \item{formula, x, y, data}{formula and data arguments of function to be tuned.} \item{predict.func}{predicting function.} \item{na.action}{function handling missingness.} \item{minsplit, minbucket, cp, maxcompete, maxsurrogate, usesurrogate, xval, surrogatestyle, maxdepth}{\code{rpart} parameters.} \item{degree, gamma, coef0, cost, nu, class.weights, epsilon}{\code{svm} parameters.} \item{k, l}{\code{(g)knn} parameters.} \item{mtry, nodesize, ntree}{\code{randomForest} parameters.} \item{size, decay, trace}{parameters passed to \code{nnet}.} \item{tunecontrol}{object of class \code{"tune.control"} containing tuning parameters.} \item{\dots}{Further parameters passed to \code{tune}.} } \value{ \code{tune.foo()} returns a tuning object including the best parameter set obtained by optimizing over the specified parameter vectors. \code{best.foo()} directly returns the best model, i.e. the fit of a new model using the optimal parameters found by \code{tune.foo}. } \details{For examples, see the help page of \code{tune()}.} \author{ David Meyer\cr \email{David.Meyer@R-project.org} } \seealso{\code{\link{tune}}} \keyword{models} e1071/man/e1071-deprecated.Rd0000755000175100001440000000051214173734134014732 0ustar hornikusers\name{e1071-deprecated} \alias{e1071-deprecated} \title{Deprecated Functions in Package e1071} \description{ These functions are provided for compatibility with older versions of package \pkg{e1071} only, and may be defunct as soon as of the next release. } %\usage{ %} \seealso{ \code{\link{Deprecated}} } \keyword{misc} e1071/man/plot.stft.Rd0000755000175100001440000000160414173734134014037 0ustar hornikusers\name{plot.stft} \alias{plot.stft} \title{Plot Short Time Fourier Transforms} \description{ An object of class \code{"stft"} is plotted as a gray scale image. The x-axis corresponds to time, the y-axis to frequency. If the default colormap is used, dark regions in the plot correspond to high values at the particular time/frequency location. } \usage{ \method{plot}{stft}(x, col = gray(63:0/63), \dots) } \arguments{ \item{x}{An object of class \code{"stft"} as obtained by the function \code{stft}.} \item{col}{An optional colormap. By default 64 gray values are used, where white corresponds to the minimum value and black to the maximum.} \item{\dots}{further arguments to be passed to or from methods.} } \value{No return value. This function is only for plotting.} \author{Andreas Weingessel} \seealso{stft} \examples{x<-rnorm(500) y<-stft(x) plot(y) } \keyword{ts} e1071/man/Discrete.Rd0000755000175100001440000000302514173734133013642 0ustar hornikusers\name{Discrete} \alias{ddiscrete} \alias{pdiscrete} \alias{qdiscrete} \alias{rdiscrete} \title{Discrete Distribution} \description{ These functions provide information about the discrete distribution where the probability of the elements of \code{values} is proportional to the values given in \code{probs}, which are normalized to sum up to 1. \code{ddiscrete} gives the density, \code{pdiscrete} gives the distribution function, \code{qdiscrete} gives the quantile function and \code{rdiscrete} generates random deviates. } \usage{ ddiscrete(x, probs, values = 1:length(probs)) pdiscrete(q, probs, values = 1:length(probs)) qdiscrete(p, probs, values = 1:length(probs)) rdiscrete(n, probs, values = 1:length(probs), ...) } \arguments{ \item{x,q}{vector or array of quantiles.} \item{p}{vector or array of probabilities.} \item{n}{number of observations.} \item{probs}{probabilities of the distribution.} \item{values}{values of the distribution.} \item{...}{ignored (only there for backwards compatibility)} } \details{ The random number generator is simply a wrapper for \code{\link{sample}} and provided for backwards compatibility only. } \author{Andreas Weingessel and Friedrich Leisch} \examples{ ## a vector of length 30 whose elements are 1 with probability 0.2 ## and 2 with probability 0.8. rdiscrete (30, c(0.2, 0.8)) ## a vector of length 100 whose elements are A, B, C, D. ## The probabilities of the four values have the relation 1:2:3:3 rdiscrete (100, c(1,2,3,3), c("A","B","C","D")) } \keyword{distribution} e1071/DESCRIPTION0000644000175100001440000000360514534036525012546 0ustar hornikusersPackage: e1071 Version: 1.7-14 Title: Misc Functions of the Department of Statistics, Probability Theory Group (Formerly: E1071), TU Wien Imports: graphics, grDevices, class, stats, methods, utils, proxy Suggests: cluster, mlbench, nnet, randomForest, rpart, SparseM, xtable, Matrix, MASS, slam Authors@R: c(person(given = "David", family = "Meyer", role = c("aut", "cre"), email = "David.Meyer@R-project.org", comment = c(ORCID = "0000-0002-5196-3048")), person(given = "Evgenia", family = "Dimitriadou", role = c("aut","cph")), person(given = "Kurt", family = "Hornik", role = "aut", email = "Kurt.Hornik@R-project.org", comment = c(ORCID = "0000-0003-4198-9911")), person(given = "Andreas", family = "Weingessel", role = "aut"), person(given = "Friedrich", family = "Leisch", role = "aut"), person(given = "Chih-Chung", family = "Chang", role = c("ctb","cph"), comment = "libsvm C++-code"), person(given = "Chih-Chen", family = "Lin", role = c("ctb","cph"), comment = "libsvm C++-code")) Description: Functions for latent class analysis, short time Fourier transform, fuzzy clustering, support vector machines, shortest path computation, bagged clustering, naive Bayes classifier, generalized k-nearest neighbour ... License: GPL-2 | GPL-3 LazyLoad: yes NeedsCompilation: yes Packaged: 2023-12-05 17:29:44 UTC; meyer Author: David Meyer [aut, cre] (), Evgenia Dimitriadou [aut, cph], Kurt Hornik [aut] (), Andreas Weingessel [aut], Friedrich Leisch [aut], Chih-Chung Chang [ctb, cph] (libsvm C++-code), Chih-Chen Lin [ctb, cph] (libsvm C++-code) Maintainer: David Meyer Repository: CRAN Date/Publication: 2023-12-06 09:22:29 UTC e1071/build/0000755000175100001440000000000014533657007012136 5ustar hornikuserse1071/build/vignette.rds0000644000175100001440000000053014533657007014473 0ustar hornikusersQ=O0MЈHX=ЈN쨪XΥؑm NiH}߽Ns3Gol wFf& xn kY&&HqTDܕ(-Had@װD뛩tnrWi,V⇌16.._,>h8#΅D-6аHz?vс͞b1#$.MaG2$3u,U r.zSym_[ݖ'igh{WhH3\Ȩh$ENKRŶhgFgt~X߲Ue1071/tests/0000755000175100001440000000000012212345174012170 5ustar hornikuserse1071/tests/clustering.R0000755000175100001440000000033314173734135014503 0ustar hornikusers## cmeans clustering should also work on data frames library(e1071) data(iris) set.seed(123) cm1 <- cmeans(iris[,1:4], 10) bc1 <- bclust(iris[,1:4], 3, base.centers=20,iter.base=50, base.method="cmeans") e1071/src/0000755000175100001440000000000014533657010011620 5ustar hornikuserse1071/src/floyd.c0000755000175100001440000000140314173734135013106 0ustar hornikusersint e1071_floyd(int *n, double *A, double *C, int *P) /* this function takes an nxn matrix C of edge costs and produces */ /* an nxn matrix A of lengths of shortest paths, and an nxn */ /* matrix P giving a point in the middle of each shortest path */ { int i,j,k; for (i=0; i<*n; i++) for (j=0; j<*n; j++) { A[i + *n * j] = C[i + *n * j]; P[i + *n * j] = -1; } for (i=0; i<*n; i++) A[i + *n * i] = 0; /* no self cycle */ for (k=0; k<*n; k++) for (i=0; i<*n; i++) for (j=0; j<*n; j++) if (A[i + *n * k]+A[k + *n * j] < A[i + *n * j]) { A[i + *n * j] = A[i + *n * k] + A[k + *n * j]; P[i + *n * j] = k; /* k is included in shortest path */ } return 0; } e1071/src/init.c0000755000175100001440000000627514173734135012750 0ustar hornikusers #include #include #include void cmeans(double *x, int *nr_x, int *nc, double *p, int *nr_p, double *w, double *f, int *dist, int *itermax, double *reltol, int *verbose, double *u, double *ermin, int *iter); int cshell(int *xrows, int *xcols, double *x, int *ncenters, double *centers, int *itermax, int *iter, int *verbose, int *dist, double *U, double *UANT, double *f, double *ermin, double *radius, int *flag); int e1071_floyd(int *n, double *A, double *C, int *P); void ufcl(double *x, int *nr_x, int *nc, double *p, int *nr_p, double *w, double *f, int *dist, int *itermax, double *reltol, int *verbose, double *rate_par, double *u, double *ermin, int *iter); void svmtrain (double *x, int *r, int *c, double *y, int *rowindex, int *colindex, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, double *cost, double *nu, int *weightlabels, double *weights, int *nweights, double *cache, double *tolerance, double *epsilon, int *shrinking, int *cross, int *sparse, int *probability, int *nclasses, int *nr, int *index, int *labels, int *nSV, double *rho, double *coefs, double *sigma, double *probA, double *probB, double *cresults, double *ctotal1, double *ctotal2, char **error); void svmpredict (int *decisionvalues, int *probability, double *v, int *r, int *c, int *rowindex, int *colindex, double *coefs, double *rho, int *compprob, double *probA, double *probB, int *nclasses, int *totnSV, int *labels, int *nSV, int *sparsemodel, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, double *x, int *xr, int *xrowindex, int *xcolindex, int *sparsex, double *ret, double *dec, double *prob); void svmwrite (double *v, int *r, int *c, int *rowindex, int *colindex, double *coefs, double *rho, int *compprob, double *probA, double *probB, int *nclasses, int *totnSV, int *labels, int *nSV, int *sparsemodel, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, char **filename); static const R_CMethodDef CEntries[] = { {"cmeans", (DL_FUNC) &cmeans, 14}, {"cshell", (DL_FUNC) &cshell, 15}, {"e1071_floyd", (DL_FUNC) &e1071_floyd, 4}, {"svmpredict", (DL_FUNC) &svmpredict, 30}, {"svmtrain", (DL_FUNC) &svmtrain, 37}, {"svmwrite", (DL_FUNC) &svmwrite, 21}, {"ufcl", (DL_FUNC) &ufcl, 15}, {NULL, NULL, 0} }; void R_init_e1071(DllInfo *dll) { R_registerRoutines(dll, CEntries, NULL, NULL, NULL); R_useDynamicSymbols(dll, FALSE); } e1071/src/svm.cpp0000755000175100001440000020001614533641171013134 0ustar hornikusers#include #include #include #include #include #include #include #include #include #include #include #include "svm.h" int libsvm_version = LIBSVM_VERSION; typedef float Qfloat; typedef signed char schar; #ifndef min template static inline T min(T x,T y) { return (x static inline T max(T x,T y) { return (x>y)?x:y; } #endif template static inline void swap(T& x, T& y) { T t=x; x=y; y=t; } template static inline void clone(T*& dst, S* src, int n) { dst = new T[n]; memcpy((void *)dst,(void *)src,sizeof(T)*n); } static inline double powi(double base, int times) { double tmp = base, ret = 1.0; for(int t=times; t>0; t/=2) { if(t%2==1) ret*=tmp; tmp = tmp * tmp; } return ret; } #define INF HUGE_VAL #define TAU 1e-12 #define Malloc(type,n) (type *)malloc((n)*sizeof(type)) static void print_string_stdout(const char *s) { /* fputs(s,stdout); fflush(stdout); */ Rprintf("%s", s); } static void (*svm_print_string) (const char *) = &print_string_stdout; #if 0 static void info(const char *fmt,...) { char buf[BUFSIZ]; va_list ap; va_start(ap,fmt); vsprintf(buf,fmt,ap); va_end(ap); (*svm_print_string)(buf); } #else static void info(const char *fmt,...) {} #endif // // Kernel Cache // // l is the number of total data items // size is the cache size limit in bytes // class Cache { public: Cache(int l,long int size); ~Cache(); // request data [0,len) // return some position p where [p,len) need to be filled // (p >= len if nothing needs to be filled) int get_data(const int index, Qfloat **data, int len); void swap_index(int i, int j); private: int l; long int size; struct head_t { head_t *prev, *next; // a circular list Qfloat *data; int len; // data[0,len) is cached in this entry }; head_t *head; head_t lru_head; void lru_delete(head_t *h); void lru_insert(head_t *h); }; Cache::Cache(int l_,long int size_):l(l_),size(size_) { head = (head_t *)calloc(l,sizeof(head_t)); // initialized to 0 size /= sizeof(Qfloat); size -= l * sizeof(head_t) / sizeof(Qfloat); size = max(size, 2 * (long int) l); // cache must be large enough for two columns lru_head.next = lru_head.prev = &lru_head; } Cache::~Cache() { for(head_t *h = lru_head.next; h != &lru_head; h=h->next) free(h->data); free(head); } void Cache::lru_delete(head_t *h) { // delete from current location h->prev->next = h->next; h->next->prev = h->prev; } void Cache::lru_insert(head_t *h) { // insert to last position h->next = &lru_head; h->prev = lru_head.prev; h->prev->next = h; h->next->prev = h; } int Cache::get_data(const int index, Qfloat **data, int len) { head_t *h = &head[index]; if(h->len) lru_delete(h); int more = len - h->len; if(more > 0) { // free old space while(size < more) { head_t *old = lru_head.next; lru_delete(old); free(old->data); size += old->len; old->data = 0; old->len = 0; } // allocate new space h->data = (Qfloat *)realloc(h->data,sizeof(Qfloat)*len); size -= more; swap(h->len,len); } lru_insert(h); *data = h->data; return len; } void Cache::swap_index(int i, int j) { if(i==j) return; if(head[i].len) lru_delete(&head[i]); if(head[j].len) lru_delete(&head[j]); swap(head[i].data,head[j].data); swap(head[i].len,head[j].len); if(head[i].len) lru_insert(&head[i]); if(head[j].len) lru_insert(&head[j]); if(i>j) swap(i,j); for(head_t *h = lru_head.next; h!=&lru_head; h=h->next) { if(h->len > i) { if(h->len > j) swap(h->data[i],h->data[j]); else { // give up lru_delete(h); free(h->data); size += h->len; h->data = 0; h->len = 0; } } } } // // Kernel evaluation // // the static method k_function is for doing single kernel evaluation // the constructor of Kernel prepares to calculate the l*l kernel matrix // the member function get_Q is for getting one column from the Q Matrix // class QMatrix { public: virtual Qfloat *get_Q(int column, int len) const = 0; virtual double *get_QD() const = 0; virtual void swap_index(int i, int j) const = 0; virtual ~QMatrix() {} }; class Kernel: public QMatrix { public: Kernel(int l, svm_node * const * x, const svm_parameter& param); virtual ~Kernel(); static double k_function(const svm_node *x, const svm_node *y, const svm_parameter& param); virtual Qfloat *get_Q(int column, int len) const = 0; virtual double *get_QD() const = 0; virtual void swap_index(int i, int j) const // no so const... { swap(x[i],x[j]); if(x_square) swap(x_square[i],x_square[j]); } protected: double (Kernel::*kernel_function)(int i, int j) const; private: const svm_node **x; double *x_square; // svm_parameter const int kernel_type; const int degree; const double gamma; const double coef0; static double dot(const svm_node *px, const svm_node *py); double kernel_linear(int i, int j) const { return dot(x[i],x[j]); } double kernel_poly(int i, int j) const { return powi(gamma*dot(x[i],x[j])+coef0,degree); } double kernel_rbf(int i, int j) const { return exp(-gamma*(x_square[i]+x_square[j]-2*dot(x[i],x[j]))); } double kernel_sigmoid(int i, int j) const { return tanh(gamma*dot(x[i],x[j])+coef0); } double kernel_precomputed(int i, int j) const { return x[i][(int)(x[j][0].value)].value; } }; Kernel::Kernel(int l, svm_node * const * x_, const svm_parameter& param) :kernel_type(param.kernel_type), degree(param.degree), gamma(param.gamma), coef0(param.coef0) { switch(kernel_type) { case LINEAR: kernel_function = &Kernel::kernel_linear; break; case POLY: kernel_function = &Kernel::kernel_poly; break; case RBF: kernel_function = &Kernel::kernel_rbf; break; case SIGMOID: kernel_function = &Kernel::kernel_sigmoid; break; case PRECOMPUTED: kernel_function = &Kernel::kernel_precomputed; break; } clone(x,x_,l); if(kernel_type == RBF) { x_square = new double[l]; for(int i=0;iindex != -1 && py->index != -1) { if(px->index == py->index) { sum += px->value * py->value; ++px; ++py; } else { if(px->index > py->index) ++py; else ++px; } } return sum; } double Kernel::k_function(const svm_node *x, const svm_node *y, const svm_parameter& param) { switch(param.kernel_type) { case LINEAR: return dot(x,y); case POLY: return powi(param.gamma*dot(x,y)+param.coef0,param.degree); case RBF: { double sum = 0; while(x->index != -1 && y->index !=-1) { if(x->index == y->index) { double d = x->value - y->value; sum += d*d; ++x; ++y; } else { if(x->index > y->index) { sum += y->value * y->value; ++y; } else { sum += x->value * x->value; ++x; } } } while(x->index != -1) { sum += x->value * x->value; ++x; } while(y->index != -1) { sum += y->value * y->value; ++y; } return exp(-param.gamma*sum); } case SIGMOID: return tanh(param.gamma*dot(x,y)+param.coef0); case PRECOMPUTED: //x: test (validation), y: SV return x[(int)(y->value)].value; default: return 0; // Unreachable } } // An SMO algorithm in Fan et al., JMLR 6(2005), p. 1889--1918 // Solves: // // min 0.5(\alpha^T Q \alpha) + p^T \alpha // // y^T \alpha = \delta // y_i = +1 or -1 // 0 <= alpha_i <= Cp for y_i = 1 // 0 <= alpha_i <= Cn for y_i = -1 // // Given: // // Q, p, y, Cp, Cn, and an initial feasible point \alpha // l is the size of vectors and matrices // eps is the stopping tolerance // // solution will be put in \alpha, objective value will be put in obj // class Solver { public: Solver() {}; virtual ~Solver() {}; struct SolutionInfo { double obj; double rho; double upper_bound_p; double upper_bound_n; double r; // for Solver_NU }; void Solve(int l, const QMatrix& Q, const double *p_, const schar *y_, double *alpha_, double Cp, double Cn, double eps, SolutionInfo* si, int shrinking); protected: int active_size; schar *y; double *G; // gradient of objective function enum { LOWER_BOUND, UPPER_BOUND, FREE }; char *alpha_status; // LOWER_BOUND, UPPER_BOUND, FREE double *alpha; const QMatrix *Q; const double *QD; double eps; double Cp,Cn; double *p; int *active_set; double *G_bar; // gradient, if we treat free variables as 0 int l; bool unshrink; // XXX double get_C(int i) { return (y[i] > 0)? Cp : Cn; } void update_alpha_status(int i) { if(alpha[i] >= get_C(i)) alpha_status[i] = UPPER_BOUND; else if(alpha[i] <= 0) alpha_status[i] = LOWER_BOUND; else alpha_status[i] = FREE; } bool is_upper_bound(int i) { return alpha_status[i] == UPPER_BOUND; } bool is_lower_bound(int i) { return alpha_status[i] == LOWER_BOUND; } bool is_free(int i) { return alpha_status[i] == FREE; } void swap_index(int i, int j); void reconstruct_gradient(); virtual int select_working_set(int &i, int &j); virtual double calculate_rho(); virtual void do_shrinking(); private: bool be_shrunk(int i, double Gmax1, double Gmax2); }; void Solver::swap_index(int i, int j) { Q->swap_index(i,j); swap(y[i],y[j]); swap(G[i],G[j]); swap(alpha_status[i],alpha_status[j]); swap(alpha[i],alpha[j]); swap(p[i],p[j]); swap(active_set[i],active_set[j]); swap(G_bar[i],G_bar[j]); } void Solver::reconstruct_gradient() { // reconstruct inactive elements of G from G_bar and free variables if(active_size == l) return; int i,j; int nr_free = 0; for(j=active_size;j 2*active_size*(l-active_size)) { for(i=active_size;iget_Q(i,active_size); for(j=0;jget_Q(i,l); double alpha_i = alpha[i]; for(j=active_size;jl = l; this->Q = &Q; QD=Q.get_QD(); clone(p, p_,l); clone(y, y_,l); clone(alpha,alpha_,l); this->Cp = Cp; this->Cn = Cn; this->eps = eps; unshrink = false; // initialize alpha_status { alpha_status = new char[l]; for(int i=0;iINT_MAX/100 ? INT_MAX : 100*l); int counter = min(l,1000)+1; while(iter < max_iter) { // show progress and do shrinking if(--counter == 0) { counter = min(l,1000); if(shrinking) do_shrinking(); info("."); } int i,j; if(select_working_set(i,j)!=0) { // reconstruct the whole gradient reconstruct_gradient(); // reset active set size and check active_size = l; info("*"); if(select_working_set(i,j)!=0) break; else counter = 1; // do shrinking next iteration } ++iter; // update alpha[i] and alpha[j], handle bounds carefully const Qfloat *Q_i = Q.get_Q(i,active_size); const Qfloat *Q_j = Q.get_Q(j,active_size); double C_i = get_C(i); double C_j = get_C(j); double old_alpha_i = alpha[i]; double old_alpha_j = alpha[j]; if(y[i]!=y[j]) { double quad_coef = QD[i]+QD[j]+2*Q_i[j]; if (quad_coef <= 0) quad_coef = TAU; double delta = (-G[i]-G[j])/quad_coef; double diff = alpha[i] - alpha[j]; alpha[i] += delta; alpha[j] += delta; if(diff > 0) { if(alpha[j] < 0) { alpha[j] = 0; alpha[i] = diff; } } else { if(alpha[i] < 0) { alpha[i] = 0; alpha[j] = -diff; } } if(diff > C_i - C_j) { if(alpha[i] > C_i) { alpha[i] = C_i; alpha[j] = C_i - diff; } } else { if(alpha[j] > C_j) { alpha[j] = C_j; alpha[i] = C_j + diff; } } } else { double quad_coef = QD[i]+QD[j]-2*Q_i[j]; if (quad_coef <= 0) quad_coef = TAU; double delta = (G[i]-G[j])/quad_coef; double sum = alpha[i] + alpha[j]; alpha[i] -= delta; alpha[j] += delta; if(sum > C_i) { if(alpha[i] > C_i) { alpha[i] = C_i; alpha[j] = sum - C_i; } } else { if(alpha[j] < 0) { alpha[j] = 0; alpha[i] = sum; } } if(sum > C_j) { if(alpha[j] > C_j) { alpha[j] = C_j; alpha[i] = sum - C_j; } } else { if(alpha[i] < 0) { alpha[i] = 0; alpha[j] = sum; } } } // update G double delta_alpha_i = alpha[i] - old_alpha_i; double delta_alpha_j = alpha[j] - old_alpha_j; for(int k=0;k= max_iter) { if(active_size < l) { // reconstruct the whole gradient to calculate objective value reconstruct_gradient(); active_size = l; info("*"); } REprintf("\nWARNING: reaching max number of iterations\n"); } // calculate rho si->rho = calculate_rho(); // calculate objective value { double v = 0; int i; for(i=0;iobj = v/2; } // put back the solution { for(int i=0;iupper_bound_p = Cp; si->upper_bound_n = Cn; info("\noptimization finished, #iter = %d\n",iter); delete[] p; delete[] y; delete[] alpha; delete[] alpha_status; delete[] active_set; delete[] G; delete[] G_bar; } // return 1 if already optimal, return 0 otherwise int Solver::select_working_set(int &out_i, int &out_j) { // return i,j such that // i: maximizes -y_i * grad(f)_i, i in I_up(\alpha) // j: minimizes the decrease of obj value // (if quadratic coefficeint <= 0, replace it with tau) // -y_j*grad(f)_j < -y_i*grad(f)_i, j in I_low(\alpha) double Gmax = -INF; double Gmax2 = -INF; int Gmax_idx = -1; int Gmin_idx = -1; double obj_diff_min = INF; for(int t=0;t= Gmax) { Gmax = -G[t]; Gmax_idx = t; } } else { if(!is_lower_bound(t)) if(G[t] >= Gmax) { Gmax = G[t]; Gmax_idx = t; } } int i = Gmax_idx; const Qfloat *Q_i = NULL; if(i != -1) // NULL Q_i not accessed: Gmax=-INF if i=-1 Q_i = Q->get_Q(i,active_size); for(int j=0;j= Gmax2) Gmax2 = G[j]; if (grad_diff > 0) { double obj_diff; double quad_coef = QD[i]+QD[j]-2.0*y[i]*Q_i[j]; if (quad_coef > 0) obj_diff = -(grad_diff*grad_diff)/quad_coef; else obj_diff = -(grad_diff*grad_diff)/TAU; if (obj_diff <= obj_diff_min) { Gmin_idx=j; obj_diff_min = obj_diff; } } } } else { if (!is_upper_bound(j)) { double grad_diff= Gmax-G[j]; if (-G[j] >= Gmax2) Gmax2 = -G[j]; if (grad_diff > 0) { double obj_diff; double quad_coef = QD[i]+QD[j]+2.0*y[i]*Q_i[j]; if (quad_coef > 0) obj_diff = -(grad_diff*grad_diff)/quad_coef; else obj_diff = -(grad_diff*grad_diff)/TAU; if (obj_diff <= obj_diff_min) { Gmin_idx=j; obj_diff_min = obj_diff; } } } } } if(Gmax+Gmax2 < eps || Gmin_idx == -1) return 1; out_i = Gmax_idx; out_j = Gmin_idx; return 0; } bool Solver::be_shrunk(int i, double Gmax1, double Gmax2) { if(is_upper_bound(i)) { if(y[i]==+1) return(-G[i] > Gmax1); else return(-G[i] > Gmax2); } else if(is_lower_bound(i)) { if(y[i]==+1) return(G[i] > Gmax2); else return(G[i] > Gmax1); } else return(false); } void Solver::do_shrinking() { int i; double Gmax1 = -INF; // max { -y_i * grad(f)_i | i in I_up(\alpha) } double Gmax2 = -INF; // max { y_i * grad(f)_i | i in I_low(\alpha) } // find maximal violating pair first for(i=0;i= Gmax1) Gmax1 = -G[i]; } if(!is_lower_bound(i)) { if(G[i] >= Gmax2) Gmax2 = G[i]; } } else { if(!is_upper_bound(i)) { if(-G[i] >= Gmax2) Gmax2 = -G[i]; } if(!is_lower_bound(i)) { if(G[i] >= Gmax1) Gmax1 = G[i]; } } } if(unshrink == false && Gmax1 + Gmax2 <= eps*10) { unshrink = true; reconstruct_gradient(); active_size = l; info("*"); } for(i=0;i i) { if (!be_shrunk(active_size, Gmax1, Gmax2)) { swap_index(i,active_size); break; } active_size--; } } } double Solver::calculate_rho() { double r; int nr_free = 0; double ub = INF, lb = -INF, sum_free = 0; for(int i=0;i0) r = sum_free/nr_free; else r = (ub+lb)/2; return r; } // // Solver for nu-svm classification and regression // // additional constraint: e^T \alpha = constant // class Solver_NU: public Solver { public: Solver_NU() {} void Solve(int l, const QMatrix& Q, const double *p, const schar *y, double *alpha, double Cp, double Cn, double eps, SolutionInfo* si, int shrinking) { this->si = si; Solver::Solve(l,Q,p,y,alpha,Cp,Cn,eps,si,shrinking); } private: SolutionInfo *si; int select_working_set(int &i, int &j); double calculate_rho(); bool be_shrunk(int i, double Gmax1, double Gmax2, double Gmax3, double Gmax4); void do_shrinking(); }; // return 1 if already optimal, return 0 otherwise int Solver_NU::select_working_set(int &out_i, int &out_j) { // return i,j such that y_i = y_j and // i: maximizes -y_i * grad(f)_i, i in I_up(\alpha) // j: minimizes the decrease of obj value // (if quadratic coefficeint <= 0, replace it with tau) // -y_j*grad(f)_j < -y_i*grad(f)_i, j in I_low(\alpha) double Gmaxp = -INF; double Gmaxp2 = -INF; int Gmaxp_idx = -1; double Gmaxn = -INF; double Gmaxn2 = -INF; int Gmaxn_idx = -1; int Gmin_idx = -1; double obj_diff_min = INF; for(int t=0;t= Gmaxp) { Gmaxp = -G[t]; Gmaxp_idx = t; } } else { if(!is_lower_bound(t)) if(G[t] >= Gmaxn) { Gmaxn = G[t]; Gmaxn_idx = t; } } int ip = Gmaxp_idx; int in = Gmaxn_idx; const Qfloat *Q_ip = NULL; const Qfloat *Q_in = NULL; if(ip != -1) // NULL Q_ip not accessed: Gmaxp=-INF if ip=-1 Q_ip = Q->get_Q(ip,active_size); if(in != -1) Q_in = Q->get_Q(in,active_size); for(int j=0;j= Gmaxp2) Gmaxp2 = G[j]; if (grad_diff > 0) { double obj_diff; double quad_coef = QD[ip]+QD[j]-2*Q_ip[j]; if (quad_coef > 0) obj_diff = -(grad_diff*grad_diff)/quad_coef; else obj_diff = -(grad_diff*grad_diff)/TAU; if (obj_diff <= obj_diff_min) { Gmin_idx=j; obj_diff_min = obj_diff; } } } } else { if (!is_upper_bound(j)) { double grad_diff=Gmaxn-G[j]; if (-G[j] >= Gmaxn2) Gmaxn2 = -G[j]; if (grad_diff > 0) { double obj_diff; double quad_coef = QD[in]+QD[j]-2*Q_in[j]; if (quad_coef > 0) obj_diff = -(grad_diff*grad_diff)/quad_coef; else obj_diff = -(grad_diff*grad_diff)/TAU; if (obj_diff <= obj_diff_min) { Gmin_idx=j; obj_diff_min = obj_diff; } } } } } if(max(Gmaxp+Gmaxp2,Gmaxn+Gmaxn2) < eps || Gmin_idx == -1) return 1; if (y[Gmin_idx] == +1) out_i = Gmaxp_idx; else out_i = Gmaxn_idx; out_j = Gmin_idx; return 0; } bool Solver_NU::be_shrunk(int i, double Gmax1, double Gmax2, double Gmax3, double Gmax4) { if(is_upper_bound(i)) { if(y[i]==+1) return(-G[i] > Gmax1); else return(-G[i] > Gmax4); } else if(is_lower_bound(i)) { if(y[i]==+1) return(G[i] > Gmax2); else return(G[i] > Gmax3); } else return(false); } void Solver_NU::do_shrinking() { double Gmax1 = -INF; // max { -y_i * grad(f)_i | y_i = +1, i in I_up(\alpha) } double Gmax2 = -INF; // max { y_i * grad(f)_i | y_i = +1, i in I_low(\alpha) } double Gmax3 = -INF; // max { -y_i * grad(f)_i | y_i = -1, i in I_up(\alpha) } double Gmax4 = -INF; // max { y_i * grad(f)_i | y_i = -1, i in I_low(\alpha) } // find maximal violating pair first int i; for(i=0;i Gmax1) Gmax1 = -G[i]; } else if(-G[i] > Gmax4) Gmax4 = -G[i]; } if(!is_lower_bound(i)) { if(y[i]==+1) { if(G[i] > Gmax2) Gmax2 = G[i]; } else if(G[i] > Gmax3) Gmax3 = G[i]; } } if(unshrink == false && max(Gmax1+Gmax2,Gmax3+Gmax4) <= eps*10) { unshrink = true; reconstruct_gradient(); active_size = l; } for(i=0;i i) { if (!be_shrunk(active_size, Gmax1, Gmax2, Gmax3, Gmax4)) { swap_index(i,active_size); break; } active_size--; } } } double Solver_NU::calculate_rho() { int nr_free1 = 0,nr_free2 = 0; double ub1 = INF, ub2 = INF; double lb1 = -INF, lb2 = -INF; double sum_free1 = 0, sum_free2 = 0; for(int i=0;i 0) r1 = sum_free1/nr_free1; else r1 = (ub1+lb1)/2; if(nr_free2 > 0) r2 = sum_free2/nr_free2; else r2 = (ub2+lb2)/2; si->r = (r1+r2)/2; return (r1-r2)/2; } // // Q matrices for various formulations // class SVC_Q: public Kernel { public: SVC_Q(const svm_problem& prob, const svm_parameter& param, const schar *y_) :Kernel(prob.l, prob.x, param) { clone(y,y_,prob.l); cache = new Cache(prob.l,(long int)(param.cache_size*(1<<20))); QD = new double[prob.l]; for(int i=0;i*kernel_function)(i,i); } Qfloat *get_Q(int i, int len) const { Qfloat *data; int start, j; if((start = cache->get_data(i,&data,len)) < len) { for(j=start;j*kernel_function)(i,j)); } return data; } double *get_QD() const { return QD; } void swap_index(int i, int j) const { cache->swap_index(i,j); Kernel::swap_index(i,j); swap(y[i],y[j]); swap(QD[i],QD[j]); } ~SVC_Q() { delete[] y; delete cache; delete[] QD; } private: schar *y; Cache *cache; double *QD; }; class ONE_CLASS_Q: public Kernel { public: ONE_CLASS_Q(const svm_problem& prob, const svm_parameter& param) :Kernel(prob.l, prob.x, param) { cache = new Cache(prob.l,(long int)(param.cache_size*(1<<20))); QD = new double[prob.l]; for(int i=0;i*kernel_function)(i,i); } Qfloat *get_Q(int i, int len) const { Qfloat *data; int start, j; if((start = cache->get_data(i,&data,len)) < len) { for(j=start;j*kernel_function)(i,j); } return data; } double *get_QD() const { return QD; } void swap_index(int i, int j) const { cache->swap_index(i,j); Kernel::swap_index(i,j); swap(QD[i],QD[j]); } ~ONE_CLASS_Q() { delete cache; delete[] QD; } private: Cache *cache; double *QD; }; class SVR_Q: public Kernel { public: SVR_Q(const svm_problem& prob, const svm_parameter& param) :Kernel(prob.l, prob.x, param) { l = prob.l; cache = new Cache(l,(long int)(param.cache_size*(1<<20))); QD = new double[2*l]; sign = new schar[2*l]; index = new int[2*l]; for(int k=0;k*kernel_function)(k,k); QD[k+l] = QD[k]; } buffer[0] = new Qfloat[2*l]; buffer[1] = new Qfloat[2*l]; next_buffer = 0; } void swap_index(int i, int j) const { swap(sign[i],sign[j]); swap(index[i],index[j]); swap(QD[i],QD[j]); } Qfloat *get_Q(int i, int len) const { Qfloat *data; int j, real_i = index[i]; if(cache->get_data(real_i,&data,l) < l) { for(j=0;j*kernel_function)(real_i,j); } // reorder and copy Qfloat *buf = buffer[next_buffer]; next_buffer = 1 - next_buffer; schar si = sign[i]; for(j=0;jl; double *minus_ones = new double[l]; schar *y = new schar[l]; int i; for(i=0;iy[i] > 0) y[i] = +1; else y[i] = -1; } Solver s; s.Solve(l, SVC_Q(*prob,*param,y), minus_ones, y, alpha, Cp, Cn, param->eps, si, param->shrinking); double sum_alpha=0; for(i=0;il)); for(i=0;il; double nu = param->nu; schar *y = new schar[l]; for(i=0;iy[i]>0) y[i] = +1; else y[i] = -1; double sum_pos = nu*l/2; double sum_neg = nu*l/2; for(i=0;ieps, si, param->shrinking); double r = si->r; info("C = %f\n",1/r); for(i=0;irho /= r; si->obj /= (r*r); si->upper_bound_p = 1/r; si->upper_bound_n = 1/r; delete[] y; delete[] zeros; } static void solve_one_class( const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo* si) { int l = prob->l; double *zeros = new double[l]; schar *ones = new schar[l]; int i; int n = (int)(param->nu*prob->l); // # of alpha's at upper bound for(i=0;il) alpha[n] = param->nu * prob->l - n; for(i=n+1;ieps, si, param->shrinking); delete[] zeros; delete[] ones; } static void solve_epsilon_svr( const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo* si) { int l = prob->l; double *alpha2 = new double[2*l]; double *linear_term = new double[2*l]; schar *y = new schar[2*l]; int i; for(i=0;ip - prob->y[i]; y[i] = 1; alpha2[i+l] = 0; linear_term[i+l] = param->p + prob->y[i]; y[i+l] = -1; } Solver s; s.Solve(2*l, SVR_Q(*prob,*param), linear_term, y, alpha2, param->C, param->C, param->eps, si, param->shrinking); double sum_alpha = 0; for(i=0;iC*l)); delete[] alpha2; delete[] linear_term; delete[] y; } static void solve_nu_svr( const svm_problem *prob, const svm_parameter *param, double *alpha, Solver::SolutionInfo* si) { int l = prob->l; double C = param->C; double *alpha2 = new double[2*l]; double *linear_term = new double[2*l]; schar *y = new schar[2*l]; int i; double sum = C * param->nu * l / 2; for(i=0;iy[i]; y[i] = 1; linear_term[i+l] = prob->y[i]; y[i+l] = -1; } Solver_NU s; s.Solve(2*l, SVR_Q(*prob,*param), linear_term, y, alpha2, C, C, param->eps, si, param->shrinking); info("epsilon = %f\n",-si->r); for(i=0;il); Solver::SolutionInfo si; switch(param->svm_type) { case C_SVC: solve_c_svc(prob,param,alpha,&si,Cp,Cn); break; case NU_SVC: solve_nu_svc(prob,param,alpha,&si); break; case ONE_CLASS: solve_one_class(prob,param,alpha,&si); break; case EPSILON_SVR: solve_epsilon_svr(prob,param,alpha,&si); break; case NU_SVR: solve_nu_svr(prob,param,alpha,&si); break; } info("obj = %f, rho = %f\n",si.obj,si.rho); // output SVs int nSV = 0; int nBSV = 0; for(int i=0;il;i++) { if(fabs(alpha[i]) > 0) { ++nSV; if(prob->y[i] > 0) { if(fabs(alpha[i]) >= si.upper_bound_p) ++nBSV; } else { if(fabs(alpha[i]) >= si.upper_bound_n) ++nBSV; } } } info("nSV = %d, nBSV = %d\n",nSV,nBSV); decision_function f; f.alpha = alpha; f.rho = si.rho; return f; } // Platt's binary SVM Probablistic Output: an improvement from Lin et al. static void sigmoid_train( int l, const double *dec_values, const double *labels, double& A, double& B) { double prior1=0, prior0 = 0; int i; for (i=0;i 0) prior1+=1; else prior0+=1; int max_iter=100; // Maximal number of iterations double min_step=1e-10; // Minimal step taken in line search double sigma=1e-12; // For numerically strict PD of Hessian double eps=1e-5; double hiTarget=(prior1+1.0)/(prior1+2.0); double loTarget=1/(prior0+2.0); double *t=Malloc(double,l); double fApB,p,q,h11,h22,h21,g1,g2,det,dA,dB,gd,stepsize; double newA,newB,newf,d1,d2; int iter; // Initial Point and Initial Fun Value A=0.0; B=log((prior0+1.0)/(prior1+1.0)); double fval = 0.0; for (i=0;i0) t[i]=hiTarget; else t[i]=loTarget; fApB = dec_values[i]*A+B; if (fApB>=0) fval += t[i]*fApB + log(1+exp(-fApB)); else fval += (t[i] - 1)*fApB +log(1+exp(fApB)); } for (iter=0;iter= 0) { p=exp(-fApB)/(1.0+exp(-fApB)); q=1.0/(1.0+exp(-fApB)); } else { p=1.0/(1.0+exp(fApB)); q=exp(fApB)/(1.0+exp(fApB)); } d2=p*q; h11+=dec_values[i]*dec_values[i]*d2; h22+=d2; h21+=dec_values[i]*d2; d1=t[i]-p; g1+=dec_values[i]*d1; g2+=d1; } // Stopping Criteria if (fabs(g1)= min_step) { newA = A + stepsize * dA; newB = B + stepsize * dB; // New function value newf = 0.0; for (i=0;i= 0) newf += t[i]*fApB + log(1+exp(-fApB)); else newf += (t[i] - 1)*fApB +log(1+exp(fApB)); } // Check sufficient decrease if (newf=max_iter) info("Reaching maximal iterations in two-class probability estimates\n"); free(t); } static double sigmoid_predict(double decision_value, double A, double B) { double fApB = decision_value*A+B; // 1-p used later; avoid catastrophic cancellation if (fApB >= 0) return exp(-fApB)/(1.0+exp(-fApB)); else return 1.0/(1+exp(fApB)) ; } // Method 2 from the multiclass_prob paper by Wu, Lin, and Weng static void multiclass_probability(int k, double **r, double *p) { int t,j; int iter = 0, max_iter=max(100,k); double **Q=Malloc(double *,k); double *Qp=Malloc(double,k); double pQp, eps=0.005/k; for (t=0;tmax_error) max_error=error; } if (max_error=max_iter) info("Exceeds max_iter in multiclass_prob\n"); for(t=0;tl); double *dec_values = Malloc(double,prob->l); // random shuffle GetRNGstate(); for(i=0;il;i++) perm[i]=i; for(i=0;il;i++) { int j = i+((int) (unif_rand() * (prob->l-i))) % (prob->l-i); swap(perm[i],perm[j]); } PutRNGstate(); for(i=0;il/nr_fold; int end = (i+1)*prob->l/nr_fold; int j,k; struct svm_problem subprob; subprob.l = prob->l-(end-begin); subprob.x = Malloc(struct svm_node*,subprob.l); subprob.y = Malloc(double,subprob.l); k=0; for(j=0;jx[perm[j]]; subprob.y[k] = prob->y[perm[j]]; ++k; } for(j=end;jl;j++) { subprob.x[k] = prob->x[perm[j]]; subprob.y[k] = prob->y[perm[j]]; ++k; } int p_count=0,n_count=0; for(j=0;j0) p_count++; else n_count++; if(p_count==0 && n_count==0) for(j=begin;j 0 && n_count == 0) for(j=begin;j 0) for(j=begin;jx[perm[j]],&(dec_values[perm[j]])); // ensure +1 -1 order; reason not using CV subroutine dec_values[perm[j]] *= submodel->label[0]; } svm_free_and_destroy_model(&submodel); svm_destroy_param(&subparam); } free(subprob.x); free(subprob.y); } sigmoid_train(prob->l,dec_values,prob->y,probA,probB); free(dec_values); free(perm); } // Return parameter of a Laplace distribution static double svm_svr_probability( const svm_problem *prob, const svm_parameter *param) { int i; int nr_fold = 5; double *ymv = Malloc(double,prob->l); double mae = 0; svm_parameter newparam = *param; newparam.probability = 0; svm_cross_validation(prob,&newparam,nr_fold,ymv); for(i=0;il;i++) { ymv[i]=prob->y[i]-ymv[i]; mae += fabs(ymv[i]); } mae /= prob->l; double std=sqrt(2*mae*mae); int count=0; mae=0; for(i=0;il;i++) if (fabs(ymv[i]) > 5*std) count=count+1; else mae+=fabs(ymv[i]); mae /= (prob->l-count); info("Prob. model for test data: target value = predicted value + z,\nz: Laplace distribution e^(-|z|/sigma)/(2sigma),sigma= %g\n",mae); free(ymv); return mae; } // label: label name, start: begin of each class, count: #data of classes, perm: indices to the original data // perm, length l, must be allocated before calling this subroutine static void svm_group_classes(const svm_problem *prob, int *nr_class_ret, int **label_ret, int **start_ret, int **count_ret, int *perm) { int l = prob->l; int max_nr_class = 16; int nr_class = 0; int *label = Malloc(int,max_nr_class); int *count = Malloc(int,max_nr_class); int *data_label = Malloc(int,l); int i; for(i=0;iy[i]; int j; for(j=0;jparam = *param; model->free_sv = 0; // XXX if(param->svm_type == ONE_CLASS || param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR) { // regression or one-class-svm model->nr_class = 2; model->label = NULL; model->nSV = NULL; model->probA = NULL; model->probB = NULL; model->sv_coef = Malloc(double *,1); if(param->probability && (param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR)) { model->probA = Malloc(double,1); model->probA[0] = svm_svr_probability(prob,param); } decision_function f = svm_train_one(prob,param,0,0); model->rho = Malloc(double,1); model->rho[0] = f.rho; int nSV = 0; int i; for(i=0;il;i++) if(fabs(f.alpha[i]) > 0) ++nSV; model->l = nSV; model->SV = Malloc(svm_node *,nSV); model->sv_coef[0] = Malloc(double,nSV); model->sv_indices = Malloc(int,nSV); int j = 0; for(i=0;il;i++) if(fabs(f.alpha[i]) > 0) { model->SV[j] = prob->x[i]; model->sv_coef[0][j] = f.alpha[i]; model->sv_indices[j] = i+1; ++j; } free(f.alpha); } else { // classification int l = prob->l; int nr_class; int *label = NULL; int *start = NULL; int *count = NULL; int *perm = Malloc(int,l); // group training data of the same class svm_group_classes(prob,&nr_class,&label,&start,&count,perm); if(nr_class == 1) info("WARNING: training data in only one class. See README for details.\n"); svm_node **x = Malloc(svm_node *,l); int i; for(i=0;ix[perm[i]]; // calculate weighted C double *weighted_C = Malloc(double, nr_class); for(i=0;iC; for(i=0;inr_weight;i++) { int j; for(j=0;jweight_label[i] == label[j]) break; if(j == nr_class) REprintf("WARNING: class label %d specified in weight is not found\n", param->weight_label[i]); else weighted_C[j] *= param->weight[i]; } // train k*(k-1)/2 models bool *nonzero = Malloc(bool,l); for(i=0;iprobability) { probA=Malloc(double,nr_class*(nr_class-1)/2); probB=Malloc(double,nr_class*(nr_class-1)/2); } int p = 0; for(i=0;iprobability) svm_binary_svc_probability(&sub_prob,param,weighted_C[i],weighted_C[j],probA[p],probB[p]); f[p] = svm_train_one(&sub_prob,param,weighted_C[i],weighted_C[j]); for(k=0;k 0) nonzero[si+k] = true; for(k=0;k 0) nonzero[sj+k] = true; free(sub_prob.x); free(sub_prob.y); ++p; } // build output model->nr_class = nr_class; model->label = Malloc(int,nr_class); for(i=0;ilabel[i] = label[i]; model->rho = Malloc(double,nr_class*(nr_class-1)/2); for(i=0;irho[i] = f[i].rho; if(param->probability) { model->probA = Malloc(double,nr_class*(nr_class-1)/2); model->probB = Malloc(double,nr_class*(nr_class-1)/2); for(i=0;iprobA[i] = probA[i]; model->probB[i] = probB[i]; } } else { model->probA=NULL; model->probB=NULL; } int total_sv = 0; int *nz_count = Malloc(int,nr_class); model->nSV = Malloc(int,nr_class); for(i=0;inSV[i] = nSV; nz_count[i] = nSV; } info("Total nSV = %d\n",total_sv); model->l = total_sv; model->SV = Malloc(svm_node *,total_sv); model->sv_indices = Malloc(int,total_sv); p = 0; for(i=0;iSV[p] = x[i]; model->sv_indices[p++] = perm[i] + 1; } int *nz_start = Malloc(int,nr_class); nz_start[0] = 0; for(i=1;isv_coef = Malloc(double *,nr_class-1); for(i=0;isv_coef[i] = Malloc(double,total_sv); p = 0; for(i=0;isv_coef[j-1][q++] = f[p].alpha[k]; q = nz_start[j]; for(k=0;ksv_coef[i][q++] = f[p].alpha[ci+k]; ++p; } free(label); free(probA); free(probB); free(count); free(perm); free(start); free(x); free(weighted_C); free(nonzero); for(i=0;il; int *perm = Malloc(int,l); int nr_class; GetRNGstate(); if (nr_fold > l) { nr_fold = l; REprintf("WARNING: # folds > # data. Will use # folds = # data instead (i.e., leave-one-out cross validation)\n"); } fold_start = Malloc(int,nr_fold+1); // stratified cv may not give leave-one-out rate // Each class to l folds -> some folds may have zero elements if((param->svm_type == C_SVC || param->svm_type == NU_SVC) && nr_fold < l) { int *start = NULL; int *label = NULL; int *count = NULL; svm_group_classes(prob,&nr_class,&label,&start,&count,perm); // random shuffle and then data grouped by fold using the array perm int *fold_count = Malloc(int,nr_fold); int c; int *index = Malloc(int,l); for(i=0;ix[perm[j]]; subprob.y[k] = prob->y[perm[j]]; ++k; } for(j=end;jx[perm[j]]; subprob.y[k] = prob->y[perm[j]]; ++k; } struct svm_model *submodel = svm_train(&subprob,param); if(param->probability && (param->svm_type == C_SVC || param->svm_type == NU_SVC)) { double *prob_estimates=Malloc(double,svm_get_nr_class(submodel)); for(j=begin;jx[perm[j]],prob_estimates); free(prob_estimates); } else for(j=begin;jx[perm[j]]); svm_free_and_destroy_model(&submodel); free(subprob.x); free(subprob.y); } free(fold_start); free(perm); PutRNGstate(); } int svm_get_svm_type(const svm_model *model) { return model->param.svm_type; } int svm_get_nr_class(const svm_model *model) { return model->nr_class; } void svm_get_labels(const svm_model *model, int* label) { if (model->label != NULL) for(int i=0;inr_class;i++) label[i] = model->label[i]; } void svm_get_sv_indices(const svm_model *model, int* indices) { if (model->sv_indices != NULL) for(int i=0;il;i++) indices[i] = model->sv_indices[i]; } int svm_get_nr_sv(const svm_model *model) { return model->l; } double svm_get_svr_probability(const svm_model *model) { if ((model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) && model->probA!=NULL) return model->probA[0]; else { REprintf("Model doesn't contain information for SVR probability inference\n"); return 0; } } double svm_predict_values(const svm_model *model, const svm_node *x, double* dec_values) { int i; if(model->param.svm_type == ONE_CLASS || model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) { double *sv_coef = model->sv_coef[0]; double sum = 0; for(i=0;il;i++) sum += sv_coef[i] * Kernel::k_function(x,model->SV[i],model->param); sum -= model->rho[0]; *dec_values = sum; if(model->param.svm_type == ONE_CLASS) return (sum>0)?1:-1; else return sum; } else { int nr_class = model->nr_class; int l = model->l; double *kvalue = Malloc(double,l); for(i=0;iSV[i],model->param); int *start = Malloc(int,nr_class); start[0] = 0; for(i=1;inSV[i-1]; int *vote = Malloc(int,nr_class); for(i=0;inSV[i]; int cj = model->nSV[j]; int k; double *coef1 = model->sv_coef[j-1]; double *coef2 = model->sv_coef[i]; for(k=0;krho[p]; dec_values[p] = sum; if(dec_values[p] > 0) ++vote[i]; else ++vote[j]; p++; } int vote_max_idx = 0; for(i=1;i vote[vote_max_idx]) vote_max_idx = i; free(kvalue); free(start); free(vote); return model->label[vote_max_idx]; } } double svm_predict(const svm_model *model, const svm_node *x) { int nr_class = model->nr_class; double *dec_values; if(model->param.svm_type == ONE_CLASS || model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) dec_values = Malloc(double, 1); else dec_values = Malloc(double, nr_class*(nr_class-1)/2); double pred_result = svm_predict_values(model, x, dec_values); free(dec_values); return pred_result; } double svm_predict_probability( const svm_model *model, const svm_node *x, double *prob_estimates) { if ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && model->probA!=NULL && model->probB!=NULL) { int i; int nr_class = model->nr_class; double *dec_values = Malloc(double, nr_class*(nr_class-1)/2); svm_predict_values(model, x, dec_values); double min_prob=1e-7; double **pairwise_prob=Malloc(double *,nr_class); for(i=0;iprobA[k],model->probB[k]),min_prob),1-min_prob); pairwise_prob[j][i]=1-pairwise_prob[i][j]; k++; } if (nr_class == 2) { prob_estimates[0] = pairwise_prob[0][1]; prob_estimates[1] = pairwise_prob[1][0]; } else multiclass_probability(nr_class,pairwise_prob,prob_estimates); int prob_max_idx = 0; for(i=1;i prob_estimates[prob_max_idx]) prob_max_idx = i; for(i=0;ilabel[prob_max_idx]; } else return svm_predict(model, x); } static const char *svm_type_table[] = { "c_svc","nu_svc","one_class","epsilon_svr","nu_svr",NULL }; static const char *kernel_type_table[]= { "linear","polynomial","rbf","sigmoid","precomputed",NULL }; int svm_save_model(const char *model_file_name, const svm_model *model) { FILE *fp = fopen(model_file_name,"w"); if(fp==NULL) return -1; char *old_locale = setlocale(LC_ALL, NULL); if (old_locale) { old_locale = strdup(old_locale); } setlocale(LC_ALL, "C"); const svm_parameter& param = model->param; (void) fprintf(fp,"svm_type %s\n", svm_type_table[param.svm_type]); (void) fprintf(fp,"kernel_type %s\n", kernel_type_table[param.kernel_type]); if(param.kernel_type == POLY) (void) fprintf(fp,"degree %d\n", param.degree); if(param.kernel_type == POLY || param.kernel_type == RBF || param.kernel_type == SIGMOID) (void) fprintf(fp,"gamma %.17g\n", param.gamma); if(param.kernel_type == POLY || param.kernel_type == SIGMOID) (void) fprintf(fp,"coef0 %.17g\n", param.coef0); int nr_class = model->nr_class; int l = model->l; (void) fprintf(fp, "nr_class %d\n", nr_class); (void) fprintf(fp, "total_sv %d\n",l); { (void) fprintf(fp, "rho"); for(int i=0;irho[i]); (void) fprintf(fp, "\n"); } if(model->label) { (void) fprintf(fp, "label"); for(int i=0;ilabel[i]); (void) fprintf(fp, "\n"); } if(model->probA) // regression has probA only { (void) fprintf(fp, "probA"); for(int i=0;iprobA[i]); (void) fprintf(fp, "\n"); } if(model->probB) { (void) fprintf(fp, "probB"); for(int i=0;iprobB[i]); (void) fprintf(fp, "\n"); } if(model->nSV) { (void) fprintf(fp, "nr_sv"); for(int i=0;inSV[i]); (void) fprintf(fp, "\n"); } (void) fprintf(fp, "SV\n"); const double * const *sv_coef = model->sv_coef; const svm_node * const *SV = model->SV; for(int i=0;ivalue)); else while(p->index != -1) { (void) fprintf(fp,"%d:%.8g ",p->index,p->value); p++; } (void) fprintf(fp, "\n"); } setlocale(LC_ALL, old_locale); free(old_locale); if (ferror(fp) != 0 || fclose(fp) != 0) return -1; else return 0; } static char *line = NULL; static int max_line_len; static char* readline(FILE *input) { int len; if(fgets(line,max_line_len,input) == NULL) return NULL; while(strrchr(line,'\n') == NULL) { max_line_len *= 2; line = (char *) realloc(line,max_line_len); len = (int) strlen(line); if(fgets(line+len,max_line_len-len,input) == NULL) break; } return line; } // // FSCANF helps to handle fscanf failures. // Its do-while block avoids the ambiguity when // if (...) // FSCANF(); // is used // #define FSCANF(_stream, _format, _var) do{ if (fscanf(_stream, _format, _var) != 1) return false; }while(0) bool read_model_header(FILE *fp, svm_model* model) { svm_parameter& param = model->param; // parameters for training only won't be assigned, but arrays are assigned as NULL for safety param.nr_weight = 0; param.weight_label = NULL; param.weight = NULL; char cmd[81]; while(1) { FSCANF(fp,"%80s",cmd); if(strcmp(cmd,"svm_type")==0) { FSCANF(fp,"%80s",cmd); int i; for(i=0;svm_type_table[i];i++) { if(strcmp(svm_type_table[i],cmd)==0) { param.svm_type=i; break; } } if(svm_type_table[i] == NULL) { REprintf("unknown svm type.\n"); return false; } } else if(strcmp(cmd,"kernel_type")==0) { FSCANF(fp,"%80s",cmd); int i; for(i=0;kernel_type_table[i];i++) { if(strcmp(kernel_type_table[i],cmd)==0) { param.kernel_type=i; break; } } if(kernel_type_table[i] == NULL) { REprintf("unknown kernel function.\n"); return false; } } else if(strcmp(cmd,"degree")==0) FSCANF(fp,"%d",¶m.degree); else if(strcmp(cmd,"gamma")==0) FSCANF(fp,"%lf",¶m.gamma); else if(strcmp(cmd,"coef0")==0) FSCANF(fp,"%lf",¶m.coef0); else if(strcmp(cmd,"nr_class")==0) FSCANF(fp,"%d",&model->nr_class); else if(strcmp(cmd,"total_sv")==0) FSCANF(fp,"%d",&model->l); else if(strcmp(cmd,"rho")==0) { int n = model->nr_class * (model->nr_class-1)/2; model->rho = Malloc(double,n); for(int i=0;irho[i]); } else if(strcmp(cmd,"label")==0) { int n = model->nr_class; model->label = Malloc(int,n); for(int i=0;ilabel[i]); } else if(strcmp(cmd,"probA")==0) { int n = model->nr_class * (model->nr_class-1)/2; model->probA = Malloc(double,n); for(int i=0;iprobA[i]); } else if(strcmp(cmd,"probB")==0) { int n = model->nr_class * (model->nr_class-1)/2; model->probB = Malloc(double,n); for(int i=0;iprobB[i]); } else if(strcmp(cmd,"nr_sv")==0) { int n = model->nr_class; model->nSV = Malloc(int,n); for(int i=0;inSV[i]); } else if(strcmp(cmd,"SV")==0) { while(1) { int c = getc(fp); if(c==EOF || c=='\n') break; } break; } else { REprintf("unknown text in model file: [%s]\n",cmd); return false; } } return true; } svm_model *svm_load_model(const char *model_file_name) { FILE *fp = fopen(model_file_name,"rb"); if(fp==NULL) return NULL; char *old_locale = setlocale(LC_ALL, NULL); if (old_locale) { old_locale = strdup(old_locale); } setlocale(LC_ALL, "C"); // read parameters svm_model *model = Malloc(svm_model,1); model->rho = NULL; model->probA = NULL; model->probB = NULL; model->sv_indices = NULL; model->label = NULL; model->nSV = NULL; // read header if (!read_model_header(fp, model)) { REprintf("ERROR: fscanf failed to read model\n"); setlocale(LC_ALL, old_locale); free(old_locale); free(model->rho); free(model->label); free(model->nSV); free(model); return NULL; } // read sv_coef and SV int elements = 0; long pos = ftell(fp); max_line_len = 1024; line = Malloc(char,max_line_len); char *p,*endptr,*idx,*val; while(readline(fp)!=NULL) { p = strtok(line,":"); while(1) { p = strtok(NULL,":"); if(p == NULL) break; ++elements; } } elements += model->l; fseek(fp,pos,SEEK_SET); int m = model->nr_class - 1; int l = model->l; model->sv_coef = Malloc(double *,m); int i; for(i=0;isv_coef[i] = Malloc(double,l); model->SV = Malloc(svm_node*,l); svm_node *x_space = NULL; if(l>0) x_space = Malloc(svm_node,elements); int j=0; for(i=0;iSV[i] = &x_space[j]; p = strtok(line, " \t"); model->sv_coef[0][i] = strtod(p,&endptr); for(int k=1;ksv_coef[k][i] = strtod(p,&endptr); } while(1) { idx = strtok(NULL, ":"); val = strtok(NULL, " \t"); if(val == NULL) break; x_space[j].index = (int) strtol(idx,&endptr,10); x_space[j].value = strtod(val,&endptr); ++j; } x_space[j++].index = -1; } free(line); setlocale(LC_ALL, old_locale); free(old_locale); if (ferror(fp) != 0 || fclose(fp) != 0) return NULL; model->free_sv = 1; // XXX return model; } void svm_free_model_content(svm_model* model_ptr) { if(model_ptr->free_sv && model_ptr->l > 0 && model_ptr->SV != NULL) free((void *)(model_ptr->SV[0])); if(model_ptr->sv_coef) { for(int i=0;inr_class-1;i++) free(model_ptr->sv_coef[i]); } free(model_ptr->SV); model_ptr->SV = NULL; free(model_ptr->sv_coef); model_ptr->sv_coef = NULL; free(model_ptr->rho); model_ptr->rho = NULL; free(model_ptr->label); model_ptr->label= NULL; free(model_ptr->probA); model_ptr->probA = NULL; free(model_ptr->probB); model_ptr->probB= NULL; free(model_ptr->sv_indices); model_ptr->sv_indices = NULL; free(model_ptr->nSV); model_ptr->nSV = NULL; } void svm_free_and_destroy_model(svm_model** model_ptr_ptr) { if(model_ptr_ptr != NULL && *model_ptr_ptr != NULL) { svm_free_model_content(*model_ptr_ptr); free(*model_ptr_ptr); *model_ptr_ptr = NULL; } } void svm_destroy_param(svm_parameter* param) { free(param->weight_label); free(param->weight); } const char *svm_check_parameter(const svm_problem *prob, const svm_parameter *param) { // svm_type int svm_type = param->svm_type; if(svm_type != C_SVC && svm_type != NU_SVC && svm_type != ONE_CLASS && svm_type != EPSILON_SVR && svm_type != NU_SVR) return "unknown svm type"; // kernel_type, degree int kernel_type = param->kernel_type; if(kernel_type != LINEAR && kernel_type != POLY && kernel_type != RBF && kernel_type != SIGMOID && kernel_type != PRECOMPUTED) return "unknown kernel type"; if(param->gamma < 0) return "gamma < 0"; if(param->degree < 0) return "degree of polynomial kernel < 0"; // cache_size,eps,C,nu,p,shrinking if(param->cache_size <= 0) return "cache_size <= 0"; if(param->eps <= 0) return "eps <= 0"; if(svm_type == C_SVC || svm_type == EPSILON_SVR || svm_type == NU_SVR) if(param->C <= 0) return "C <= 0"; if(svm_type == NU_SVC || svm_type == ONE_CLASS || svm_type == NU_SVR) if(param->nu <= 0 || param->nu > 1) return "nu <= 0 or nu > 1"; if(svm_type == EPSILON_SVR) if(param->p < 0) return "p < 0"; if(param->shrinking != 0 && param->shrinking != 1) return "shrinking != 0 and shrinking != 1"; if(param->probability != 0 && param->probability != 1) return "probability != 0 and probability != 1"; if(param->probability == 1 && svm_type == ONE_CLASS) return "one-class SVM probability output not supported yet"; // check whether nu-svc is feasible if(svm_type == NU_SVC) { int l = prob->l; int max_nr_class = 16; int nr_class = 0; int *label = Malloc(int,max_nr_class); int *count = Malloc(int,max_nr_class); int i; for(i=0;iy[i]; int j; for(j=0;jnu*(n1+n2)/2 > min(n1,n2)) { free(label); free(count); return "specified nu is infeasible"; } } } free(label); free(count); } return NULL; } int svm_check_probability_model(const svm_model *model) { return ((model->param.svm_type == C_SVC || model->param.svm_type == NU_SVC) && model->probA!=NULL && model->probB!=NULL) || ((model->param.svm_type == EPSILON_SVR || model->param.svm_type == NU_SVR) && model->probA!=NULL); } void svm_set_print_string_function(void (*print_func)(const char *)) { if(print_func == NULL) svm_print_string = &print_string_stdout; else svm_print_string = print_func; } e1071/src/cmeans.c0000755000175100001440000001774014173734135013252 0ustar hornikusers/* C code for (weighted) fuzzy c-means, rewritten from scratch by KH. */ #include #include #include /* Enhance readability of matrix-subscripting for matrices stored in row-major order. */ #define MSUB(x, i, j, n) x[(i) + (n) * (j)] static double *d; static double *dwrk, *dwrk_x, *dwrk_w; static int *iwrk; static void cmeans_setup(int nr_x, int nr_p, int dist) { int len_u_d = nr_x * nr_p; d = (double *) R_alloc(len_u_d, sizeof(double)); if(dist == 1) { /* Needed for weighted medians. */ dwrk_x = (double *) R_alloc(nr_x, sizeof(double)); dwrk_w = (double *) R_alloc(nr_x, sizeof(double)); dwrk = (double *) R_alloc(nr_x, sizeof(double)); iwrk = (int *) R_alloc(nr_x, sizeof(int)); } } /* static void cmeans_copy_vector(double *from, double *to, int len) { int i; for(i = 0; i < len; i++) to[i] = from[i]; } static double cmeans_delta_old_new(double *old, double *new, int len) { int i; double sum = 0; for(i = 0; i < len; i++) sum += fabs(new[i] - old[i]); return(sum / len); } */ static int cmeans_sign(double x) { if(x == 0) return(0); return((x > 0) ? 1 : -1); } static double cmeans_weighted_median(double *x, double *w, int len) { int i; double sum, val, marg, mval, cumsum_w, cumsum_w_x; /* Sort x. */ for(i = 0; i < len; i++) iwrk[i] = i; rsort_with_index(x, iwrk, len); /* Permute w using iwrk, and normalize. */ sum = 0; for(i = 0; i < len; i++) { dwrk[i] = w[iwrk[i]]; sum += dwrk[i]; } for(i = 0; i < len; i++) { w[i] = dwrk[i] / sum; } cumsum_w = cumsum_w_x = 0; mval = R_PosInf; marg = *x; /* -Wall */ for(i = 0; i < len; i++) { cumsum_w += w[i]; cumsum_w_x += w[i] * x[i]; val = x[i] * (cumsum_w - .5) - cumsum_w_x; if(val < mval) { marg = x[i]; mval = val; } } return(marg); } /* Update the dissimilarities (between objects and prototypes) for a * single object (i.e., a single row of the dissimilarity matrix. */ static void ufcl_dissimilarities(double *x, double *p, int nr_x, int nc, int nr_p, int dist, int ix, double *d) { int ip, j; double sum, v; for(ip = 0; ip < nr_p; ip++) { sum = 0; for(j = 0; j < nc; j++) { v = MSUB(x, ix, j, nr_x) - MSUB(p, ip, j, nr_p); if(dist == 0) sum += v * v; else if(dist == 1) sum += fabs(v); } MSUB(d, ix, ip, nr_x) = sum; } } static void cmeans_dissimilarities(double *x, double *p, int nr_x, int nc, int nr_p, int dist, double *d) { int ix; for(ix = 0; ix < nr_x; ix++) { /* Loop over all objects ... */ ufcl_dissimilarities(x, p, nr_x, nc, nr_p, dist, ix, d); } } /* Update the memberships for a single object (i.e., a single row of the * membership matrix.) */ static void ufcl_memberships(double *d, int nr_x, int nr_p, double exponent, int ix, double *u) { int ip, n_of_zeroes; double sum, v; n_of_zeroes = 0; for(ip = 0; ip < nr_p; ip++) { if(MSUB(d, ix, ip, nr_x) == 0) n_of_zeroes++; } if(n_of_zeroes > 0) { v = 1 / n_of_zeroes; for(ip = 0; ip < nr_p; ip++) MSUB(u, ix, ip, nr_x) = ((MSUB(d, ix, ip, nr_x) == 0) ? v : 0); } else { /* Use the assumption that in general, pow() is more * expensive than subscripting. */ sum = 0; for(ip = 0; ip < nr_p; ip++) { v = 1 / pow(MSUB(d, ix, ip, nr_x), exponent); sum += v; MSUB(u, ix, ip, nr_x) = v; } for(ip = 0; ip < nr_p; ip++) MSUB(u, ix, ip, nr_x) /= sum; } } static void cmeans_memberships(double *d, int nr_x, int nr_p, double exponent, double *u) { int ix; for(ix = 0; ix < nr_x; ix++) { /* Loop over all objects ... */ ufcl_memberships(d, nr_x, nr_p, exponent, ix, u); } } static void cmeans_prototypes(double *x, double *u, double *w, int nr_x, int nc, int nr_p, double f, int dist, double *p) { int ix, ip, j; double sum, v; if(dist == 0) { /* Euclidean: weighted means. */ for(ip = 0; ip < nr_p; ip++) { for(j = 0; j < nc; j++) MSUB(p, ip, j, nr_p) = 0; sum = 0; for(ix = 0; ix < nr_x; ix++) { v = w[ix] * pow(MSUB(u, ix, ip, nr_x), f); sum += v; for(j = 0; j < nc; j++) MSUB(p, ip, j, nr_p) += v * MSUB(x, ix, j, nr_x); } for(j = 0; j < nc; j++) MSUB(p, ip, j, nr_p) /= sum; } } else { /* Manhattan: weighted medians. */ for(ip = 0; ip < nr_p; ip++) for(j = 0; j < nc; j++) { for(ix = 0; ix < nr_x; ix++) { dwrk_x[ix] = MSUB(x, ix, j, nr_x); dwrk_w[ix] = w[ix] * pow(MSUB(u, ix, ip, nr_x), f); } MSUB(p, ip, j, nr_p) = cmeans_weighted_median(dwrk_x, dwrk_w, nr_x); } } } static double cmeans_error_fn(double *u, double *d, double *w, int nr_x, int nr_p, double f) { int ix, ip; double sum; sum = 0; for(ix = 0; ix < nr_x; ix++) for(ip = 0; ip < nr_p; ip++) sum += w[ix] * pow(MSUB(u, ix, ip, nr_x), f) * MSUB(d, ix, ip, nr_x); return(sum); } void cmeans(double *x, int *nr_x, int *nc, double *p, int *nr_p, double *w, double *f, int *dist, int *itermax, double *reltol, int *verbose, double *u, double *ermin, int *iter) { double exponent = 1 / (*f - 1); double old_value, new_value; cmeans_setup(*nr_x, *nr_p, *dist); cmeans_dissimilarities(x, p, *nr_x, *nc, *nr_p, *dist, d); cmeans_memberships(d, *nr_x, *nr_p, exponent, u); old_value = new_value = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); *iter = 0; while((*iter)++ < *itermax) { cmeans_prototypes(x, u, w, *nr_x, *nc, *nr_p, *f, *dist, p); cmeans_dissimilarities(x, p, *nr_x, *nc, *nr_p, *dist, d); cmeans_memberships(d, *nr_x, *nr_p, exponent, u); new_value = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); if(fabs(old_value - new_value) < *reltol * (old_value + *reltol)) { if(*verbose) Rprintf("Iteration: %3d converged, Error: %13.10f\n", *iter, new_value); break; } else { if(*verbose) { *ermin = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); Rprintf("Iteration: %3d, Error: %13.10f\n", *iter, new_value); } old_value = new_value; } } *ermin = new_value; } /* Update prototypes based on a single object. */ static void ufcl_prototypes(double *x, double *u, double *w, int nr_x, int nc, int nr_p, double f, int dist, double lrate, int ix, double *p) { int ip, j; double grad; for(ip = 0; ip < nr_p; ip++) { for(j = 0; j < nc; j++) { grad = MSUB(x, ix, j, nr_x) - MSUB(p, ip, j, nr_p); if(dist == 1) grad = cmeans_sign(grad); MSUB(p, ip, j, nr_p) += lrate * w[ix] * pow(MSUB(u, ix, ip, nr_x), f) * grad; } } } void ufcl(double *x, int *nr_x, int *nc, double *p, int *nr_p, double *w, double *f, int *dist, int *itermax, double *reltol, int *verbose, double *rate_par, double *u, double *ermin, int *iter) { double exponent = 1 / (*f - 1); double old_value, new_value; int ix; double lrate; cmeans_setup(*nr_x, *nr_p, 0); /* Need some starting values ... */ cmeans_dissimilarities(x, p, *nr_x, *nc, *nr_p, *dist, d); cmeans_memberships(d, *nr_x, *nr_p, exponent, u); old_value = new_value = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); *iter = 0; while((*iter)++ < *itermax) { /* Turns out that sampling the objects is a bad idea ... */ lrate = *rate_par * (1 - (double) *iter / *itermax); for(ix = 0; ix < *nr_x; ix++) { ufcl_dissimilarities(x, p, *nr_x, *nc, *nr_p, *dist, ix, d); ufcl_memberships(d, *nr_x, *nr_p, exponent, ix, u); ufcl_prototypes(x, u, w, *nr_x, *nc, *nr_p, *f, *dist, lrate, ix, p); } new_value = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); if(fabs(old_value - new_value) < *reltol * (old_value + *reltol)) { if(*verbose) Rprintf("Iteration: %3d converged, Error: %13.10f\n", *iter, new_value); break; } else { if(*verbose) { *ermin = cmeans_error_fn(u, d, w, *nr_x, *nr_p, *f); Rprintf("Iteration: %3d, Error: %13.10f\n", *iter, new_value); } old_value = new_value; } } *ermin = new_value; } e1071/src/svm.h0000755000175100001440000000660514173734135012614 0ustar hornikusers#ifndef _LIBSVM_H #define _LIBSVM_H #define LIBSVM_VERSION 323 #ifdef __cplusplus extern "C" { #endif extern int libsvm_version; struct svm_node { int index; double value; }; struct svm_problem { int l; double *y; struct svm_node **x; }; enum { C_SVC, NU_SVC, ONE_CLASS, EPSILON_SVR, NU_SVR }; /* svm_type */ enum { LINEAR, POLY, RBF, SIGMOID, PRECOMPUTED }; /* kernel_type */ struct svm_parameter { int svm_type; int kernel_type; int degree; /* for poly */ double gamma; /* for poly/rbf/sigmoid */ double coef0; /* for poly/sigmoid */ /* these are for training only */ double cache_size; /* in MB */ double eps; /* stopping criteria */ double C; /* for C_SVC, EPSILON_SVR and NU_SVR */ int nr_weight; /* for C_SVC */ int *weight_label; /* for C_SVC */ double* weight; /* for C_SVC */ double nu; /* for NU_SVC, ONE_CLASS, and NU_SVR */ double p; /* for EPSILON_SVR */ int shrinking; /* use the shrinking heuristics */ int probability; /* do probability estimates */ }; /* // // svm_model // */ struct svm_model { struct svm_parameter param; /* parameter */ int nr_class; /* number of classes, = 2 in regression/one class svm */ int l; /* total #SV */ struct svm_node **SV; /* SVs (SV[l]) */ double **sv_coef; /* coefficients for SVs in decision functions (sv_coef[k-1][l]) */ double *rho; /* constants in decision functions (rho[k*(k-1)/2]) */ double *probA; /* pariwise probability information */ double *probB; int *sv_indices; /* sv_indices[0,...,nSV-1] are values in [1,...,num_traning_data] to indicate SVs in the training set */ /* for classification only */ int *label; /* label of each class (label[k]) */ int *nSV; /* number of SVs for each class (nSV[k]) */ /* nSV[0] + nSV[1] + ... + nSV[k-1] = l */ /* XXX */ int free_sv; /* 1 if svm_model is created by svm_load_model*/ /* 0 if svm_model is created by svm_train */ }; struct svm_model *svm_train(const struct svm_problem *prob, const struct svm_parameter *param); void svm_cross_validation(const struct svm_problem *prob, const struct svm_parameter *param, int nr_fold, double *target); int svm_save_model(const char *model_file_name, const struct svm_model *model); struct svm_model *svm_load_model(const char *model_file_name); int svm_get_svm_type(const struct svm_model *model); int svm_get_nr_class(const struct svm_model *model); void svm_get_labels(const struct svm_model *model, int *label); void svm_get_sv_indices(const struct svm_model *model, int *sv_indices); int svm_get_nr_sv(const struct svm_model *model); double svm_get_svr_probability(const struct svm_model *model); double svm_predict_values(const struct svm_model *model, const struct svm_node *x, double* dec_values); double svm_predict(const struct svm_model *model, const struct svm_node *x); double svm_predict_probability(const struct svm_model *model, const struct svm_node *x, double* prob_estimates); void svm_free_model_content(struct svm_model *model_ptr); void svm_free_and_destroy_model(struct svm_model **model_ptr_ptr); void svm_destroy_param(struct svm_parameter *param); const char *svm_check_parameter(const struct svm_problem *prob, const struct svm_parameter *param); int svm_check_probability_model(const struct svm_model *model); //void svm_set_print_string_function(void (*print_func)(const char *)); #ifdef __cplusplus } #endif void svm_set_print_string_function(void (*print_func)(const char *)); #endif /* _LIBSVM_H */ e1071/src/cshell.c0000755000175100001440000001766714173734135013266 0ustar hornikusers/*****************************************************************/ /* * Copyright (C)2000 Evgenia Dimitriadou * * * This program 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 2 of the License, or * (at your option) any later version. * * This program 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 this program; if not, write to the Free Software * Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA. */ #include #include #include "R.h" int subcshell(int *xrows, int *xcols, double *x, int *ncenters, double *centers, int *itermax, int *iter, int *verbose, int *dist, double *U, double *UANT, double *f, double *ermin, double *radius, int *flag) { int k, col, i, m, n ; double serror; /*convergence parameters*/ double epsi1, epsi2, conv; double sum2; double temp,tempu, tempu1, tempu2, distance; int j; double suma; double exponente; /* *ermin=0.0;*/ serror=0.0; sum2=0; if ((*flag==0) || (*flag==5)){ /* UPDATE CENTERS*/ for(i=0;i<*ncenters;i++) { sum2=0; for(col=0;col<*xcols;col++) centers[i+(*ncenters)*col]=0.0; for(k=0;k<*xrows;k++) { temp=pow(U[k+(*xrows)*i],*f); sum2=sum2+temp; for(col=0;col<*xcols;col++) { centers[i+(*ncenters)*col]+= temp*x[k+(*xrows)*col]; } } for(col=0;col<*xcols;col++) centers[i+(*ncenters)*col]/=sum2; } /*UPDATE radius*/ for(i=0;i<*ncenters;i++) { sum2=0; radius[i]=0.0; for(k=0;k<*xrows;k++) { distance=0.0; temp=pow(U[k+(*xrows)*i],*f); sum2=sum2+temp; for(col=0;col<*xcols;col++) { if (*dist==0){ distance+= (x[k+(*xrows)*col]-centers[i+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); } else if(*dist ==1){ distance+=fabs(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); } } if (*dist==0){ radius[i]+= temp*sqrt(distance);} else if(*dist ==1){ radius[i]+= temp*distance;} } radius[i]/=sum2; } }/*flag=0*/ /*update UANT*/ for(i=0;i<*ncenters;i++){ for(k=0;k<*xrows;k++){ UANT[k+(*xrows)*i]=U[k+(*xrows)*i];}} /* UPDATE Membership Matrix */ exponente=2.0/(*f-1.0); for(i=0;i<*ncenters;i++) { for(k=0;k<*xrows;k++) { suma=0; for(j=0;j<*ncenters;j++) { tempu=0; tempu1=0; tempu2=0; for (col=0;col<*xcols;col++) { if (*dist==0){ tempu1+=(x[k+(*xrows)*col]-centers[i+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=(x[k+(*xrows)*col]-centers[j+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } else if(*dist ==1){ tempu1+=fabs(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=fabs(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } } if (*dist==0){ tempu=fabs(sqrt(tempu1)-radius[i])/fabs(sqrt(tempu2)-radius[j]); } else if(*dist ==1){ tempu=fabs((tempu1-radius[i])/(tempu2-radius[j])); } suma=suma+pow(tempu,exponente); } U[k+(*xrows)*i]=1.0/suma; } } /*ERROR MINIMIZATION*/ epsi1=0.002; epsi2=0.2; conv=0.0; for (m=0;m<*ncenters;m++){ for (k=0;k<*xrows;k++){ serror = 0.0; for(n=0;n<*xcols;n++){ if(*dist == 0){ serror += (x[k+(*xrows)*n] - centers[m+(*ncenters)*n])*(x[k+(*xrows)*n] - centers[m +(*ncenters)*n]); } else if(*dist ==1){ serror += fabs(x[k+(*xrows)*n] - centers[m + (*ncenters)*n]); } } if (*dist == 0){ serror=fabs(sqrt(serror)-radius[m]);} else if(*dist ==1){ serror=fabs(serror-radius[m]);} *ermin+=pow(U[k+(*xrows)*m],*f)*pow(serror,2); /* *ermin=*ermin/(*xrows));*/ /*Convergence check*/ conv += fabs(U[k+(*xrows)*m]-UANT[k+(*xrows)*m]); } } if (conv<= ((*xrows)*(*xcols)*epsi1)){ *flag=2; if (*verbose){ Rprintf("Iteration: %3d converged, Error: %13.10f\n",*iter,conv); }} else if (conv<= ((*xrows)*(*xcols)*epsi2)){ if (*verbose){ Rprintf("Iteration: %3d Epsi2: %13.10f\n",*iter,conv);} if (*flag==3) *flag=4; else *flag=1; } else if(*flag==3) *flag=5; if (*verbose){ Rprintf("Iteration: %3d Error: %13.10f\n",*iter,*ermin/(*xrows)); } return 0; } int cshell(int *xrows, int *xcols, double *x, int *ncenters, double *centers, int *itermax, int *iter, int *verbose, int *dist, double *U, double *UANT, double *f, double *ermin, double *radius, int *flag) { int k; int i,j,col; double suma,tempu,exponente,tempu1,tempu2; exponente=2.0/(*f-1.0); /* *flag=0;*/ if (*flag==0){ *iter=0; /*Initialize Membership Matrix */ for(i=0;i<*ncenters;i++) { for(k=0;k<*xrows;k++) { suma=0; for(j=0;j<*ncenters;j++) { tempu=0; tempu1=0; tempu2=0; for (col=0;col<*xcols;col++) { if (*dist==0){ tempu1+=(x[k+(*xrows)*col]-centers[i+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=(x[k+(*xrows)*col]-centers[j+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } else if(*dist ==1){ tempu1+=fabs(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=fabs(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } } if (*dist==0){ tempu=fabs(sqrt(tempu1)-radius[i])/fabs(sqrt(tempu2)-radius[j]); } else if(*dist ==1){ tempu=fabs((tempu1-radius[i])/(tempu2-radius[j])); } suma=suma+pow(tempu,exponente); } UANT[k+(*xrows)*i]=1.0/suma; } } for(i=0;i<*ncenters;i++) { for(j=0;j<*xrows;j++) U[j+(*xrows)*i]=UANT[j+(*xrows)*i]; } } while(((*iter)++ < *itermax) && ((*flag)!=1 && (*flag)!=2) && (*flag)!=4) { *ermin=0.0; subcshell(xrows, xcols, x, ncenters, centers, itermax, iter, verbose, dist, U, UANT, f, ermin, radius, flag); } return 0; } /*****************************************************************/ /*******only for prediction***************************************/ /*****************************************************************/ int cshell_assign(int *xrows, int *xcols, double *x, int *ncenters, double *centers, int *dist, double *U, double *f, double *radius) { int k, col, i; double tempu, tempu1, tempu2; int j; double suma; double exponente; exponente=2.0/(*f-1.0); for(i=0;i<*ncenters;i++) { for(k=0;k<*xrows;k++) { suma=0; for(j=0;j<*ncenters;j++) { tempu=0; tempu1=0; tempu2=0; for (col=0;col<*xcols;col++) { if (*dist==0){ tempu1+=(x[k+(*xrows)*col]-centers[i+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=(x[k+(*xrows)*col]-centers[j+(*ncenters)*col])*(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } else if(*dist ==1){ tempu1+=fabs(x[k+(*xrows)*col]-centers[i+(*ncenters)*col]); tempu2+=fabs(x[k+(*xrows)*col]-centers[j+(*ncenters)*col]); } } if (*dist==0){ tempu=fabs(sqrt(tempu1)-radius[i])/fabs(sqrt(tempu2)-radius[j]); } else if(*dist ==1){ tempu=fabs((tempu1-radius[i])/(tempu2-radius[j])); } suma=suma+pow(tempu,exponente); } U[k+(*xrows)*i]=1.0/suma; } } return 0; } e1071/src/Rsvm.c0000755000175100001440000002754614173734134012737 0ustar hornikusers #include #include #include #include #include #include "svm.h" #define Malloc(type,n) (type *)malloc((n)*sizeof(type)) /* * results from cross-validation */ struct crossresults { double* results; double total1; double total2; }; struct svm_node ** sparsify (double *x, int r, int c) { struct svm_node** sparse; int i, ii, count; sparse = (struct svm_node **) malloc (r * sizeof(struct svm_node *)); for (i = 0; i < r; i++) { /* determine nr. of non-zero elements */ for (count = ii = 0; ii < c; ii++) if (x[i * c + ii] != 0) count++; /* allocate memory for column elements */ sparse[i] = (struct svm_node *) malloc ((count + 1) * sizeof(struct svm_node)); /* set column elements */ for (count = ii = 0; ii < c; ii++) if (x[i * c + ii] != 0) { sparse[i][count].index = ii + 1; sparse[i][count].value = x[i * c + ii]; count++; } /* set termination element */ sparse[i][count].index = -1; } return sparse; } struct svm_node ** transsparse (double *x, int r, int *rowindex, int *colindex) { struct svm_node** sparse; int i, ii, count = 0, nnz = 0; sparse = (struct svm_node **) malloc (r * sizeof(struct svm_node*)); for (i = 0; i < r; i++) { /* allocate memory for column elements */ nnz = rowindex[i+1] - rowindex[i]; sparse[i] = (struct svm_node *) malloc ((nnz + 1) * sizeof(struct svm_node)); /* set column elements */ for (ii = 0; ii < nnz; ii++) { sparse[i][ii].index = colindex[count]; sparse[i][ii].value = x[count]; count++; } /* set termination element */ sparse[i][ii].index = -1; } return sparse; } /* Cross-Validation-routine from svm-train */ void do_cross_validation(struct svm_problem *prob, struct svm_parameter *param, int nr_fold, double* cresults, double* ctotal1, double* ctotal2) { int i; int total_correct = 0; double total_error = 0; double sumv = 0, sumy = 0, sumvv = 0, sumyy = 0, sumvy = 0; /* random shuffle */ GetRNGstate(); for(i=0; il; i++) { int j = i+((int) (unif_rand() * (prob->l-i)))%(prob->l-i); struct svm_node *tx; double ty; tx = prob->x[i]; prob->x[i] = prob->x[j]; prob->x[j] = tx; ty = prob->y[i]; prob->y[i] = prob->y[j]; prob->y[j] = ty; } PutRNGstate(); for(i=0; il/nr_fold; int end = (i+1)*prob->l/nr_fold; int j,k; struct svm_problem subprob; subprob.l = prob->l-(end-begin); subprob.x = Malloc(struct svm_node*,subprob.l); subprob.y = Malloc(double,subprob.l); k=0; for(j = 0; j < begin; j++) { subprob.x[k] = prob->x[j]; subprob.y[k] = prob->y[j]; ++k; } for(j = end; jl; j++) { subprob.x[k] = prob->x[j]; subprob.y[k] = prob->y[j]; ++k; } if(param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR) { struct svm_model *submodel = svm_train(&subprob,param); double error = 0; for(j=begin;jx[j]); double y = prob->y[j]; error += (v-y)*(v-y); sumv += v; sumy += y; sumvv += v*v; sumyy += y*y; sumvy += v*y; } svm_free_and_destroy_model(&submodel); /* printf("Mean squared error = %g\n", error/(end-begin)); */ cresults[i] = error/(end-begin); total_error += error; } else { struct svm_model *submodel = svm_train(&subprob,param); int correct = 0; for(j=begin;jx[j]); if(v == prob->y[j]) ++correct; } svm_free_and_destroy_model(&submodel); /* printf("Accuracy = %g%% (%d/%d)\n", */ /* 100.0*correct/(end-begin),correct,(end-begin)); */ cresults[i] = 100.0*correct/(end-begin); total_correct += correct; } free(subprob.x); free(subprob.y); } if(param->svm_type == EPSILON_SVR || param->svm_type == NU_SVR) { /* printf("Cross Validation Mean squared error = %g\n",total_error/prob.l); printf("Cross Validation Squared correlation coefficient = %g\n", ((prob.l*sumvy-sumv*sumy)*(prob.l*sumvy-sumv*sumy))/ ((prob.l*sumvv-sumv*sumv)*(prob.l*sumyy-sumy*sumy)) ); */ *ctotal1 = total_error/prob->l; *ctotal2 = ((prob->l * sumvy - sumv * sumy) * (prob->l * sumvy - sumv*sumy)) / ((prob->l * sumvv - sumv * sumv) * (prob->l * sumyy - sumy * sumy)); } else /* printf("Cross Validation Accuracy = %g%%\n",100.0*total_correct/prob.l); */ *ctotal1 = 100.0 * total_correct / prob->l; } void svmtrain (double *x, int *r, int *c, double *y, int *rowindex, int *colindex, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, double *cost, double *nu, int *weightlabels, double *weights, int *nweights, double *cache, double *tolerance, double *epsilon, int *shrinking, int *cross, int *sparse, int *probability, int *nclasses, int *nr, int *index, int *labels, int *nSV, double *rho, double *coefs, double *sigma, double *probA, double *probB, double *cresults, double *ctotal1, double *ctotal2, char **error) { struct svm_parameter par; struct svm_problem prob; struct svm_model *model = NULL; int i; const char* s; /* set parameters */ par.svm_type = *svm_type; par.kernel_type = *kernel_type; par.degree = *degree; par.gamma = *gamma; par.coef0 = *coef0; par.cache_size = *cache; par.eps = *tolerance; par.C = *cost; par.nu = *nu; par.nr_weight = *nweights; if (par.nr_weight > 0) { par.weight = (double *) malloc (sizeof(double) * par.nr_weight); memcpy(par.weight, weights, par.nr_weight * sizeof(double)); par.weight_label = (int *) malloc (sizeof(int) * par.nr_weight); memcpy(par.weight_label, weightlabels, par.nr_weight * sizeof(int)); } par.p = *epsilon; par.shrinking = *shrinking; par.probability = *probability; /* set problem */ prob.l = *r; prob.y = y; if (*sparse > 0) prob.x = transsparse(x, *r, rowindex, colindex); else prob.x = sparsify(x, *r, *c); /* check parameters & copy error message */ s = svm_check_parameter(&prob, &par); if (s) { strcpy(*error, s); } else { /* call svm_train */ model = svm_train(&prob, &par); /* set up return values */ /* for (ii = 0; ii < model->l; ii++) for (i = 0; i < *r; i++) if (prob.x[i] == model->SV[ii]) index[ii] = i+1; */ svm_get_sv_indices(model, index); *nr = model->l; *nclasses = model->nr_class; memcpy (rho, model->rho, *nclasses * (*nclasses - 1)/2 * sizeof(double)); if (*probability && par.svm_type != ONE_CLASS) { if (par.svm_type == EPSILON_SVR || par.svm_type == NU_SVR) *sigma = svm_get_svr_probability(model); else { memcpy(probA, model->probA, *nclasses * (*nclasses - 1)/2 * sizeof(double)); memcpy(probB, model->probB, *nclasses * (*nclasses - 1)/2 * sizeof(double)); } } for (i = 0; i < *nclasses-1; i++) memcpy (coefs + i * *nr, model->sv_coef[i], *nr * sizeof (double)); if (*svm_type < 2) { memcpy (labels, model->label, *nclasses * sizeof(int)); memcpy (nSV, model->nSV, *nclasses * sizeof(int)); } /* Perform cross-validation, if requested */ if (*cross > 0) do_cross_validation (&prob, &par, *cross, cresults, ctotal1, ctotal2); /* clean up memory */ svm_free_and_destroy_model(&model); } /* clean up memory */ if (par.nr_weight > 0) { free(par.weight); free(par.weight_label); } for (i = 0; i < *r; i++) free (prob.x[i]); free (prob.x); } void svmpredict (int *decisionvalues, int *probability, double *v, int *r, int *c, int *rowindex, int *colindex, double *coefs, double *rho, int *compprob, double *probA, double *probB, int *nclasses, int *totnSV, int *labels, int *nSV, int *sparsemodel, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, double *x, int *xr, int *xrowindex, int *xcolindex, int *sparsex, double *ret, double *dec, double *prob) { struct svm_model m; struct svm_node ** train; int i; /* set up model */ m.l = *totnSV; m.nr_class = *nclasses; m.sv_coef = (double **) malloc (m.nr_class * sizeof(double*)); for (i = 0; i < m.nr_class - 1; i++) { m.sv_coef[i] = (double *) malloc (m.l * sizeof (double)); memcpy (m.sv_coef[i], coefs + i*m.l, m.l * sizeof (double)); } if (*sparsemodel > 0) m.SV = transsparse(v, *r, rowindex, colindex); else m.SV = sparsify(v, *r, *c); m.rho = rho; m.probA = probA; m.probB = probB; m.label = labels; m.nSV = nSV; /* set up parameter */ m.param.svm_type = *svm_type; m.param.kernel_type = *kernel_type; m.param.degree = *degree; m.param.gamma = *gamma; m.param.coef0 = *coef0; m.param.probability = *compprob; m.free_sv = 1; /* create sparse training matrix */ if (*sparsex > 0) train = transsparse(x, *xr, xrowindex, xcolindex); else train = sparsify(x, *xr, *c); /* call svm-predict-function for each x-row, possibly using probability estimator, if requested */ if (*probability && svm_check_probability_model(&m)) { for (i = 0; i < *xr; i++) ret[i] = svm_predict_probability(&m, train[i], prob + i * *nclasses); } else { for (i = 0; i < *xr; i++) ret[i] = svm_predict(&m, train[i]); } /* optionally, compute decision values */ if (*decisionvalues) for (i = 0; i < *xr; i++) svm_predict_values(&m, train[i], dec + i * *nclasses * (*nclasses - 1) / 2); /* clean up memory */ for (i = 0; i < *xr; i++) free (train[i]); free (train); for (i = 0; i < *r; i++) free (m.SV[i]); free (m.SV); for (i = 0; i < m.nr_class - 1; i++) free(m.sv_coef[i]); free(m.sv_coef); } void svmwrite (double *v, int *r, int *c, int *rowindex, int *colindex, double *coefs, double *rho, int *compprob, double *probA, double *probB, int *nclasses, int *totnSV, int *labels, int *nSV, int *sparsemodel, int *svm_type, int *kernel_type, int *degree, double *gamma, double *coef0, char **filename) { struct svm_model m; int i; char *fname = *filename; /* set up model */ m.l = *totnSV; m.nr_class = *nclasses; m.sv_coef = (double **) malloc (m.nr_class * sizeof(double*)); for (i = 0; i < m.nr_class - 1; i++) { m.sv_coef[i] = (double *) malloc (m.l * sizeof (double)); memcpy (m.sv_coef[i], coefs + i*m.l, m.l * sizeof (double)); } if (*sparsemodel > 0) m.SV = transsparse(v, *r, rowindex, colindex); else m.SV = sparsify(v, *r, *c); m.rho = rho; m.label = labels; m.nSV = nSV; if (*compprob) { m.probA = probA; m.probB = probB; } else { m.probA = NULL; m.probB = NULL; } /* set up parameter */ m.param.svm_type = *svm_type; m.param.kernel_type = *kernel_type; m.param.degree = *degree; m.param.gamma = *gamma; m.param.coef0 = *coef0; m.free_sv = 1; /* write svm model */ svm_save_model(fname, &m); for (i = 0; i < m.nr_class - 1; i++) free(m.sv_coef[i]); free(m.sv_coef); for (i = 0; i < *r; i++) free (m.SV[i]); free (m.SV); } e1071/vignettes/0000755000175100001440000000000014533657007013047 5ustar hornikuserse1071/vignettes/svm.pdf0000755000175100001440000006265414173734135014365 0ustar hornikusers%PDF-1.2 %쏢 4 0 obj <> stream xKv˒4߿f@5EBb܂elctvC7Fzۻ긏XoF░~Oo(~?n{]ןҿ{@&߭~: BV>ZEѴߜ2R(=hߥPv 9>]m TϷޱ!} = S%|oB$/dh,&dʌ)ۜM&{>BZSȝiu#I]x}!s d}?K G2}W@FxAo{}ݰF3k.Z5?kuXK{U_ccl8ri-^p=/ y^DJ_v٘/ۆlD{j/˔iʸ>_q|P6+c+f{z|qrO{qd6_Jg$̏T ,aVP،Ih0 fRܖ弯W{R|]8jrJqd 5+I[WNۦk];v6rf߹эX7 p73e[*.?>ﯕO_튲;LA0hB?}r^g^mOʿZ1y7~'wx^:^+jz i-/OW!XUZZҊFuidUӾ鈬W\LǿnUMJ?39 GL?Ls$iRit#r!KinEEsu@ewǛ+As5x4/T JjM]Fo'.4ا SڸSGB88`(B̀8*qr(/.,ѹ5sDx]Y<,PbVѹ[ߎ@L4nVp Qbm Dl46~]M/3dᆌynh'/ƾ`{Y0_}6}_:#m;TwV޽}U`]yUce*Ф+S^wG"}&FğD{" ޗ΋yc.Slcp_缝UiOfaorC$0F>6WŸ8,fVRl5Cي] h*6ԬmbFEэ*Laņ`D~X!n)cm,f oƮR1R\M]?.҉gE36\ jU`s<«U&QyMry)9r]n%3emutge'o^|ԼV3C*_;LJdrV"~yWld!G&U: ٛY3ɬչcen:uck@)++YIB̏W1ME&c*=c&`c&c1LPǂ0E5 oJ7o+dW@NX\9Assud*IժQk^W"\;`rlar'DC2]D~|Z7?[~uxgv:r4|ի_//< _iIĸ}-qU8˥m8ul_p_Z;I,w\" Kt eL@>F+ VA\I0!w8g ݋\r y \6]+!V_g\  z#sOPTᮃC1X9D K83Euu@Tbk@X"y` /8ĆlyT\5vbJ\S]e ͡+e-<$FƹGiҙj?9x")x6U}!j Qt'(s.w>B> >Q.}\wM75ok'LN&\9tt=Tk ۵hdcDٍB3` V1uXِ6v^}:<\}C\s]ų_|C/Pj+*1׾zK/f{V!\:6eNs&zzmxzzBmʅY7y|;%Dt8?Aȩ/HCO}CW__= pIsaAiqP*O8D(״$Z"yd]Lt['oAu'hU3{BuLlHYq̍[Ub$&g@</ 064 Ew[^g.(-,שXk?`u5Gt'k,s-ܤK?'d)e!FnkYZ`dW_俦  ">,\b5+;i ƲK625gͬ8t@3D&d~ ʳ@l"/63s04kab:DyXwS 75bT "Ptb+hT\ЛISALMJ1ld=XԿsfBO|ɆUL~|3?xwkݿm/D1[!O5@1_Vgk]/{A$0>A*{\7sSaW[=͜%aV  By w-呐98gϻ :䍏SI $ {rkG!\* t9;Ms|sO9ћd.vNq̀9>'KĚ%G@/!Ž█ޏ4.g}zt-#k H,*#ueVoMy<*'p[zd4ёF%m)3!^rLmtچ؇ AE Lʕ9M7jĈ4fmMr6򀬞 }f*^~e HԹ 4@i*W~5"x {E\6æW|hU4 ~C#7wv=iw˕[;2%<9(VP0ڛc.W\gGH@q!ϡP=: :Qa@LxTO\ 6MWÑWquYIE`EtpFZUD, e:_곾z!]\*g8FC%dوpKղQ[lBL0& xWrrWr[ `+R233pY1#cj D&>.O53Ef !Sn\vϟO<=X7n^=]ȃ/5,xM˸^ pMj =b5jV?5 BpChyw[1f:b i 1#cfY\# `A k3s̈pά22)33.R̝fYԑkzpIGMZ_1TuXt5k])y} _[)(2~]/*)f,8!0cyaD{T7>^9Ǣۍ?ΣqBbf6;`=sy49I]dd b+|"R*CD%"R*UfI\MKa9VwXu3+|L ptiɵӛk@ISNG]:>vqldjήb=8?ya,KR\r|X2?x ȴ@$öt_kKݰ/%O|9{Gi#1>rqx89.cyoM!lFff==]CgO|tOS#W}|BA8|+gC:p*ir⼧ &~#˩V5 n*\ w17H)~^G w=>ˁ83+Di(4_Mj Y~ .D/7Xr6feCZrkpDd!] Ae/O i<2fR"(~q|^sX=\R"Vb-; Z)^18>'"RLAe,Y@'ė(ggr+Ɏ;I"r 2JHi? oBp͍W3vf ^πy;{g"Bvdh2_O3~:$2s[-żPk.w(E]. eYݶtR5m純O#9ݽd469l6Z%9MaQϩqNs5昰P{fL p/* :s9eoJ@Թcp "**Vtgit*0 DIM 9JwZNiU Ķ3]k&HtS $SmAl MEњu6Md8u0i`0΄n8[!.Rr~Y3_w ˻-"q/;G_OU|r!xЀm;4a˃ )ކQc/&V6>bYYd :b6 6%=A˹6U*q:N#7YYp F#ö\m0!^@ҷpM[DmH6*;itrݠR!%P٩*D xh$D74 ;@LAC]LdGY'FC)!O(m=R"Qz=!_41#΃㱌U* TADcnL p%*nx&q]@8"5Rϸ\ytU" ۭeiU:bA9k "Z/4}a]DXZO5=O&Aw:PDkUb[==@wEU}2]WI,UBm! |/z/jX׺ < H$dݫH%d<{ZC3cc0m#.mK{Fߟ+֭j3[є;~^oy$4<ŎNKqb4zSdZt1kzȺ( 8S'p|M%92"rŦצ]9tJvz9uss,}n8\s . NqahwZx:yd|(zȨ}zki~UoVjd@hO^Gh@K(O0Ӭ\Ģk=Gˆ3T#yVX$RwW`x|D,Y*dgiW| XHU4bVSS ʃc爬5Y&Eu!V s6a]?=Čx99T F8Z4D7Vqs8|1xcp@h"a^npXNI\a'f&z@j x9%@_љyp3z2@Xge@/"I$eJi>xPc݃slc bD-XFđ-{D%Dm_D7GADID$RD[EDdDmFdvDGEqZĢ7F1lSG؛1~ƙp9 agBG =ŬB/1Peg4Si5TNSY>j741,WN"QKA%L 4TZ4m)`SCԃL;+ijC0[n`pKŅLJ5m-R<"G˪G/^VY|s'=I4޼qzhhWo2 =JlVQEhQ9L+ppCBxCf< aQhKǵ?5NnɅ9I E_1S k fSFά9S"Wl&lͮކ1K]S@2+p\7˽h8sZC5N ~`\N␵(dk0_MQS3_,_ Y ƘG }D(b7~6*^`őzqqF7xg$NȫzRk9Y@ږ[uAy{]&Kd*G,&Bjq&HۋhEؕK&~~dU/&V6>hcO100 4b?ԓ`,鏂(9yiq'9cH#Kl蘕t$7R? Ya/  Z ӹ*:w16_-=,2}AW 2-aVzјƧ3`6iB8uXRbkLmj-6d`**HXj8SA0rMu 0Lb;T|0ZΎn&8Ǻ)\sY$.Š1a:*,|:,Kȿ:~z| vF:-%/[6@6R/6iec647i$n 6_H &߃vopRAuj2>47[Uђ 8>`3Ho}C1xHj mD5b+Dw6y8SGfuu 18=x3w 7TŗBzZ<ٴ%\C8=ᖐ=@#U2 &i}Jhn$)kHD}Zбt|чǾ%֍BKD(d"2)!ȭ9&, CLp ҇gKpD@8qgچ34 3<8 `}p^BKІDoS~ivs J4 ̌jOW p[llgޤUEyLSݼFGh)豄\i[ɺlw{K>E:_LƃE?ڤK522v/ 7P QeG &w1B1 1S%dkCh&YHY̢`vYdҹ,42ށ!Qsձspq sP/:8IuP Ŵ- յZ8-nQEVE~-8i9~ {ʞZ?|bVʫJ PAΕn);EQ/aս|iTau:b7QGU(/kϜ<\P32kF^ͨ;DA7(fټvcT3 tQx?*٩xZw&@ɘ!*2dЪK=tyg71<]ج nf[\YB'YVN2lvZU;ﴕV#>=qԒ)_Em_{}7 F{;J)gX(fT%Fν]{[@I𒔜{[[i9!rm_ir%nVS.A.౼_I,}ܣ д(MOJ44KN$<{O/  PIK$L gZ2-R.dYޣ$}]E2hb؅hܪ%"h$r R *1dz-T_PiǠZUAئcMvr}|:ygWݺpw ECX)&>>,'w(ȻEtd2'ݎ}R8˲d 3h skn/&V6>hcOW0glbH4ήJ("a$׋x4յ"Twj<⒁53OC%x==Q@OO-ŀhZӡX"-pU7]ƋzC~!53"*SƒnA%-{6j=5@[Dy|1YE~E>3\MtY@Uo>yxe1bmHD4.߭@{A{I[r$)ߕkP\^ qɼpAJсDkx;#/G,Q */'>H܁%/dqՃiOC}n!* 53ٙd,pg~Xc}6@\U$1bZa, 6GtڻV$oXrNx}h# JOǛ#&9Y"EhjOn$ $(;3bļ7fC`>&WγԕH\Oc\ ihYemR1g3`57VDtXQ bgLcV 64`)Ӓ87׃N*l]:iuw,tsF7c͈pv;mai~{9 qwv/[lƿiDdܿ Z (nKZ?E;_h~8䛍E8!Om*+<܃̓Tf 4:KɈ94A^潴g 63 [ %!1!2wbS]_p\=KR^/-K!"D%U U)Ʀ2_iPnZiTpT?ꈴiFƪWmC5V"!jT%JT혨U5hhղUcN#"?{]"~%NˏLGfWZXSy=*Gs~|@_E~kaZrqQyU1/G ސ%",Mpx~\I*dJ=x\K\/DU5 k8nbZm \kQQy-<-_;ǬvB4tVJp*txmVpJEa-~{V7L1,* .KU< _**`Ixpy qi7yht' ayk(Đg 'JJٔ6ww83!C$+z@6GYnAƘ]!g5%bHڠopL^#įk[.{!WcI}X0TZyMk;;_{yos4_$yԶTL i^:SAk(;=yeIxY&4˥~5\|p \ho08@Y $Dݭp@ b1ʤW6MsV }-=U,i-}:|#4 NPa #8XIOFP|EбzWhc"hoTFb@4~Y3WddSXD@4MEU",czWTə5S%/X-㱢&cMΨSZ'J)(ĴVPk64~N!bM:QuwM5k}C UtpvvYM ad~;8IݦV5fٵG.GW[9z˺xS$BCҋEhqna7 8XJ3C? *[eHB'ŕ&jrWSQBFjጌuo^Ejdб;/ÀWx/[ɵývxoEg9oū$u+TZ(V|錶O3ڊKgt4Vf/ouw++ͤK~XA5Vr3#JG2؊'YNjG "@7"/QO^}m&&sr˳DV{-xXᝯ;k~ٲ׶)[7lfl// vW/hK{"#} HM˧%rkd'kԙ)aA=8)gX GLs6GU@cf-5\L@xWCn$J5YI|\ 6@Y<ލl]u^,|^ |5/ikΘ(v>V-vjhPA]QJ2FMUoقઆ5QV+ ht[4>h_4-XhhQ"Hj_4Pf,Z7~Ҍ`hBHR0?ALR% l;73s04Ka":x,IXv51bL Pd⺫F:oNn$]O:ٚ*uvm 9ĕ3+vg4WΌf8o foj=kVa8x崿^]8q䛍E8!O-5y2҇?3D }BяR͙+OE. !dk[@ Sxs.LpɍQ+S+ނYS9noT^y$#w5[! ;P Zq 켘-z<S3C 2bԠL5'4oAf"E#>R9ffM0-4M4ՓfȣeVƫU_jLe,?A {#Wq]!_asD F^yIzKVS6}A\yMJ˼'?r2|ʩ} J7Cvj[X@5Ns )dխs3[?0Y E&(;œ_gɊ_i#s4ǝc:c}[Hr sղ"*CU%]WaJ4~1EiT8J4!mZ CEljU5戴2L_N 3Th1(Ugi xm\;kw39ԭb,0iI+g+T`=u1UPNYfc9/|W|{$N=q'8+_?Vy4 Dod'l,I>4?6H826A+: PX1W)՘#YHۻ@*n^{ڴ=T:-gnTUar)o}k!6&vԒ"Io,%aR,0?,WWߛU5Hᘎ]}!jB3akGBP2bJOyo`S*3nn;DYIUGmIzgq;Fx%q#hG&n`n="BC̚R6C+}J_Bu肆 7 u+B<˪A OY 1?fT m~rR#_J%fV 3ijI$ejWzpJ(LPKMX\b?TZz^t24o{>.<$\*7|y1e[kr,@CD5>^Nq,^F0oKVϫG+;Ł ^u~uk kEl4i ,x7D>qM$@/ŋ,iAdW||?3*ڷuyJEAJLuLKO4zSͺB8Ws)^~dK~Z'⅋ wtb+}{ DJcLXb.n2#ᇈ`2]/X@Cԓ7D$O=f!/qW3' 5qŚֈ%zxs}!IǪXT <t,;%1Z =q&jH< OCpӦȹwtTS(T.cA=Y,62n jg_'tTo> VJ/;0]яPːXh%o9)SaU]#y1^Po#,o4$w’S|h$j\/XULz_#Fjge+'4ʒ8SD`2HQ>,xKm- I8gL[N6<1KFl.xr EXL1Ha%c뮭+,\|`̇U䨁~54"+Zpp5 S| E&\M0jp(H#8FP.0 <`_q#Z7(>'1$I$G <ymb>=4H1IhM̌z Eژ7A-ɹCRƟ"G4bIBI;`Er,Fb8JzEwRbv4{(\P],ATx7\h#ϻK9e/Kx+@C̣(Lk%(:\K |IkYLo4yN7el0-S9v&'߸ ~a!b(z%](4M]:j8 L!Ed( -yx"J`>Bg넹ʅ7iImu !_"PbNg ܫNFb!Ƽ}\\4>)>B+*s,qAFn.C W+G4_ 1xJK?h `U Jj3R;_I}CJALVMo,l3C=(u00gF(bC'v" !F㿉v-ρI|Bu6>K aԧpL?7eۏl;m*^=ko| z>^14OPCb\Z5 )8U_k$a0j&KGʼnÆ/ňYYװ:BԿo|'e] B \,//=wդįl Sk4^A"]aCCҶU'[op­z>iVIЀfG%0qEԂh6Jp%H݁K S /tB?;o 4Lfl^IAkΑ?Gvg^_Hg= xWE2hP/ӌ9ƛhΒ.If\]:@o*|D+xu.yJ:T}rwIg G:rQ cSdƐphoF☵/JliנhIUQc:J~/$._t3V"hD ~yv;\JiiĴOY⤯x6!w"i:4OMb>BCiEG:z超|?ԫA#%^4ԋ)XB" _ܣ|SH̎Hm  6o|Ȏǧe}:*|V3'랏$` nb\(%8?kDԒX4g.+E\e|UW\ҲCMՓؼ_OCC:WQxU<Պ>6PPn7qL3hY+^xJPsK)tQ7p1^xcc nGb70vԴPa>{}~!",J*\|&ݠjMѯ_W%*Mʟܗ.B@zƔhDڞԣ|HK`y9 pe2@'_ZbAfл(d/V5t'ۊ19/Y  ne~Ŵzǂ=rOBbT ~6<>%)2 5~^򰶷$k -՗=(įzd-۴wψًakSqav,XixFmgKHTB04_8E&kI!ڵܾc y1Ir*"^'V5 cm8ѫQ_H?Al o|Ďg]?7A\k{W*oVE.-Z|E(tҲXeim(^>gNv4hO#:><,U%SCý=Qfd2t63+7F<'n83`#q|,nug҉ih71`C&]ż_+ A=."7!I',%lmi5{G{[Py;D?;ԯ>"iVGORTF:C:Zo!p!_`g{\W-|/4jRYi fNo3 Nv@21MYyi_iAചBȑa ZU)RᎭkn߫.ֺic؋Z>ֻHo9Ѷ<}vonc:rYYV:oʋKm#AOWGKGMB\/;[-yoV:$)f fߣi9;${-F=1{_ ;y<yY_1_MzϞ vkP5>iL쩶ߊu=NKE֏| UjP*nNQxULDS$R%w$-cvf^H|'PP?Mo^[$T~Dw#d;P~zižUpLXW(_}_?̊JX kRoxM~-o>kZ1@ { 7G&)XѯfhK3tAګŽZlԎ/VD>嫏Hhf>NN.UTn=g&~bޛ@cʼ@>)DWRWzHKʺ,uHs?"G-1=3rHs~545%PD;} CZ)_}Dv/f>qHFsuH WWI2>i}|<1uHKUXIii44]^xi0y$F#'x%w=M{k?[` ]8*}+ʉ,pˁ->6m?fYYA=ڐ&q|ppzqDpKk~jD7E+^8*f %@`丏<Y,ٕ@2bv OotSB' m~h{X]N&i>4WSpEj*%$wX y,{ü;ԏ>vx)ovOI&RG0vԉḄOʻ7JBIf"Fai]tLuJs)%Ѷ3NWjcҶ>^Is5wCuc|G]e$)_HFΞzR"(:"25?(GSuU h$Co{Exn)R;.rMx7>dӲbտ F6F|e sv#H-)jhbjiGt[h[3DƤmmgk8 IGj´\ ٶp P[I 4-YVY\w̍9VF0-soA $@}4j`1XIi_y(bc\,V/Y GNB XH x٩V}[h_:Z[1;Okޫ~1i[b K~?|ĵXÿ~-w_pA?_GA ls{?':hX2~rn|k9wcvO]ѿFR'Ck\I[!էAA A+̢\K}!3Nԯ[VM|˭Cm kU䀘o M:xC!NTgTL{d(D$T9K(,4;3'Wm1\Il)Yʋ/#^1j>ZiM-A;B[~o`;@`#"/i%Z}^,|5_HV_wgSPv? r5w |.&?~ȭ9",s1['o{JIC'mWZkz“+SEץ`5ڙRƫњ|`+^RZI٥jtP l^5giS)&*dI)GԕZO΢SJzwH(qp>ж>x\*ռ({J/R2hBߌrͯE){.:㫫9+RG ӟ _ug\(5dDZnB~?䉖.Cs<W磔Ec [Ϧ㕀[}ϫlzBL jC5Bt|y 8u|R]ǒD4(/+ oTK‘6RAjb&K胄(kE*\޴>Ј$4+zSendstream endobj 5 0 obj 25267 endobj 3 0 obj << /Type /Page /MediaBox [0 0 486 481] /Parent 2 0 R /Resources << /ProcSet [/PDF /Text] /Font << /R6 6 0 R >> >> /Contents 4 0 R >> endobj 6 0 obj <> endobj 2 0 obj << /Type /Pages /Kids [ 3 0 R ] /Count 1 >> endobj 1 0 obj << /Type /Catalog /Pages 2 0 R >> endobj 7 0 obj << /CreationDate (D:20011015154900) /Producer (Aladdin Ghostscript 5.50) >> endobj xref 0 8 0000000000 65535 f 0000025651 00000 n 0000025592 00000 n 0000025373 00000 n 0000000015 00000 n 0000025352 00000 n 0000025521 00000 n 0000025700 00000 n trailer << /Size 8 /Root 1 0 R /Info 7 0 R >> startxref 25791 %%EOF e1071/vignettes/svminternals.Rnw0000755000175100001440000001611314173734135016267 0ustar hornikusers\documentclass[a4paper]{article} \usepackage{hyperref, graphicx, color, alltt,a4wide} \usepackage{Sweave} \newcommand{\pkg}[1]{\texttt{#1}} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \begin{document} %\VignetteIndexEntry{svm() internals} %\VignetteDepends{xtable} %\VignetteKeywords{classification, regression, machine learning, benchmarking, support vector machines} %\VignettePackage{e1071} \SweaveOpts{engine=R,eps=FALSE} \setkeys{Gin}{width=0.8\textwidth} \title{\texttt{svm()} internals\\ \large Some technical notes about the \texttt{svm()} in package \pkg{e1071}} \author{by David Meyer\\ FH Technikum Wien, Austria\\ \url{David.Meyer@R-Project.org} } \maketitle \sloppy This document explains how to use the parameters in an object returned by \texttt{svm()} for own prediction functions. \section{Binary Classifier} For class prediction in the binary case, the class of a new data vector $n$ is usually given by \emph{the sign} of \begin{equation} \sum_i{a_i y_i K(x_i, n)} + \rho \end{equation} \noindent where $x_i$ is the $i$-th support vector, $y_i$ the corresponding label, $a_i$ the corresponding coefficiant, and $K$ is the kernel (for example the linear one, i.e. $K(u,v) = u ^{\top} v$). Now, the \texttt{libsvm} library interfaced by the \texttt{svm()} function actually returns $a_i y_i$ as $i$-th coefficiant and the \emph{negative} $\rho$, so in fact uses the formula: \[ \sum_i{\mathrm{coef}_i K(x_i, n)} - \rho \] \noindent where the training examples (=training data) are labeled \{1,-1\} (!). A simplified \textsf{R} function for prediction with linear kernel would be: \begin{smallexample} svmpred <- function (m, newdata, K=crossprod) \{ ## this guy does the computation: pred.one <- function (x) sign(sum(sapply(1:m$tot.nSV, function (j) K(m$SV[j,], x) * m$coefs[j] ) ) - m$rho ) ## this is just for convenience: if (is.vector(newdata)) newdata <- t(as.matrix(x)) sapply (1:nrow(newdata), function (i) pred.one(newdata[i,])) \} \end{smallexample} \noindent where \texttt{pred.one()} does the actual prediction for one new data vector, the remainder is just a convenience for prediction of multiple new examples. It is easy to extend this to other kernels, just replace \texttt{K()} with the appropriate function (see the help page for the formulas used) and supply the additional constants. As we will see in the next section, the multi-class prediction is more complicated, because the coefficiants of the diverse binary SVMs are stored in a compressed format. \section{Multiclass-classifier} To handle $k$ classes, $k>2$, \texttt{svm()} trains all binary subclassifiers (one-against-one-method) and then uses a voting mechanism to determine the actual class. Now, this means $k(k-1)/2$ classifiers, hence in principle $k(k-1)/2$ sets of SVs, coefficiants and rhos. These are stored in a compressed format: \begin{enumerate} \item Only one SV is stored in case it were used by several classifiers. The \texttt{model\$SV-matrix} is ordered by classes, and you find the starting indices by using \texttt{nSV} (number of SVs): \begin{smallexample} start <- c(1, cumsum(model$nSV)) start <- start[-length(start)] \end{smallexample} \texttt{sum(nSV)} equals the total number of (distinct) SVs. \item The coefficients of the SVs are stored in the \texttt{model\$coefs}-matrix, grouped by classes. Because the separating hyperplanes found by the SVM algorithm has SVs on both sides, you will have two sets of coefficients per binary classifier, and e.g., for 3 classes, you could build a \emph{block}-matrix like this for the classifiers $(i, j)$ ($i$,$j$=class numbers): \begin{table}[h] \center \begin{tabular}{|c|c|c|c|} \hline i $\backslash$ j & 0 & 1 & 2 \\\hline 0 & X & set (0, 1)& set (0, 2)\\\hline 1 & set (1, 0) & X & set (1, 2)\\\hline 2 & set (2, 0) & set (2, 1) & X\\\hline \end{tabular} \end{table} \noindent where set(i, j) are the coefficients for the classifier (i,j), lying on the side of class j. Because there are no entries for (i, i), we can save the diagonal and shift up the lower triangular matrix to get \begin{table}[h] \center \begin{tabular}{|c|c|c|c|} \hline i $\backslash$ j & 0 & 1 & 2 \\\hline 0 & set (1,0) & set (0,1) & set (0,2) \\\hline 1 & set (2,0) & set (2,1) & set (1,2) \\\hline \end{tabular} \end{table} \noindent Each set (., j) has length \texttt{nSV[j]}, so of course, there will be some filling 0s in some sets. \texttt{model\$coefs} is the \emph{transposed} of such a matrix, therefore for a data set with, say, 6 classes, you get 6-1=5 columns. The coefficients of (i, j) start at \texttt{model\$coefs[start[i],j]} and those of (j, i) at \texttt{model\$coefs[start[j],i-1]}. \item The $k(k-1)/2$ rhos are just linearly stored in the vector \texttt{model\$rho}. \end{enumerate} \newpage \noindent The following code shows how to use this for prediction: \begin{smallexample} ## Linear Kernel function K <- function(i,j) crossprod(i,j) predsvm <- function(object, newdata) \{ ## compute start-index start <- c(1, cumsum(object$nSV)+1) start <- start[-length(start)] ## compute kernel values kernel <- sapply (1:object$tot.nSV, function (x) K(object$SV[x,], newdata)) ## compute raw prediction for classifier (i,j) predone <- function (i,j) \{ ## ranges for class i and j: ri <- start[i] : (start[i] + object$nSV[i] - 1) rj <- start[j] : (start[j] + object$nSV[j] - 1) ## coefs for (i,j): coef1 <- object$coefs[ri, j-1] coef2 <- object$coefs[rj, i] ## return raw values: crossprod(coef1, kernel[ri]) + crossprod(coef2, kernel[rj]) \} ## compute votes for all classifiers votes <- rep(0,object$nclasses) c <- 0 # rho counter for (i in 1 : (object$nclasses - 1)) for (j in (i + 1) : object$nclasses) if (predone(i,j) > object$rho[c <- c + 1]) votes[i] <- votes[i] + 1 else votes[j] <- votes[j] + 1 ## return winner (index with max. votes) object$levels[which(votes %in% max(votes))[1]] \} \end{smallexample} In case data were scaled prior fitting the model (note that this is the default for \texttt{svm()}, the new data needs to be scaled as well before applying the predition functions, for example using the following code snipped (object is an object returned by \texttt{svm()}, \texttt{newdata} a data frame): \begin{smallexample} if (any(object$scaled)) newdata[,object$scaled] <- scale(newdata[,object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", scale = object$x.scale$"scaled:scale" ) \end{smallexample} \noindent For regression, the response needs to be scaled as well before training, and the predictions need to be scaled back accordingly. \end{document} e1071/vignettes/svmdoc.Rnw0000644000175100001440000004346314325200144015025 0ustar hornikusers\documentclass[a4paper]{article} \usepackage{hyperref, graphicx, color, alltt} \usepackage{Sweave} \usepackage[round]{natbib} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newcommand{\pkg}[1]{\texttt{#1}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \begin{document} %\VignetteIndexEntry{Support Vector Machines---the Interface to libsvm in package e1071} %\VignetteDepends{e1071,randomForest,xtable} %\VignetteKeywords{classification, regression, machine learning, benchmarking, support vector machines} %\VignettePackage{e1071} \SweaveOpts{engine=R,eps=FALSE} \setkeys{Gin}{width=0.8\textwidth} \title{Support Vector Machines \footnote{A smaller version of this article appeared in R-News, Vol.1/3, 9.2001}\\ \large The Interface to \texttt{libsvm} in package \pkg{e1071}} \author{by David Meyer\\ FH Technikum Wien, Austria\\ \url{David.Meyer@R-Project.org} } \maketitle \sloppy ``Hype or Hallelujah?'' is the provocative title used by \cite{svm:bennett+campbell:2000} in an overview of Support Vector Machines (SVM). SVMs are currently a hot topic in the machine learning community, creating a similar enthusiasm at the moment as Artificial Neural Networks used to do before. Far from being a panacea, SVMs yet represent a powerful technique for general (nonlinear) classification, regression and outlier detection with an intuitive model representation. The package \pkg{e1071} offers an interface to the award-winning\footnote{The library won the IJCNN 2001 Challenge by solving two of three problems: the Generalization Ability Challenge (GAC) and the Text Decoding Challenge (TDC). For more information, see: \url{http://www.csie.ntu.edu.tw/~cjlin/papers/ijcnn.ps.gz}.} C++-implementation by Chih-Chung Chang and Chih-Jen Lin, \texttt{libsvm} (current version: 2.6), featuring: \begin{itemize} \item $C$- and $\nu$-classification \item one-class-classification (novelty detection) \item $\epsilon$- and $\nu$-regression \end{itemize} and includes: \begin{itemize} \item linear, polynomial, radial basis function, and sigmoidal kernels \item formula interface \item $k$-fold cross validation \end{itemize} For further implementation details on \texttt{libsvm}, see \cite{svm:chang+lin:2001}. \section*{Basic concept} SVMs were developed by \cite{svm:cortes+vapnik:1995} for binary classification. Their approach may be roughly sketched as follows: \begin{description} \item[Class separation:] basically, we are looking for the optimal separating hyperplane between the two classes by maximizing the \textit{margin} between the classes' closest points (see Figure \ref{fig:svm1})---the points lying on the boundaries are called \textit{support vectors}, and the middle of the margin is our optimal separating hyperplane; \item[Overlapping classes:] data points on the ``wrong'' side of the discriminant margin are weighted down to reduce their influence (\textit{``soft margin''}); \item[Nonlinearity:] when we cannot find a \textit{linear} separator, data points are projected into an (usually) higher-dimensional space where the data points effectively become linearly separable (this projection is realised via \textit{kernel techniques}); \item[Problem solution:] the whole task can be formulated as a quadratic optimization problem which can be solved by known techniques. \end{description} \noindent A program able to perform all these tasks is called a \textit{Support Vector Machine}. \begin{figure}[htbp] \begin{center} \includegraphics[width=8cm]{svm} \caption{Classification (linear separable case)} \label{fig:svm1} \end{center} \end{figure} Several extensions have been developed; the ones currently included in \texttt{libsvm} are: \begin{description} \item[$\nu$-classification:] this model allows for more control over the number of support vectors \cite[see][]{svm:scholkopf+smola+williamson:2000} by specifying an additional parameter $\nu$ which approximates the fraction of support vectors; \item[One-class-classification:] this model tries to find the support of a distribution and thus allows for outlier/novelty detection; \item[Multi-class classification:] basically, SVMs can only solve binary classification problems. To allow for multi-class classification, \texttt{libsvm} uses the \textit{one-against-one} technique by fitting all binary subclassifiers and finding the correct class by a voting mechanism; \item[$\epsilon$-regression:] here, the data points lie \textit{in between} the two borders of the margin which is maximized under suitable conditions to avoid outlier inclusion; \item[$\nu$-regression:] with analogue modifications of the regression model as in the classification case. \end{description} \section*{Usage in R} The R interface to \texttt{libsvm} in package \pkg{e1071}, \texttt{svm()}, was designed to be as intuitive as possible. Models are fitted and new data are predicted as usual, and both the vector/matrix and the formula interface are implemented. As expected for R's statistical functions, the engine tries to be smart about the mode to be chosen, using the dependent variable's type ($y$): if $y$ is a factor, the engine switches to classification mode, otherwise, it behaves as a regression machine; if $y$ is omitted, the engine assumes a novelty detection task. \section*{Examples} In the following two examples, we demonstrate the practical use of \texttt{svm()} along with a comparison to classification and regression forests as implemented in \texttt{randomForest()}. \subsection*{Classification} In this example, we use the glass data from the \href{http://www.ics.uci.edu/mlearn/MLRepository.html}{UCI Repository of Machine Learning Databases} for classification. The task is to predict the type of a glass on basis of its chemical analysis. We start by splitting the data into a train and test set: <<>>= library(e1071) library(randomForest) data(Glass, package="mlbench") ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- Glass[testindex,] trainset <- Glass[-testindex,] @ Both for SVM and randomForest (via \texttt{randomForest()}), we fit the model and predict the test set values: <<>>= ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) @ (The dependent variable, \texttt{Type}, has column number 10. \texttt{cost} is a general penalizing parameter for $C$-classification and \texttt{gamma} is the radial basis function-specific kernel parameter.) <<>>= ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) @ A cross-tabulation of the true versus the predicted values yields: <<>>= ## compute svm confusion matrix table(pred = svm.pred, true = testset[,10]) ## compute randomForest confusion matrix table(pred = rf.pred, true = testset[,10]) @ %% results table <>= library(xtable) rf.acc <- c() sv.acc <- c() rf.kap <- c() sv.kap <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Glass[testindex,]) trainset <- na.omit(Glass[-testindex,]) ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) tab <- classAgreement(table(svm.pred, testset[,10])) sv.acc[i] <- tab$diag sv.kap[i] <- tab$kappa ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) tab <- classAgreement(table(rf.pred, testset[,10])) rf.acc[i] <- tab$diag rf.kap[i] <- tab$kappa } x <- rbind(summary(sv.acc), summary(sv.kap), summary(rf.acc), summary(rf.kap)) rownames <- c() tab <- cbind(rep(c("svm","randomForest"),2), round(x,2)) colnames(tab)[1] <- "method" rownames(tab) <- c("Accuracy","","Kappa"," ") xtable(tab, label = "tab:class", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for classification (10 replications)") @ \noindent Finally, we compare the performance of the two methods by computing the respective accuracy rates and the kappa indices (as computed by \texttt{classAgreement()} also contained in package \pkg{e1071}). In Table \ref{tab:class}, we summarize the results of \Sexpr{reps} replications---Support Vector Machines show better results. \subsection*{Non-linear $\epsilon$-Regression} The regression capabilities of SVMs are demonstrated on the ozone data. Again, we split the data into a train and test set. <<>>= library(e1071) library(randomForest) data(Ozone, package="mlbench") ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sqrt(crossprod(svm.pred - testset[,3]) / N) ## random Forest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) sqrt(crossprod(rf.pred - testset[,3]) / N) @ <>= rf.res <- c() sv.res <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sv.res[i] <- sqrt(crossprod(svm.pred - testset[,3]) / N) ## randomForest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) rf.res[i] <- sqrt(crossprod(rf.pred - testset[,3]) / N) } xtable(rbind(svm = summary(sv.res), randomForest = summary(rf.res)), label = "tab:reg", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for regression (Root Mean Squared Error, 10 replications)") @ \noindent We compare the two methods by the root mean squared error (RMSE)---see Table \ref{tab:reg} for a summary of \Sexpr{reps} replications. Again, as for classification, \texttt{svm()} does a better job than \texttt{randomForest()}. \section*{Elements of the \texttt{svm} object} The function \texttt{svm()} returns an object of class ``\texttt{svm}'', which partly includes the following components: \begin{description} \item[\textbf{\texttt{SV}:}] matrix of support vectors found; \item[\textbf{\texttt{labels}:}] their labels in classification mode; \item[\textbf{\texttt{index}:}] index of the support vectors in the input data (could be used e.g., for their visualization as part of the data set). \end{description} If the cross-classification feature is enabled, the \texttt{svm} object will contain some additional information described below. \section*{Other main features} \begin{description} \item[Class Weighting:] if one wishes to weight the classes differently (e.g., in case of asymmetric class sizes to avoid possibly overproportional influence of bigger classes on the margin), weights may be specified in a vector with named components. In case of two classes A and B, we could use something like: \texttt{m <- svm(x, y, class.weights = c(A = 0.3, B = 0.7))} \item[Cross-classification:] to assess the quality of the training result, we can perform a $k$-fold cross-classification on the training data by setting the parameter \texttt{cross} to $k$ (default: 0). The \texttt{svm} object will then contain some additional values, depending on whether classification or regression is performed. Values for classification: \begin{description} \item[\texttt{accuracies}:] vector of accuracy values for each of the $k$ predictions \item[\texttt{tot.accuracy}:] total accuracy \end{description} Values for regression: \begin{description} \item[\texttt{MSE}:] vector of mean squared errors for each of the $k$ predictions \item[\texttt{tot.MSE}:] total mean squared error \item[\texttt{scorrcoef}:] Squared correlation coefficient (of the predicted and the true values of the dependent variable) \end{description} \end{description} \section*{Tips on practical use} \begin{itemize} \item Note that SVMs may be very sensitive to the proper choice of parameters, so allways check a range of parameter combinations, at least on a reasonable subset of your data. \item For classification tasks, you will most likely use $C$-classification with the RBF kernel (default), because of its good general performance and the few number of parameters (only two: $C$ and $\gamma$). The authors of \pkg{libsvm} suggest to try small and large values for $C$---like 1 to 1000---first, then to decide which are better for the data by cross validation, and finally to try several $\gamma$'s for the better $C$'s. \item However, better results are obtained by using a grid search over all parameters. For this, we recommend to use the \texttt{tune.svm()} function in \pkg{e1071}. \item Be careful with large datasets as training times may increase rather fast. \item Scaling of the data usually drastically improves the results. Therefore, \texttt{svm()} scales the data by default. \end{itemize} \section*{Model Formulations and Kernels} Dual representation of models implemented: \begin{itemize} \item $C$-classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha-\mathbf{e}^\top\alpha \nonumber\\ \mbox{s.t.} &&0\le\alpha_i\le C,~i=1,\ldots,l,\\ &&\mathbf{y}^\top\alpha=0~, \nonumber \end{eqnarray} where $\mathbf{e}$ is the unity vector, $C$ is the upper bound, $\mathbf{Q}$ is an $l$ by $l$ positive semidefinite matrix, $Q_{ij} \equiv y_i y_j K(x_i, x_j)$, and $K(x_i, x_j) \equiv \phi(x_i)^\top\phi(x_j)$ is the kernel. \item $\nu$-classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha \nonumber\\ \mbox{s.t.}&&0\le\alpha_i\le 1/l,~i=1,\ldots,l,\\ &&\mathbf{e}^\top \alpha \ge \nu, \nonumber\\ &&\mathbf{y}^\top\alpha=0~. \nonumber \end{eqnarray} where $\nu \in (0,1]$. \item one-class classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha \nonumber\\ \mbox{s.t.} &&0\le\alpha_i\le 1/(\nu l),~i=1,\ldots,l,\\ &&\mathbf{e}^\top\alpha=1~,\nonumber \end{eqnarray} \item $\epsilon$-regression:\\ \begin{eqnarray} \min_{\alpha, \alpha^*}&&\frac{1}{2}(\alpha-\alpha^*)^\top \mathbf{Q} (\alpha-\alpha^*) + \nonumber\\ &&\epsilon\sum_{i=1}^{l}(\alpha_i+\alpha_i^*) + \sum_{i=1}^{l}y_i(\alpha_i-\alpha_i^*) \nonumber\\ \mbox{s.t.} &&0\le\alpha_i, \alpha_i^*\le C,~i=1,\ldots,l,\\ &&\sum_{i=1}^{l}(\alpha_i-\alpha_i^*)=0~.\nonumber \end{eqnarray} \item $\nu$-regression:\\ \begin{eqnarray} \min_{\alpha, \alpha^*}&&\frac{1}{2}(\alpha-\alpha^*)^\top \mathbf{Q} (\alpha-\alpha^*) + \mathbf{z}^\top(\alpha_i-\alpha_i^*) \nonumber\\ \mbox{s.t.} &&0\le\alpha_i, \alpha_i^*\le C,~i=1,\ldots,l,\\ &&\mathbf{e}^\top(\alpha-\alpha^*)=0\nonumber\\ &&\mathbf{e}^\top(\alpha+\alpha^*)=C\nu~.\nonumber \end{eqnarray} \end{itemize} \noindent Available kernels:\\ \\ \noindent \begin{table}[h] \centering \begin{tabular}{|l|l|l|} \hline kernel & formula & parameters \\ \hline \hline linear & $\bf u^\top v$& (none) \\ polynomial & $(\gamma \mathbf{u^\top v}+c_0)^d$ & $\gamma, d, c_0$\\ radial basis fct. & $\exp\{-\gamma|\mathbf{u-v}|^2\}$&$\gamma$\\ sigmoid & $\tanh\{\gamma \mathbf{u^\top v}+c_0\}$ &$\gamma, c_0$\\ \hline \end{tabular} \end{table} \section*{Conclusion} We hope that \texttt{svm} provides an easy-to-use interface to the world of SVMs, which nowadays have become a popular technique in flexible modelling. There are some drawbacks, though: SVMs scale rather badly with the data size due to the quadratic optimization algorithm and the kernel transformation. Furthermore, the correct choice of kernel parameters is crucial for obtaining good results, which practically means that an extensive search must be conducted on the parameter space before results can be trusted, and this often complicates the task (the authors of \texttt{libsvm} currently conduct some work on methods of efficient automatic parameter selection). Finally, the current implementation is optimized for the radial basis function kernel only, which clearly might be suboptimal for your data. \begin{thebibliography}{5} \bibitem[Bennett \& Campbell(2000)]{svm:bennett+campbell:2000} Bennett, K.~P. \& Campbell, C. (2000). \newblock Support vector machines: Hype or hallelujah? \newblock \emph{SIGKDD Explorations}, \textbf{2}(2). \newblock \url{http://www.acm.org/sigs/sigkdd/explorations/issue2-2/bennett.pdf}. \bibitem[Chang \& Lin(2001)]{svm:chang+lin:2001} Chang, C.-C. \& Lin, C.-J. (2001). \newblock {LIBSVM}: a library for support vector machines. \newblock Software available at \url{http://www.csie.ntu.edu.tw/~cjlin/libsvm}, detailed documentation (algorithms, formulae, \dots) can be found in \url{http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.ps.gz} \bibitem[Cortes \& Vapnik(1995)]{svm:cortes+vapnik:1995} Cortes, C. \& Vapnik, V. (1995). \newblock Support-vector network. \newblock \emph{Machine Learning}, \textbf{20}, 1--25. \bibitem[Sch\"olkopf et~al.(2000)Sch\"olkopf, Smola, Williamson, \& Bartlett]{svm:scholkopf+smola+williamson:2000} Sch\"olkopf, B., Smola, A., Williamson, R.~C., \& Bartlett, P. (2000). \newblock New support vector algorithms. \newblock \emph{Neural Computation}, \textbf{12}, 1207--1245. \bibitem[Vapnik(1998)]{svm:vapnik:1998} Vapnik, V. (1998). \newblock \emph{Statistical learning theory}. \newblock New York: Wiley. \end{thebibliography} \end{document} e1071/R/0000755000175100001440000000000014533657010011232 5ustar hornikuserse1071/R/moment.R0000755000175100001440000000033714173734133012664 0ustar hornikusersmoment <- function(x, order = 1, center = FALSE, absolute = FALSE, na.rm = FALSE) { if (na.rm) x <- x[!is.na(x)] if (center) x <- x - mean(x) if (absolute) x <- abs(x) sum(x ^ order) / length(x) } e1071/R/naiveBayes.R0000644000175100001440000001324414246371157013455 0ustar hornikusersnaiveBayes <- function(x, ...) UseMethod("naiveBayes") naiveBayes.default <- function(x, y, laplace = 0, ...) { call <- match.call() Yname <- deparse(substitute(y)) x <- as.data.frame(x) if (is.logical(y)) y <- factor(y, levels = c("FALSE", "TRUE")) ## estimation-function est <- function(var) if (is.numeric(var)) { cbind(tapply(var, y, mean, na.rm = TRUE), tapply(var, y, sd, na.rm = TRUE)) } else { if (is.logical(var)) var <- factor(var, levels = c("FALSE", "TRUE")) tab <- table(y, var) (tab + laplace) / (rowSums(tab) + laplace * nlevels(var)) } ## create tables apriori <- table(y) tables <- lapply(x, est) isnumeric <- vapply(x, is.numeric, NA) ## fix dimname names for (i in 1:length(tables)) names(dimnames(tables[[i]])) <- c(Yname, colnames(x)[i]) names(dimnames(apriori)) <- Yname structure(list(apriori = apriori, tables = tables, levels = names(apriori), isnumeric = isnumeric, call = call ), class = "naiveBayes" ) } naiveBayes.formula <- function(formula, data, laplace = 0, ..., subset, na.action = na.pass) { call <- match.call() Yname <- as.character(formula[[2]]) if (is.data.frame(data)) { ## handle formula m <- match.call(expand.dots = FALSE) m$... <- NULL m$laplace = NULL m$na.action <- na.action m[[1L]] <- quote(stats::model.frame) m <- eval(m, parent.frame()) Terms <- attr(m, "terms") if (any(attr(Terms, "order") > 1)) stop("naiveBayes cannot handle interaction terms") Y <- model.extract(m, "response") X <- m[,gsub("`", "", labels(Terms)), drop = FALSE] return(naiveBayes(X, Y, laplace = laplace, ...)) } else if (is.array(data)) { nam <- names(dimnames(data)) ## Find Class dimension Yind <- which(nam == Yname) ## Create Variable index # deps <- strsplit(as.character(formula)[3], ".[+].")[[1]] deps <- labels(terms(formula, data = data)) if (length(deps) == 1 && deps == ".") deps <- nam[-Yind] Vind <- which(nam %in% deps) ## create tables apriori <- margin.table(data, Yind) tables <- lapply(Vind, function(i) (margin.table(data, c(Yind, i)) + laplace) / (as.numeric(apriori) + laplace * dim(data)[i])) names(tables) <- nam[Vind] isnumeric = rep(FALSE, length(Vind)) names(isnumeric) <- nam[Vind] structure(list(apriori = apriori, tables = tables, levels = names(apriori), isnumeric = isnumeric, call = call ), class = "naiveBayes" ) } else stop("naiveBayes formula interface handles data frames or arrays only") } print.naiveBayes <- function(x, ...) { cat("\nNaive Bayes Classifier for Discrete Predictors\n\n") cat("Call:\n") print(x$call) cat("\nA-priori probabilities:\n") print(x$apriori / sum(x$apriori)) cat("\nConditional probabilities:\n") for (i in x$tables) {print(i); cat("\n")} } predict.naiveBayes <- function(object, newdata, type = c("class", "raw"), threshold = 0.001, eps = 0, ...) { type <- match.arg(type) newdata <- as.data.frame(newdata) ## fix factor levels to be identical with training data for (i in names(object$tables)) { if (!is.null(newdata[[i]]) && !is.numeric(newdata[[i]])) newdata[[i]] <- factor(newdata[[i]], levels = colnames(object$tables[[i]])) if (object$isnumeric[i] != is.numeric(newdata[[i]])) warning(paste0("Type mismatch between training and new data for variable '", i, "'. Did you use factors with numeric labels for training, and numeric values for new data?")) } attribs <- match(names(object$tables), names(newdata)) isnumeric <- vapply(newdata, is.numeric, NA) islogical <- vapply(newdata, is.logical, NA) newdata <- data.matrix(newdata) len <- length(object$apriori) L <- vapply(seq_len(nrow(newdata)), function(i) { ndata <- newdata[i, ] L <- log(object$apriori) + apply(log(vapply(seq_along(attribs), function(v) { nd <- ndata[attribs[v]] if (is.na(nd)) rep.int(1, len) else { prob <- if (isnumeric[attribs[v]]) { msd <- object$tables[[v]] msd[, 2][msd[, 2] <= eps] <- threshold dnorm(nd, msd[, 1], msd[, 2]) } else object$tables[[v]][, nd + islogical[attribs[v]]] prob[prob <= eps] <- threshold prob } }, double(len))), 1, sum) if (type == "class") L else { ## Numerically unstable: ## L <- exp(L) ## L / sum(L) ## instead, we use: vapply(L, function(lp) { 1/sum(exp(L - lp)) }, double(1)) } }, double(len)) if (type == "class") { if (is.logical(object$levels)) L[2,] > L[1,] else factor(object$levels[apply(L, 2, which.max)], levels = object$levels) } else t(L) } e1071/R/scale_data_frame.R0000644000175100001440000000110314024400426014572 0ustar hornikusersscale_data_frame <- function(x, center = TRUE, scale = TRUE) { if (isFALSE(center) && isFALSE(scale)) return(x) if (!is.data.frame(x)) return (scale(x, center, scale)) i <- vapply(x, is.numeric, NA) | vapply(x, is.logical, NA) if (any(i)) { x[, i] <- tmp <- scale.default(x[, i, drop = FALSE], na.omit(center), na.omit(scale)) if(center || !is.logical(center)) attr(x, "scaled:center")[i] <- attr(tmp, "scaled:center") if(scale || !is.logical(scale)) attr(x, "scaled:scale")[i] <- attr(tmp, "scaled:scale") } x } e1071/R/tune.R0000644000175100001440000004453414325173177012350 0ustar hornikuserstune.control <- function(random = FALSE, nrepeat = 1, repeat.aggregate = mean, sampling = c("cross", "fix", "bootstrap"), sampling.aggregate = mean, sampling.dispersion = sd, cross = 10, fix = 2 / 3, nboot = 10, boot.size = 9 / 10, best.model = TRUE, performances = TRUE, error.fun = NULL) { structure(list(random = random, nrepeat = nrepeat, repeat.aggregate = repeat.aggregate, sampling = match.arg(sampling), sampling.aggregate = sampling.aggregate, sampling.dispersion = sampling.dispersion, cross = cross, fix = fix, nboot = nboot, boot.size = boot.size, best.model = best.model, performances = performances, error.fun = error.fun ), class = "tune.control" ) } tune <- function(METHOD, train.x, train.y = NULL, data = list(), validation.x = NULL, validation.y = NULL, ranges = NULL, predict.func = predict, tunecontrol = tune.control(), ... ) { call <- match.call() ## internal helper functions resp <- function(formula, data) { model.response(model.frame(formula, data)) } classAgreement <- function (tab) { n <- sum(tab) if (!is.null(dimnames(tab))) { lev <- intersect(colnames(tab), rownames(tab)) p0 <- sum(diag(tab[lev, lev])) / n } else { m <- min(dim(tab)) p0 <- sum(diag(tab[1:m, 1:m])) / n } p0 } ## parameter handling if (tunecontrol$sampling == "cross") validation.x <- validation.y <- NULL useFormula <- is.null(train.y) if (useFormula && (is.null(data) || length(data) == 0)) data <- model.frame(train.x) if (is.vector(train.x)) train.x <- t(t(train.x)) if (is.data.frame(train.y)) train.y <- as.matrix(train.y) ## prepare training indices if (!is.null(validation.x)) tunecontrol$fix <- 1 n <- nrow(if (useFormula) data else train.x) perm.ind <- sample(n) if (tunecontrol$sampling == "cross") { if (tunecontrol$cross > n) stop(sQuote("cross"), " must not exceed sampling size!") if (tunecontrol$cross == 1) stop(sQuote("cross"), " must be greater than 1!") } train.ind <- if (tunecontrol$sampling == "cross") tapply(1:n, cut(1:n, breaks = tunecontrol$cross), function(x) perm.ind[-x]) else if (tunecontrol$sampling == "fix") list(perm.ind[1:trunc(n * tunecontrol$fix)]) else ## bootstrap lapply(1:tunecontrol$nboot, function(x) sample(n, n * tunecontrol$boot.size, replace = TRUE)) ## find best model parameters <- if (is.null(ranges)) data.frame(dummyparameter = 0) else expand.grid(ranges) p <- nrow(parameters) if (!is.logical(tunecontrol$random)) { if (tunecontrol$random < 1) stop("random must be a strictly positive integer") if (tunecontrol$random > p) tunecontrol$random <- p parameters <- parameters[sample(1:p, tunecontrol$random),] p <- nrow(parameters) } model.variances <- model.errors <- c() ## - loop over all models for (para.set in 1:p) { sampling.errors <- c() ## - loop over all training samples for (sample in 1:length(train.ind)) { repeat.errors <- c() ## - repeat training `nrepeat' times for (reps in 1:tunecontrol$nrepeat) { ## train one model pars <- if (is.null(ranges)) NULL else lapply(parameters[para.set,,drop = FALSE], unlist) model <- if (useFormula) do.call(METHOD, c(list(train.x, data = data, subset = train.ind[[sample]]), pars, list(...) ) ) else do.call(METHOD, c(list(train.x[train.ind[[sample]],], y = train.y[train.ind[[sample]]]), pars, list(...) ) ) ## predict validation set pred <- predict.func(model, if (!is.null(validation.x)) validation.x else if (useFormula) data[-train.ind[[sample]],,drop = FALSE] else if (inherits(train.x, "matrix.csr")) train.x[-train.ind[[sample]],] else train.x[-train.ind[[sample]],,drop = FALSE] ) ## compute performance measure true.y <- if (!is.null(validation.y)) validation.y else if (useFormula) { if (!is.null(validation.x)) resp(train.x, validation.x) else resp(train.x, data[-train.ind[[sample]],]) } else train.y[-train.ind[[sample]]] if (is.null(true.y)) true.y <- rep(TRUE, length(pred)) repeat.errors[reps] <- if (!is.null(tunecontrol$error.fun)) tunecontrol$error.fun(true.y, pred) else if ((is.logical(true.y) || is.factor(true.y)) && (is.logical(pred) || is.factor(pred) || is.character(pred))) ## classification error 1 - classAgreement(table(pred, true.y)) else if (is.numeric(true.y) && is.numeric(pred)) ## mean squared error crossprod(pred - true.y) / length(pred) else stop("Dependent variable has wrong type!") } sampling.errors[sample] <- tunecontrol$repeat.aggregate(repeat.errors) } model.errors[para.set] <- tunecontrol$sampling.aggregate(sampling.errors) model.variances[para.set] <- tunecontrol$sampling.dispersion(sampling.errors) } ## return results best <- which.min(model.errors) pars <- if (is.null(ranges)) NULL else lapply(parameters[best,,drop = FALSE], unlist) structure(list(best.parameters = parameters[best,,drop = FALSE], best.performance = model.errors[best], method = if (!is.character(METHOD)) deparse(substitute(METHOD)) else METHOD, nparcomb = nrow(parameters), train.ind = train.ind, sampling = switch(tunecontrol$sampling, fix = "fixed training/validation set", bootstrap = "bootstrapping", cross = if (tunecontrol$cross == n) "leave-one-out" else paste(tunecontrol$cross,"-fold cross validation", sep="") ), performances = if (tunecontrol$performances) cbind(parameters, error = model.errors, dispersion = model.variances), best.model = if (tunecontrol$best.model) { modeltmp <- if (useFormula) do.call(METHOD, c(list(train.x, data = data), pars, list(...))) else do.call(METHOD, c(list(x = train.x, y = train.y), pars, list(...))) call[[1]] <- as.symbol("best.tune") modeltmp$call <- call modeltmp } ), class = "tune" ) } best.tune <- function(...) { call <- match.call() modeltmp <- tune(...)$best.model modeltmp$call <- call modeltmp } print.tune <- function(x, ...) { if (x$nparcomb > 1) { cat("\nParameter tuning of ", sQuote(x$method), ":\n\n", sep="") cat("- sampling method:", x$sampling,"\n\n") cat("- best parameters:\n") tmp <- x$best.parameters rownames(tmp) <- "" print(tmp) cat("\n- best performance:", x$best.performance, "\n") cat("\n") } else { cat("\nError estimation of ", sQuote(x$method), " using ", x$sampling, ": ", x$best.performance, "\n\n", sep="") } } summary.tune <- function(object, ...) structure(object, class = "summary.tune") print.summary.tune <- function(x, ...) { print.tune(x) if (!is.null(x$performances) && (x$nparcomb > 1)) { cat("- Detailed performance results:\n") print(x$performances) cat("\n") } } hsv_palette <- function(h = 2/3, from = 0.7, to = 0.2, v = 1) function(n) hsv(h = h, s = seq(from, to, length.out = n), v = v) plot.tune <- function(x, type=c("contour","perspective"), theta=60, col="lightblue", main = NULL, xlab = NULL, ylab = NULL, swapxy = FALSE, transform.x = NULL, transform.y = NULL, transform.z = NULL, color.palette = hsv_palette(), nlevels = 20, ...) { if (is.null(x$performances)) stop("Object does not contain detailed performance measures!") k <- ncol(x$performances) if (k > 4) stop("Cannot visualize more than 2 parameters") type = match.arg(type) if (is.null(main)) main <- paste("Performance of `", x$method, "'", sep="") if (k == 3) plot(x$performances[,1:2], type = "b", main = main) else { if (!is.null(transform.x)) x$performances[,1] <- transform.x(x$performances[,1]) if (!is.null(transform.y)) x$performances[,2] <- transform.y(x$performances[,2]) if (!is.null(transform.z)) x$performances[,3] <- transform.z(x$performances[,3]) if (swapxy) x$performances[,1:2] <- x$performances[,2:1] x <- xtabs(error~., data = x$performances[,-k]) if (is.null(xlab)) xlab <- names(dimnames(x))[1 + swapxy] if (is.null(ylab)) ylab <- names(dimnames(x))[2 - swapxy] if (type == "perspective") persp(x=as.double(rownames(x)), y=as.double(colnames(x)), z=x, xlab=xlab, ylab=ylab, zlab="accuracy", theta=theta, col=col, ticktype="detailed", main = main, ... ) else filled.contour(x=as.double(rownames(x)), y=as.double(colnames(x)), xlab=xlab, ylab=ylab, nlevels=nlevels, color.palette = color.palette, main = main, x, ...) } } ############################################# ## convenience functions for some methods ############################################# tune.svm <- function(x, y = NULL, data = NULL, degree = NULL, gamma = NULL, coef0 = NULL, cost = NULL, nu = NULL, class.weights = NULL, epsilon = NULL, ...) { call <- match.call() call[[1]] <- as.symbol("best.svm") ranges <- list(degree = degree, gamma = gamma, coef0 = coef0, cost = cost, nu = nu, class.weights = class.weights, epsilon = epsilon) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges = NULL modeltmp <- if (inherits(x, "formula")) tune("svm", train.x = x, data = data, ranges = ranges, ...) else tune("svm", train.x = x, train.y = y, ranges = ranges, ...) if (!is.null(modeltmp$best.model)) modeltmp$best.model$call <- call modeltmp } best.svm <- function(x, tunecontrol = tune.control(), ...) { call <- match.call() tunecontrol$best.model = TRUE modeltmp <- tune.svm(x, ..., tunecontrol = tunecontrol)$best.model modeltmp$call <- call modeltmp } tune.nnet <- function(x, y = NULL, data = NULL, size = NULL, decay = NULL, trace = FALSE, tunecontrol = tune.control(nrepeat = 5), ...) { call <- match.call() call[[1]] <- as.symbol("best.nnet") loadNamespace("nnet") predict.func <- predict useFormula <- inherits(x, "formula") if (is.factor(y) || (useFormula && is.factor(model.response(model.frame(formula = x, data = data)))) ) predict.func = function(...) predict(..., type = "class") ranges <- list(size = size, decay = decay) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges = NULL modeltmp <- if (useFormula) tune("nnet", train.x = x, data = data, ranges = ranges, predict.func = predict.func, tunecontrol = tunecontrol, trace = trace, ...) else tune("nnet", train.x = x, train.y = y, ranges = ranges, predict.func = predict.func, tunecontrol = tunecontrol, trace = trace, ...) if (!is.null(modeltmp$best.model)) modeltmp$best.model$call <- call modeltmp } best.nnet <- function(x, tunecontrol = tune.control(nrepeat = 5), ...) { call <- match.call() tunecontrol$best.model = TRUE modeltmp <- tune.nnet(x, ..., tunecontrol = tunecontrol)$best.model modeltmp$call <- call modeltmp } tune.randomForest <- function(x, y = NULL, data = NULL, nodesize = NULL, mtry = NULL, ntree = NULL, ...) { call <- match.call() call[[1]] <- as.symbol("best.randomForest") loadNamespace("randomForest") ranges <- list(nodesize = nodesize, mtry = mtry, ntree = ntree) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges = NULL modeltmp <- if (inherits(x, "formula")) tune("randomForest", train.x = x, data = data, ranges = ranges, ...) else tune("randomForest", train.x = x, train.y = y, ranges = ranges, ...) if (!is.null(modeltmp$best.model)) modeltmp$best.model$call <- call modeltmp } best.randomForest <- function(x, tunecontrol = tune.control(), ...) { call <- match.call() tunecontrol$best.model = TRUE modeltmp <- tune.randomForest(x, ..., tunecontrol = tunecontrol)$best.model modeltmp$call <- call modeltmp } tune.gknn <- function(x, y = NULL, data = NULL, k = NULL, ...) { call <- match.call() call[[1]] <- as.symbol("best.gknn") ranges <- list(k = k) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges = NULL modeltmp <- if (inherits(x, "formula")) tune("gknn", train.x = x, data = data, ranges = ranges, ...) else tune("gknn", train.x = x, train.y = y, ranges = ranges, ...) if (!is.null(modeltmp$best.model)) modeltmp$best.model$call <- call modeltmp } best.gknn <- function(x, tunecontrol = tune.control(), ...) { call <- match.call() tunecontrol$best.model = TRUE modeltmp <- tune.gknn(x, ..., tunecontrol = tunecontrol)$best.model modeltmp$call <- call modeltmp } knn.wrapper <- function(x, y, k = 1, l = 0, ...) list(train = x, cl = y, k = k, l = l, ...) tune.knn <- function(x, y, k = NULL, l = NULL, ...) { loadNamespace("class") ranges <- list(k = k, l = l) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges = NULL tune("knn.wrapper", train.x = x, train.y = y, ranges = ranges, predict.func = function(x, ...) knn(train = x$train, cl = x$cl, k = x$k, l = x$l, ...), ...) } rpart.wrapper <- function(formula, minsplit=20, minbucket=round(minsplit/3), cp=0.01, maxcompete=4, maxsurrogate=5, usesurrogate=2, xval=10, surrogatestyle=0, maxdepth=30, ...) rpart::rpart(formula, control = rpart::rpart.control(minsplit=minsplit, minbucket=minbucket, cp=cp, maxcompete=maxcompete, maxsurrogate=maxsurrogate, usesurrogate=usesurrogate, xval=xval, surrogatestyle=surrogatestyle, maxdepth=maxdepth), ... ) tune.rpart <- function(formula, data, na.action = na.omit, minsplit=NULL, minbucket=NULL, cp=NULL, maxcompete=NULL, maxsurrogate=NULL, usesurrogate=NULL, xval=NULL, surrogatestyle=NULL, maxdepth=NULL, predict.func = NULL, ...) { call <- match.call() call[[1]] <- as.symbol("best.rpart") loadNamespace("rpart") ranges <- list(minsplit=minsplit, minbucket=minbucket, cp=cp, maxcompete=maxcompete, maxsurrogate=maxsurrogate, usesurrogate=usesurrogate, xval=xval, surrogatestyle=surrogatestyle, maxdepth=maxdepth) ranges[vapply(ranges, is.null, NA)] <- NULL if (length(ranges) < 1) ranges <- NULL predict.func <- if (is.factor(model.response(model.frame(formula, data)))) function(...) predict(..., type = "class") else predict modeltmp <- tune("rpart.wrapper", train.x = formula, data = data, ranges = ranges, predict.func = predict.func, na.action = na.action, ...) if (!is.null(modeltmp$best.model)) modeltmp$best.model$call <- call modeltmp } best.rpart <- function(formula, tunecontrol = tune.control(), ...) { call <- match.call() tunecontrol$best.model = TRUE modeltmp <- tune.rpart(formula, ..., tunecontrol = tunecontrol)$best.model modeltmp$call <- call modeltmp } e1071/R/sigmoid.R0000755000175100001440000000023314173734133013013 0ustar hornikuserssigmoid <- function(x) 1/(1 + exp(-x)) dsigmoid <- function(x) sigmoid(x) * (1 - sigmoid(x)) d2sigmoid <- function(x) dsigmoid(x) * (1 - 2 * sigmoid(x)) e1071/R/interpolate.R0000755000175100001440000000364214173734133013715 0ustar hornikusersinterpolate <- function(x, a, adims=lapply(dimnames(a), as.numeric), method="linear"){ if(is.vector(x)) x<- matrix(x, ncol=length(x)) if(!is.array(a)) stop("a is not an array") ad <- length(dim(a)) method <- pmatch(method, c("linear", "constant")) if (is.na(method)) stop("invalid interpolation method") if(any(unlist(lapply(adims, diff))<0)) stop("dimensions of a not ordered") retval <- rep(0, nrow(x)) bincombi <- bincombinations(ad) convexcoeff <- function(x, y) { ok <- y>0 x[ok] <- y[ok]-x[ok] x } for(n in 1:nrow(x)){ ## the "leftmost" corner of the enclosing hypercube leftidx <- rep(0, ad) xabstand <- rep(0, ad) aabstand <- rep(0, ad) for(k in 1:ad){ if(x[n,k] < min(adims[[k]]) || x[n,k] > max(adims[[k]])) stop("No extrapolation allowed") else{ leftidx[k] <- max(seq(adims[[k]])[adims[[k]] <= x[n,k]]) ## if at the right border, go one step to the left if(leftidx[k] == length(adims[[k]])) leftidx[k] <- leftidx[k] - 1 xabstand[k] <- x[n,k] - adims[[k]][leftidx[k]] aabstand[k] <- adims[[k]][leftidx[k]+1] - adims[[k]][leftidx[k]] } } coefs <- list() if(method==1){ for(k in 1:(2^ad)){ retval[n] <- retval[n] + element(a, leftidx+bincombi[k,]) * prod((aabstand- convexcoeff(xabstand, aabstand*bincombi[k,]))/aabstand) } } else if(method==2){ retval[n] <- element(a, leftidx) } } names(retval) <- rownames(x) retval } e1071/R/impute.R0000755000175100001440000000060714173734133012670 0ustar hornikusersimpute <- function(x, what=c("median", "mean")){ what <- match.arg(what) if(what == "median"){ retval <- apply(x, 2, function(z) {z[is.na(z)] <- median(z, na.rm=TRUE); z}) } else if(what == "mean"){ retval <- apply(x, 2, function(z) {z[is.na(z)] <- mean(z, na.rm=TRUE); z}) } retval } e1071/R/discrete.R0000755000175100001440000000407514173734133013172 0ustar hornikusersrdiscrete <- function (n, probs, values = 1:length(probs), ...) { sample(values, size=n, replace=TRUE, prob=probs) } ddiscrete <- function (x, probs, values = 1:length(probs)) { if (length(probs) != length(values)) stop("ddiscrete: probs and values must have the same length.") if (sum(probs < 0) > 0) stop("ddiscrete: probs must not contain negative values.") if (!is.array(x) && !is.vector(x) && !is.factor(x)) stop("ddiscrete: x must be an array or a vector or a factor.") p <- probs/sum(probs) y <- as.vector(x) l <- length(y) z <- rep(0,l) for (i in 1:l) if (any(values == y[i])) z[i] <- p[values == y[i]] z <- as.numeric(z) if (is.array(x)) dim(z) <- dim(x) return(z) } pdiscrete <- function (q, probs, values = 1:length(probs)) { if (length(probs) != length(values)) stop("pdiscrete: probs and values must have the same length.") if (sum(probs < 0) > 0) stop("pdiscrete: probs must not contain negative values.") if (!is.array(q) & !is.vector(q)) stop("pdiscrete: q must be an array or a vector") p <- probs/sum(probs) y <- as.vector(q) l <- length(y) z <- rep(0,l) for (i in 1:l) z[i] <- sum(p[values <= y[i]]) z <- as.numeric(z) if (is.array(q)) dim(z) <- dim(q) return(z) } qdiscrete <- function (p, probs, values = 1:length(probs)) { if (length(probs) != length(values)) stop("qdiscrete: probs and values must have the same length.") if (sum(probs < 0) > 0) stop("qdiscrete: probs must not contain negative values.") if (!is.array(p) & !is.vector(p)) stop("qdiscrete: p must be an array or a vector") probs <- cumsum(probs)/sum(probs) y <- as.vector(p) l <- length(y) z <- rep(0,l) for (i in 1:l) z[i] <- length(values) - sum(y[i] <= probs) + 1 z <- as.numeric(z) z <- values[z] if (is.array(p)) dim(z) <- dim(p) return(z) } e1071/R/countpattern.R0000755000175100001440000000117214173734133014111 0ustar hornikuserscountpattern <- function(x, matching=FALSE) { nvar <- dim(x)[2] n <- dim(x)[1] ## build matrix of all possible binary vectors b <- matrix(0, 2^nvar, nvar) for (i in 1:nvar) b[, nvar+1-i] <- rep(rep(c(0,1),c(2^(i-1),2^(i-1))),2^(nvar-i)) namespat <- b[,1] for (i in 2:nvar) namespat <- paste(namespat, b[,i], sep="") xpat <- x[,1] for (i in 2:nvar) xpat <- 2*xpat+x[,i] xpat <- xpat+1 pat <- tabulate(xpat, nbins=2^nvar) names(pat) <- namespat if (matching) return(list(pat=pat, matching=xpat)) else return(pat) } e1071/R/rbridge.R0000755000175100001440000000026514173734133013003 0ustar hornikusersrbridge <- function(end=1, frequency=1000) { z <- rwiener(end=end, frequency=frequency) ts(z - time(z)*as.vector(z)[frequency], start=1/frequency, frequency=frequency) } e1071/R/element.R0000755000175100001440000000050614173734133013014 0ustar hornikuserselement <- function(x, i) { if(!is.array(x)) stop("x is not an array") ni <- length(i) dx <- dim(x) if(length(i)!=length(dx)) stop("Wrong number of subscripts") if(ni==1){ return(x[i]) } else{ m1 <- c(i[1], i[2:ni]-1) m2 <- c(1,cumprod(dx)[1:(ni-1)]) return(x[sum(m1*m2)]) } } e1071/R/ica.R0000755000175100001440000000306614173734133012123 0ustar hornikusersica <- function(X, lrate, epochs=100, ncomp=dim(X)[2], fun="negative") { if (!is.matrix(X)) { if (is.data.frame(X)) X <- as.matrix(X) else stop("ica: X must be a matrix or a data frame") } if (!is.numeric(X)) stop("ica: X contains non numeric elements") m <- dim(X)[1] n <- dim(X)[2] Winit <- matrix(rnorm(n*ncomp), ncomp, n) W <- Winit if (!is.function(fun)) { funlist <- c("negative kurtosis", "positive kurtosis", "4th moment") p <- pmatch(fun, funlist) if (is.na(p)) stop("ica: invalid fun") funname <- funlist[p] if (p == 1) fun <- tanh else if (p == 2) fun <- function(x) {x - tanh(x)} else if (p == 3) fun <- function(x) {sign(x)*x^2} } else funname <- as.character(substitute(fun)) for (i in 1:epochs) for (j in 1:m) { x <- X[j,, drop=FALSE] y <- W%*%t(x) gy <- fun(y) W <- W + lrate*gy%*%(x-t(gy)%*%W) } colnames(W) <- NULL pr <- X%*%t(W) retval <- list(weights = W, projection = pr, epochs = epochs, fun = funname, lrate = lrate, initweights = Winit) class(retval) <- "ica" return(retval) } print.ica <- function(x, ...) { cat(x$epochs, "Trainingssteps with a learning rate of", x$lrate, "\n") cat("Function used:", x$fun,"\n\n") cat("Weightmatrix\n") print(x$weights, ...) } plot.ica <- function(x, ...) pairs(x$pr, ...) e1071/R/matchClasses.R0000755000175100001440000001504014173734133013774 0ustar hornikusersclassAgreement <- function (tab, match.names=FALSE) { n <- sum(tab) ni <- apply(tab, 1, sum) nj <- apply(tab, 2, sum) ## patch for matching factors if (match.names && !is.null(dimnames(tab))) { lev <- intersect (colnames (tab), rownames(tab)) p0 <- sum(diag(tab[lev,lev]))/n pc <- sum(ni[lev] * nj[lev])/n^2 } else { # cutoff larger dimension m <- min(length(ni), length(nj)) p0 <- sum(diag(tab[1:m, 1:m]))/n pc <- sum((ni[1:m] / n) * (nj[1:m] / n)) } n2 <- choose(n, 2) rand <- 1 + (sum(tab^2) - (sum(ni^2) + sum(nj^2))/2)/n2 nis2 <- sum(choose(ni[ni > 1], 2)) njs2 <- sum(choose(nj[nj > 1], 2)) crand <- (sum(choose(tab[tab > 1], 2)) - (nis2 * njs2)/n2)/((nis2 + njs2)/2 - (nis2 * njs2)/n2) list(diag = p0, kappa = (p0 - pc)/(1 - pc), rand = rand, crand = crand) } matchClasses <- function(tab, method = "rowmax", iter=1, maxexact=9, verbose=TRUE){ methods <- c("rowmax", "greedy", "exact") method <- pmatch(method, methods) rmax <- apply(tab,1,which.max) myseq <- 1:ncol(tab) cn <- colnames(tab) rn <- rownames(tab) if(is.null(cn)){ cn <- myseq } if(is.null(rn)){ rn <- myseq } if(method==1){ retval <- rmax } if(method==2 | method==3){ if(ncol(tab)!=nrow(tab)){ stop("Unique matching only for square tables.") } dimnames(tab) <- list(myseq, myseq) cmax <- apply(tab,2,which.max) retval <- rep(NA, ncol(tab)) names(retval) <- colnames(tab) baseok <- cmax[rmax]==myseq for(k in myseq[baseok]){ therow <- (tab[k,])[-rmax[k]] thecol <- (tab[, rmax[k]])[-k] if(max(outer(therow, thecol, "+")) < tab[k, rmax[k]]){ retval[k] <- rmax[k] } else{ baseok[k] <- FALSE } } if(verbose){ cat("Direct agreement:", sum(baseok), "of", ncol(tab), "pairs\n") } if(!all(baseok)){ if(method==3){ if(sum(!baseok)>maxexact){ method <- 2 warning(paste("Would need permutation of", sum(!baseok), "numbers, resetting to greedy search\n")) } else{ iter <- gamma(ncol(tab)-sum(baseok)+1) if(verbose){ cat("Iterations for permutation matching:", iter, "\n") } perm <- permutations(ncol(tab)-sum(baseok)) } } ## rest for permute matching if(any(baseok)){ rest <- myseq[-retval[baseok]] } else{ rest <- myseq } for(l in 1:iter){ newretval <- retval if(method == 2){ ok <- baseok while(sum(!ok)>1){ rest <- myseq[!ok] k <- sample(rest, 1) if(any(ok)){ rmax <- tab[k, -newretval[ok]] } else{ rmax <- tab[k,] } newretval[k] <- as.numeric(names(rmax)[which.max(rmax)]) ok[k] <- TRUE } newretval[!ok] <- myseq[-newretval[ok]] } else{ newretval[!baseok] <- rest[perm[l,]] } if(l>1){ agree <- sum(diag(tab[,newretval]))/sum(tab) if(agree>oldagree){ retval <- newretval oldagree <- agree } } else{ retval <- newretval agree <- oldagree <- sum(diag(tab[,newretval]))/sum(tab) } } } } if(verbose){ cat("Cases in matched pairs:", round(100*sum(diag(tab[,retval]))/sum(tab), 2), "%\n") } if(any(as.character(myseq)!=cn)){ retval <- cn[retval] } names(retval) <- rn retval } compareMatchedClasses <- function(x, y, method="rowmax", iter=1, maxexact=9, verbose=FALSE) { if(missing(y)){ retval <- list(diag=matrix(NA, nrow=ncol(x), ncol=ncol(x)), kappa=matrix(NA, nrow=ncol(x), ncol=ncol(x)), rand=matrix(NA, nrow=ncol(x), ncol=ncol(x)), crand=matrix(NA, nrow=ncol(x), ncol=ncol(x))) for(k in 1:(ncol(x)-1)){ for(l in (k+1):ncol(x)){ tab <- table(x[,k], x[,l]) m <- matchClasses(tab, method=method, iter=iter, verbose=verbose, maxexact=maxexact) a <- classAgreement(tab[,m]) retval$diag[k,l] <- a$diag retval$kappa[k,l] <- a$kappa retval$rand[k,l] <- a$rand retval$crand[k,l] <- a$crand } } } else{ x <- as.matrix(x) y <- as.matrix(y) retval <- list(diag=matrix(NA, nrow=ncol(x), ncol=ncol(y)), kappa=matrix(NA, nrow=ncol(x), ncol=ncol(y)), rand=matrix(NA, nrow=ncol(x), ncol=ncol(y)), crand=matrix(NA, nrow=ncol(x), ncol=ncol(y))) for(k in 1:ncol(x)){ for(l in 1:ncol(y)){ tab <- table(x[,k], y[,l]) m <- matchClasses(tab, method=method, iter=iter, verbose=verbose, maxexact=maxexact) a <- classAgreement(tab[,m]) retval$diag[k,l] <- a$diag retval$kappa[k,l] <- a$kappa retval$rand[k,l] <- a$rand retval$crand[k,l] <- a$crand } } } retval } permutations <- function(n) { if(n ==1) return(matrix(1)) else if(n<2) stop("n must be a positive integer") z <- matrix(1) for (i in 2:n) { x <- cbind(z, i) a <- c(1:i, 1:(i - 1)) z <- matrix(0, ncol=ncol(x), nrow=i*nrow(x)) z[1:nrow(x),] <- x for (j in 2:i-1) { z[j*nrow(x)+1:nrow(x),] <- x[, a[1:i+j]] } } dimnames(z) <- NULL z } e1071/R/stft.R0000755000175100001440000000144614173734133012347 0ustar hornikusersstft <- function(X, win=min(80,floor(length(X)/10)), inc=min(24, floor(length(X)/30)), coef=64, wtype="hanning.window") { numcoef <- 2*coef if (win > numcoef) { win <- numcoef cat ("stft: window size adjusted to", win, ".\n") } numwin <- trunc ((length(X) - win) / inc) ## compute the windows coefficients wincoef <- eval(parse(text=wtype))(win) ## create a matrix Z whose columns contain the windowed time-slices z <- matrix (0, numwin + 1, numcoef) y <- z st <- 1 for (i in 0:numwin) { z[i+1, 1:win] <- X[st:(st+win-1)] * wincoef y[i+1,] <- fft(z[i+1,]) st <- st + inc } Y<- list (values = Mod(y[,1:coef]), windowsize=win, increment=inc, windowtype=wtype) class(Y) <- "stft" return(Y) } e1071/R/cmeans.R0000644000175100001440000001131014246371157012625 0ustar hornikuserscmeans <- function(x, centers, iter.max = 100, verbose = FALSE, dist = "euclidean", method = "cmeans", m = 2, rate.par = NULL, weights = 1, control = list()) { x <- as.matrix(x) xrows <- nrow(x) xcols <- ncol(x) if(missing(centers)) stop("Argument 'centers' must be a number or a matrix.") dist <- pmatch(dist, c("euclidean", "manhattan")) if(is.na(dist)) stop("invalid distance") if(dist == -1) stop("ambiguous distance") method <- pmatch(method, c("cmeans", "ufcl")) if(is.na(method)) stop("invalid clustering method") if(method == -1) stop("ambiguous clustering method") if(length(centers) == 1) { ncenters <- centers centers <- x[sample(1 : xrows, ncenters), , drop = FALSE] if(any(duplicated(centers))) { cn <- unique(x) mm <- nrow(cn) if(mm < ncenters) stop("More cluster centers than distinct data points.") centers <- cn[sample(1 : mm, ncenters), , drop = FALSE] } } else { centers <- as.matrix(centers) if(any(duplicated(centers))) stop("Initial centers are not distinct.") cn <- NULL ncenters <- nrow(centers) if (xrows < ncenters) stop("More cluster centers than data points.") } if(xcols != ncol(centers)) stop("Must have same number of columns in 'x' and 'centers'.") if(iter.max < 1) stop("Argument 'iter.max' must be positive.") if(method == 2) { if(missing(rate.par)) { rate.par <- 0.3 } } reltol <- control$reltol if(is.null(reltol)) reltol <- sqrt(.Machine$double.eps) if(reltol <= 0) stop("Control parameter 'reltol' must be positive.") if(any(weights < 0)) stop("Argument 'weights' has negative elements.") if(!any(weights > 0)) stop("Argument 'weights' has no positive elements.") weights <- rep_len(weights, xrows) weights <- weights / sum(weights) ## ## Do we really want to do this? perm <- sample(xrows) x <- x[perm, ] weights <- weights[perm] ## initcenters <- centers pos <- as.factor(1 : ncenters) rownames(centers) <- pos if(method == 1) { retval <- .C(R_cmeans, as.double(x), as.integer(xrows), as.integer(xcols), centers = as.double(centers), as.integer(ncenters), as.double(weights), as.double(m), as.integer(dist - 1), as.integer(iter.max), as.double(reltol), as.integer(verbose), u = double(xrows * ncenters), ermin = double(1), iter = integer(1)) } else if(method == 2) { retval <- .C(R_ufcl, x = as.double(x), as.integer(xrows), as.integer(xcols), centers = as.double(centers), as.integer(ncenters), as.double(weights), as.double(m), as.integer(dist - 1), as.integer(iter.max), as.double(reltol), as.integer(verbose), as.double(rate.par), u = double(xrows * ncenters), ermin = double(1), iter = integer(1) ) } centers <- matrix(retval$centers, ncol = xcols, dimnames = list(1 : ncenters, colnames(initcenters))) u <- matrix(retval$u, ncol = ncenters, dimnames = list(rownames(x), 1 : ncenters)) u <- u[order(perm), ] iter <- retval$iter - 1 withinerror <- retval$ermin cluster <- apply(u, 1, which.max) clustersize <- as.integer(table(cluster)) retval <- list(centers = centers, size = clustersize, cluster = cluster, membership = u, iter = iter, withinerror = withinerror, call = match.call()) class(retval) <- c("fclust") return(retval) } print.fclust <- function(x, ...) { cat("Fuzzy c-means clustering with", length(x$size), "clusters\n") cat("\nCluster centers:\n") print(x$centers, ...) cat("\nMemberships:\n") print(x$membership, ...) cat("\nClosest hard clustering:\n") print(x$cluster, ...) cat("\nAvailable components:\n") print(names(x), ...) invisible(x) } e1071/R/probplot.R0000755000175100001440000000367114173734133013232 0ustar hornikusersprobplot <- function(x, qdist=qnorm, probs=NULL, line=TRUE, xlab=NULL, ylab="Probability in %", ...) { DOTARGS <- as.list(substitute(list(...)))[-1] DOTARGS <- paste(names(DOTARGS), DOTARGS, sep="=", collapse=", ") xlab=deparse(substitute(x)) x <- sort(x) QNAME <- deparse(substitute(qdist)) DOTS <- list(...) qdist <- match.fun(qdist) QFUN <- function(p){ args=DOTS args$p=p do.call("qdist", args) } y <- QFUN(ppoints(length(x))) if(is.null(probs)){ probs <- c(.01, .05, seq(.1,.9, by=.1), .95, .99) if(length(x)>=1000) probs <- c(0.001, probs, .999) } qprobs <- QFUN(probs) plot(x, y, axes=FALSE, type="n", ylim=range(c(y,qprobs)), xlab=xlab, ylab=ylab) box() abline(h=qprobs, col="grey") axis(1) axis(2, at=qprobs, labels=100*probs) points(x, y) QTEXT <- paste("Quantile: ", QNAME, sep="") if(nchar(DOTARGS)) QTEXT <- paste(QTEXT, DOTARGS, sep=", ") mtext(QTEXT, side=1, line=3, adj=1) xl <- quantile(x, c(0.25, 0.75)) yl <- qdist(c(0.25, 0.75), ...) slope <- diff(yl)/diff(xl) int <- yl[1] - slope * xl[1] if(line){ abline(int, slope, col="red") } z <- list(qdist=QFUN, int=int, slope=slope) class(z) <- "probplot" invisible(z) } lines.probplot <- function(x, h=NULL, v=NULL, bend=FALSE, ...) { if(is.null(h) & is.null(v)){ abline(x$int, x$slope, ...) } pu <- par("usr") if(!is.null(h)){ h <- x$qdist(h) if(!bend){ abline(h=h, ...) } else{ v <- c(v, (h-x$int)/x$slope) } } if(!is.null(v)){ if(!bend){ abline(v=v, ...) } else{ h <- v*x$slope+x$int segments(v, pu[3], v, h, ...) segments(pu[1], h, v, h, ...) } } } e1071/R/e1071-deprecated.R0000755000175100001440000000000014173734133014203 0ustar hornikuserse1071/R/svm.R0000644000175100001440000006570114533645520012176 0ustar hornikuserssvm <- function (x, ...) UseMethod ("svm") svm.formula <- function (formula, data = NULL, ..., subset, na.action = na.omit, scale = TRUE) { call <- match.call() if (!inherits(formula, "formula")) stop("method is only for formula objects") m <- match.call(expand.dots = FALSE) if (inherits(eval.parent(m$data), "matrix")) m$data <- as.data.frame(eval.parent(m$data)) m$... <- NULL m$scale <- NULL m[[1L]] <- quote(stats::model.frame) m$na.action <- na.action m <- eval(m, parent.frame()) Terms <- attr(m, "terms") attr(Terms, "intercept") <- 0 x <- model.matrix(Terms, m) y <- model.extract(m, "response") attr(x, "na.action") <- attr(y, "na.action") <- attr(m, "na.action") attr(x, "xlevels") <- .getXlevels(Terms, m) if (length(scale) == 1) scale <- rep(scale, ncol(x)) if (any(scale)) { remove <- unique(c(which(labels(Terms) %in% names(attr(x, "contrasts"))), which(!scale) ) ) scale <- !attr(x, "assign") %in% remove } class(x) <- c("svm.formula", class(x)) ret <- svm.default (x, y, scale = scale, ..., na.action = na.action) ret$call <- call ret$call[[1]] <- as.name("svm") ret$terms <- Terms if (!is.null(attr(m, "na.action"))) ret$na.action <- attr(m, "na.action") class(ret) <- c("svm.formula", class(ret)) return (ret) } svm.default <- function (x, y = NULL, scale = TRUE, type = NULL, kernel = "radial", degree = 3, gamma = if (is.vector(x)) 1 else 1 / ncol(x), coef0 = 0, cost = 1, nu = 0.5, class.weights = NULL, cachesize = 40, tolerance = 0.001, epsilon = 0.1, shrinking = TRUE, cross = 0, probability = FALSE, fitted = TRUE, ..., subset, na.action = na.omit) { yorig <- y if(inherits(x, "Matrix")) { loadNamespace("SparseM") loadNamespace("Matrix") x <- as(x, "matrix.csr") } if(inherits(x, "simple_triplet_matrix")) { loadNamespace("SparseM") ind <- order(x$i, x$j) x <- new("matrix.csr", ra = x$v[ind], ja = x$j[ind], ia = as.integer(cumsum(c(1, tabulate(x$i[ind])))), dimension = c(x$nrow, x$ncol)) } if (sparse <- inherits(x, "matrix.csr")) loadNamespace("SparseM") ## NULL parameters? if(is.null(degree)) stop(sQuote("degree"), " must not be NULL!") if(is.null(gamma)) stop(sQuote("gamma"), " must not be NULL!") if(is.null(coef0)) stop(sQuote("coef0"), " must not be NULL!") if(is.null(cost)) stop(sQuote("cost"), " must not be NULL!") if(is.null(nu)) stop(sQuote("nu"), " must not be NULL!") if(is.null(epsilon)) stop(sQuote("epsilon"), " must not be NULL!") if(is.null(tolerance)) stop(sQuote("tolerance"), " must not be NULL!") xlevels <- attr(x, "xlevels") xhold <- if (fitted) x else NULL x.scale <- y.scale <- NULL formula <- inherits(x, "svm.formula") ## determine model type if (is.null(type)) type <- if (is.null(y)) "one-classification" else if (is.factor(y)) "C-classification" else "eps-regression" type <- pmatch(type, c("C-classification", "nu-classification", "one-classification", "eps-regression", "nu-regression"), 99) - 1 if (type > 10) stop("wrong type specification!") kernel <- pmatch(kernel, c("linear", "polynomial", "radial", "sigmoid"), 99) - 1 if (kernel > 10) stop("wrong kernel specification!") nac <- attr(x, "na.action") ## scaling, subsetting, and NA handling if (sparse) { scale <- rep(FALSE, ncol(x)) if(!is.null(y)) na.fail(y) x <- SparseM::t(SparseM::t(x)) ## make shure that col-indices are sorted } else { x <- as.matrix(x) ## subsetting and na-handling for matrices if (!formula) { if (!missing(subset)) { x <- x[subset,] y <- y[subset] if (!is.null(xhold)) xhold <- as.matrix(xhold)[subset,] } if (is.null(y)) x <- na.action(x) else { df <- na.action(data.frame(y, x, check.names = FALSE)) y <- df[,1] x <- as.matrix(df[,-1], rownames.force = TRUE) nac <- attr(x, "na.action") <- attr(y, "na.action") <- attr(df, "na.action") } } ## scaling if (length(scale) == 1) scale <- rep(scale, ncol(x)) if (any(scale)) { co <- !apply(x[,scale, drop = FALSE], 2, var) if (any(co)) { warning(paste("Variable(s)", paste(sQuote(colnames(x[,scale, drop = FALSE])[co]), sep="", collapse=" and "), "constant. Cannot scale data.") ) scale <- rep(FALSE, ncol(x)) } else { xtmp <- scale_data_frame(x[,scale]) x[,scale] <- xtmp x.scale <- attributes(xtmp)[c("scaled:center","scaled:scale")] if (is.numeric(y) && (type > 2)) { yorig <- y y <- scale(y) y.scale <- attributes(y)[c("scaled:center","scaled:scale")] y <- as.vector(y) } } } } ## further parameter checks nr <- nrow(x) if (cross > nr) stop(sQuote("cross"), " cannot exceed the number of observations!") ytmp <- y attributes(ytmp) <- NULL if (!is.vector(ytmp) && !is.factor(y) && type != 2) stop("y must be a vector or a factor.") if (type != 2 && length(y) != nr) stop("x and y don't match.") if (cachesize < 0.1) cachesize <- 0.1 if (type > 2 && !is.numeric(y)) stop("Need numeric dependent variable for regression.") lev <- NULL weightlabels <- NULL ## in case of classification: transform factors into integers if (type == 2) # one class classification --> set dummy y <- rep(1, nr) else if (is.factor(y)) { lev <- levels(y) y <- as.integer(y) } else { if (type < 3) { if(any(as.integer(y) != y)) stop("dependent variable has to be of factor or integer type for classification mode.") y <- as.factor(y) lev <- levels(y) y <- as.integer(y) } else lev <- unique(y) } if (type < 3 && !is.null(class.weights)) { if (is.character(class.weights) && class.weights == "inverse") { class.weights <- 1 / table(y) names(class.weights) = lev } if (is.null(names(class.weights))) stop("Weights have to be specified along with their according level names !") weightlabels <- match (names(class.weights), lev) if (any(is.na(weightlabels))) stop("At least one level name is missing or misspelled.") } nclass <- 2 if (type < 2) nclass <- length(lev) if (type > 1 && length(class.weights) > 0) { class.weights <- NULL warning(sQuote("class.weights"), " are set to NULL for regression mode. For classification, use a _factor_ for ", sQuote("y"), ", or specify the correct ", sQuote("type"), " argument.") } err <- empty_string <- paste(rep(" ", 255), collapse = "") if (is.null(type)) stop("type argument must not be NULL!") if (is.null(kernel)) stop("kernel argument must not be NULL!") if (is.null(degree)) stop("degree argument must not be NULL!") if (is.null(gamma)) stop("gamma argument must not be NULL!") if (is.null(coef0)) stop("coef0 seed argument must not be NULL!") if (is.null(cost)) stop("cost argument must not be NULL!") if (is.null(nu)) stop("nu argument must not be NULL!") if (is.null(cachesize)) stop("cachesize argument must not be NULL!") if (is.null(tolerance)) stop("tolerance argument must not be NULL!") if (is.null(epsilon)) stop("epsilon argument must not be NULL!") if (is.null(shrinking)) stop("shrinking argument must not be NULL!") if (is.null(cross)) stop("cross argument must not be NULL!") if (is.null(sparse)) stop("sparse argument must not be NULL!") if (is.null(probability)) stop("probability argument must not be NULL!") cret <- .C (R_svmtrain, ## data as.double (if (sparse) x@ra else t(x)), as.integer (nr), as.integer(ncol(x)), as.double (y), ## sparse index info as.integer (if (sparse) x@ia else 0), as.integer (if (sparse) x@ja else 0), ## parameters as.integer (type), as.integer (kernel), as.integer (degree), as.double (gamma), as.double (coef0), as.double (cost), as.double (nu), as.integer (weightlabels), as.double (class.weights), as.integer (length (class.weights)), as.double (cachesize), as.double (tolerance), as.double (epsilon), as.integer (shrinking), as.integer (cross), as.integer (sparse), as.integer (probability), ## results nclasses = integer (1), nr = integer (1), # nr of support vectors index = integer (nr), labels = integer (nclass), nSV = integer (nclass), rho = double (nclass * (nclass - 1) / 2), coefs = double (nr * (nclass - 1)), sigma = double (1), probA = double (nclass * (nclass - 1) / 2), probB = double (nclass * (nclass - 1) / 2), cresults = double (cross), ctotal1 = double (1), ctotal2 = double (1), error = err ) if (cret$error != empty_string) stop(paste(cret$error, "!", sep="")) cret$index <- cret$index[1:cret$nr] ret <- list ( call = match.call(), type = type, kernel = kernel, cost = cost, degree = degree, gamma = gamma, coef0 = coef0, nu = nu, epsilon = epsilon, sparse = sparse, scaled = scale, x.scale = x.scale, y.scale = y.scale, nclasses = cret$nclasses, #number of classes levels = lev, tot.nSV = cret$nr, #total number of sv nSV = cret$nSV[1:cret$nclasses], #number of SV in diff. classes labels = cret$labels[1:cret$nclasses], #labels of the SVs. SV = if (sparse) SparseM::t(SparseM::t(x[cret$index])) else t(t(x[cret$index,,drop = FALSE])), #copy of SV index = cret$index, #indexes of sv in x ##constants in decision functions rho = cret$rho[1:(cret$nclasses * (cret$nclasses - 1) / 2)], ##probabilites compprob = probability, probA = if (!probability) NULL else cret$probA[1:(cret$nclasses * (cret$nclasses - 1) / 2)], probB = if (!probability) NULL else cret$probB[1:(cret$nclasses * (cret$nclasses - 1) / 2)], sigma = if (probability) cret$sigma else NULL, ##coefficiants of sv coefs = if (cret$nr == 0) NULL else t(matrix(cret$coefs[1:((cret$nclasses - 1) * cret$nr)], nrow = cret$nclasses - 1, byrow = TRUE)), na.action = nac, xlevels = xlevels ) ## cross-validation-results if (cross > 0) if (type > 2) { scale.factor <- if (any(scale)) crossprod(y.scale$"scaled:scale") else 1; ret$MSE <- cret$cresults * scale.factor; ret$tot.MSE <- cret$ctotal1 * scale.factor; ret$scorrcoeff <- cret$ctotal2; } else { ret$accuracies <- cret$cresults; ret$tot.accuracy <- cret$ctotal1; } class (ret) <- "svm" if (fitted) { ret$fitted <- na.action(predict(ret, xhold, decision.values = TRUE)) ret$decision.values <- attr(ret$fitted, "decision.values") attr(ret$fitted, "decision.values") <- NULL if (type > 1) ret$residuals <- yorig - ret$fitted } ret } predict.svm <- function (object, newdata, decision.values = FALSE, probability = FALSE, ..., na.action = na.omit) { if (missing(newdata)) return(fitted(object)) if (object$tot.nSV < 1) stop("Model is empty!") if(inherits(newdata, "Matrix")) { loadNamespace("SparseM") loadNamespace("Matrix") newdata <- as(newdata, "matrix.csr") } if(inherits(newdata, "simple_triplet_matrix")) { loadNamespace("SparseM") ind <- order(newdata$i, newdata$j) newdata <- new("matrix.csr", ra = newdata$v[ind], ja = newdata$j[ind], ia = as.integer(cumsum(c(1, tabulate(newdata$i[ind])))), dimension = c(newdata$nrow, newdata$ncol)) } sparse <- inherits(newdata, "matrix.csr") if (object$sparse || sparse) loadNamespace("SparseM") act <- NULL if ((is.vector(newdata) && is.atomic(newdata))) newdata <- t(t(newdata)) if (sparse) newdata <- SparseM::t(SparseM::t(newdata)) preprocessed <- !is.null(attr(newdata, "na.action")) rowns <- if (!is.null(rownames(newdata))) rownames(newdata) else 1:nrow(newdata) if (!object$sparse) { if (inherits(object, "svm.formula")) { if(is.null(colnames(newdata))) colnames(newdata) <- colnames(object$SV) newdata <- na.action(newdata) act <- attr(newdata, "na.action") newdata <- model.matrix(delete.response(terms(object)), as.data.frame(newdata), xlev = object$xlevels) } else { ## FIXME: would be safer, but users might provide new data with ## other colnames than the training data ... ## if (!is.null(colnames(newdata))) ## newdata <- newdata[,colnames(object$SV)] newdata <- na.action(as.matrix(newdata)) act <- attr(newdata, "na.action") } } if (!is.null(act) && !preprocessed) rowns <- rowns[-act] if (ncol(object$SV) != ncol(newdata)) stop ("test data does not match model !") if (any(object$scaled)) newdata[,object$scaled] <- scale_data_frame(newdata[,object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", scale = object$x.scale$"scaled:scale" ) ret <- .C (R_svmpredict, as.integer (decision.values), as.integer (probability), ## model as.double (if (object$sparse) object$SV@ra else t(object$SV)), as.integer (nrow(object$SV)), as.integer(ncol(object$SV)), as.integer (if (object$sparse) object$SV@ia else 0), as.integer (if (object$sparse) object$SV@ja else 0), as.double (as.vector(object$coefs)), as.double (object$rho), as.integer (object$compprob), as.double (if (object$compprob) object$probA else 0), as.double (if (object$compprob) object$probB else 0), as.integer (object$nclasses), as.integer (object$tot.nSV), as.integer (object$labels), as.integer (object$nSV), as.integer (object$sparse), ## parameter as.integer (object$type), as.integer (object$kernel), as.integer (object$degree), as.double (object$gamma), as.double (object$coef0), ## test matrix as.double (if (sparse) newdata@ra else t(newdata)), as.integer (nrow(newdata)), as.integer (if (sparse) newdata@ia else 0), as.integer (if (sparse) newdata@ja else 0), as.integer (sparse), ## decision-values ret = double(nrow(newdata)), dec = double(nrow(newdata) * object$nclasses * (object$nclasses - 1) / 2), prob = double(nrow(newdata) * object$nclasses) ) ret2 <- if (is.character(object$levels)) # classification: return factors factor (object$levels[ret$ret], levels = object$levels) else if (object$type == 2) # one-class-classification: return TRUE/FALSE ret$ret == 1 else if (any(object$scaled) && !is.null(object$y.scale)) # return raw values, possibly scaled back ret$ret * object$y.scale$"scaled:scale" + object$y.scale$"scaled:center" else ret$ret names(ret2) <- rowns ret2 <- napredict(act, ret2) if (decision.values) { colns = c() for (i in 1:(object$nclasses - 1)) for (j in (i + 1):object$nclasses) colns <- c(colns, paste(object$levels[object$labels[i]], "/", object$levels[object$labels[j]], sep = "")) attr(ret2, "decision.values") <- napredict(act, matrix(ret$dec, nrow = nrow(newdata), byrow = TRUE, dimnames = list(rowns, colns) ) ) } if (probability && object$type < 2) { if (!object$compprob) warning("SVM has not been trained using `probability = TRUE`, probabilities not available for predictions.") else attr(ret2, "probabilities") <- napredict(act, matrix(ret$prob, nrow = nrow(newdata), byrow = TRUE, dimnames = list(rowns, object$levels[object$labels]) ) ) } ret2 } print.svm <- function (x, ...) { cat("\nCall:", deparse(x$call, 0.8 * getOption("width")), "\n", sep="\n") cat("Parameters:\n") cat(" SVM-Type: ", c("C-classification", "nu-classification", "one-classification", "eps-regression", "nu-regression")[x$type+1], "\n") cat(" SVM-Kernel: ", c("linear", "polynomial", "radial", "sigmoid")[x$kernel+1], "\n") if (x$type==0 || x$type==3 || x$type==4) cat(" cost: ", x$cost, "\n") if (x$kernel==1) cat(" degree: ", x$degree, "\n") if (x$type==1 || x$type==2 || x$type==3) cat(" gamma: ", x$gamma, "\n") if (x$kernel==1 || x$kernel==3) cat(" coef.0: ", x$coef0, "\n") if (x$type==1 || x$type==2 || x$type==4) cat(" nu: ", x$nu, "\n") if (x$type==3) { cat(" epsilon: ", x$epsilon, "\n\n") if (x$compprob) cat("Sigma: ", x$sigma, "\n\n") } cat("\nNumber of Support Vectors: ", x$tot.nSV) cat("\n\n") } summary.svm <- function(object, ...) structure(object, class="summary.svm") print.summary.svm <- function (x, ...) { print.svm(x) if (x$type<2) { cat(" (", x$nSV, ")\n\n") cat("\nNumber of Classes: ", x$nclasses, "\n\n") cat("Levels:", if(is.numeric(x$levels)) "(as integer)", "\n", x$levels) } cat("\n\n") if (x$type==2) cat("\nNumber of Classes: 1\n\n\n") if ("MSE" %in% names(x)) { cat(length (x$MSE), "-fold cross-validation on training data:\n\n", sep="") cat("Total Mean Squared Error:", x$tot.MSE, "\n") cat("Squared Correlation Coefficient:", x$scorrcoef, "\n") cat("Mean Squared Errors:\n", x$MSE, "\n\n") } if ("accuracies" %in% names(x)) { cat(length (x$accuracies), "-fold cross-validation on training data:\n\n", sep="") cat("Total Accuracy:", x$tot.accuracy, "\n") cat("Single Accuracies:\n", x$accuracies, "\n\n") } cat("\n\n") } plot.svm <- function(x, data, formula = NULL, fill = TRUE, grid = 50, slice = list(), symbolPalette = palette(), svSymbol = "x", dataSymbol = "o", ...) { if (x$type < 3) { if (is.null(formula) && ncol(data) == 3) { formula <- formula(delete.response(terms(x))) formula[2:3] <- formula[[2]][2:3] } if (is.null(formula)) stop("missing formula.") if (fill) { sub <- model.frame(formula, data) xr <- seq(min(sub[, 2]), max(sub[, 2]), length.out = grid) yr <- seq(min(sub[, 1]), max(sub[, 1]), length.out = grid) l <- length(slice) if (l < ncol(data) - 3) { slnames <- names(slice) slice <- c(slice, rep(list(0), ncol(data) - 3 - l)) names <- labels(delete.response(terms(x))) names(slice) <- c(slnames, names[!names %in% c(colnames(sub), slnames)]) } for (i in names(which(vapply(data, is.factor, NA)))) if (!is.factor(slice[[i]])) { levs <- levels(data[[i]]) lev <- if (is.character(slice[[i]])) slice[[i]] else levs[1] fac <- factor(lev, levels = levs) if (is.na(fac)) stop(paste("Level", dQuote(lev), "could not be found in factor", sQuote(i))) slice[[i]] <- fac } lis <- c(list(yr), list(xr), slice) names(lis)[1:2] <- colnames(sub) new <- expand.grid(lis)[, labels(terms(x))] preds <- predict(x, new) filled.contour(xr, yr, matrix(as.numeric(preds), nrow = length(xr), byrow = TRUE), plot.axes = { axis(1) axis(2) colind <- as.numeric(model.response(model.frame(x, data))) dat1 <- data[-x$index,] dat2 <- data[x$index,] coltmp1 <- symbolPalette[colind[-x$index]] coltmp2 <- symbolPalette[colind[x$index]] points(formula, data = dat1, pch = dataSymbol, col = coltmp1) points(formula, data = dat2, pch = svSymbol, col = coltmp2) }, levels = 1:(length(levels(preds)) + 1), key.axes = axis(4, 1:(length(levels(preds))) + 0.5, labels = levels(preds), las = 3), plot.title = title(main = "SVM classification plot", xlab = names(lis)[2], ylab = names(lis)[1]), ...) } else { plot(formula, data = data, type = "n", ...) colind <- as.numeric(model.response(model.frame(x, data))) dat1 <- data[-x$index,] dat2 <- data[x$index,] coltmp1 <- symbolPalette[colind[-x$index]] coltmp2 <- symbolPalette[colind[x$index]] points(formula, data = dat1, pch = dataSymbol, col = coltmp1) points(formula, data = dat2, pch = svSymbol, col = coltmp2) invisible() } } } write.svm <- function (object, svm.file = "Rdata.svm", scale.file = "Rdata.scale", yscale.file = "Rdata.yscale") { ret <- .C (R_svmwrite, ## model as.double (if (object$sparse) object$SV@ra else t(object$SV)), as.integer (nrow(object$SV)), as.integer(ncol(object$SV)), as.integer (if (object$sparse) object$SV@ia else 0), as.integer (if (object$sparse) object$SV@ja else 0), as.double (as.vector(object$coefs)), as.double (object$rho), as.integer (object$compprob), as.double (if (object$compprob) object$probA else 0), as.double (if (object$compprob) object$probB else 0), as.integer (object$nclasses), as.integer (object$tot.nSV), as.integer (object$labels), as.integer (object$nSV), as.integer (object$sparse), ## parameter as.integer (object$type), as.integer (object$kernel), as.integer (object$degree), as.double (object$gamma), as.double (object$coef0), ## filename as.character(svm.file) )$ret write.table(data.frame(center = object$x.scale$"scaled:center", scale = object$x.scale$"scaled:scale"), file=scale.file, col.names=FALSE, row.names=FALSE) if (!is.null(object$y.scale)) write.table(data.frame(center = object$y.scale$"scaled:center", scale = object$y.scale$"scaled:scale"), file=yscale.file, col.names=FALSE, row.names=FALSE) } coef.svm <- function(object, ...) { if (object$kernel != 0 || object$nclasses > 2) stop("Only implemented for regression or binary classification with linear kernel.") ret <- if (inherits(object$SV, "matrix.csr")) { loadNamespace("SparseM") drop(crossprod(object$coefs, SparseM::as.matrix(object$SV))) } else drop(crossprod(object$coefs, object$SV)) trm <- object$terms if(!is.null(trm)) names(ret) <- labels(trm) c(`(Intercept)` = -object$rho, ret) } e1071/R/hanning.window.R0000755000175100001440000000022714173734133014313 0ustar hornikusershanning.window <- function (n) { if (n == 1) c <- 1 else { n <- n-1 c <- 0.5 - 0.5*cos(2*pi*(0:n)/n) } return(c) } e1071/R/sparse.R0000644000175100001440000000377214246371157012671 0ustar hornikusersread.matrix.csr <- function(file, fac = TRUE, ncol = NULL) { l <- strsplit(readLines(file), "[ ]+") ## extract y-values, if any y <- if (is.na(l[[1]][1]) || length(grep(":",l[[1]][1]))) NULL else vapply(l, function(x) x[1], double(1)) ## x-values rja <- do.call("rbind", lapply(l, function(x) do.call("rbind", strsplit(if (is.null(y)) x else x[-1], ":") ) ) ) ja <- as.integer(rja[,1]) ia <- cumsum(c(1, vapply(l, length, integer(1)) - !is.null(y))) max.ja <- max(ja) dimension <- c(length(l), if (is.null(ncol)) max.ja else max(ncol, max.ja)) x = new(getClass("matrix.csr", where = asNamespace("SparseM")), ra = as.numeric(rja[,2]), ja = ja, ia = as.integer(ia), dimension = as.integer(dimension)) if (length(y)) list(x = x, y = if (fac) as.factor(y) else as.numeric(y)) else x } write.matrix.csr <- function (x, file = "out.dat", y = NULL, fac = TRUE) { on.exit(sink()) x <- SparseM::as.matrix.csr(x) if (!is.null(y) & (length(y) != nrow(x))) stop(paste("Length of y (=", length(y), ") does not match number of rows of x (=", nrow(x), ")!", sep="")) sink(file) l <- length(x@ra) zerocols <- all(x@ja < ncol(x)) if (!is.null(y) && is.factor(y) && fac) y <- as.character(y) for (i in 1:nrow(x)) { if (!is.null(y)) cat (y[i],"") if ((x@ia[i] <= l) && (x@ia[i] < x@ia[i + 1])) { for (j in x@ia[i] : (x@ia[i + 1] - 1)) cat(x@ja[j], ":", x@ra[j], " ", sep="") if (zerocols) { cat(ncol(x), ":", 0, " ", sep="") zerocols <- FALSE } } cat("\n") } } na.fail.matrix.csr <- function(object, ...) { if (any(is.na(object@ra))) stop("missing values in object") else return(object) } e1071/R/hamming.window.R0000755000175100001440000000023114173734133014304 0ustar hornikusershamming.window <- function (n) { if (n == 1) c <- 1 else { n <- n-1 c <- 0.54 - 0.46*cos(2*pi*(0:n)/n) } return(c) } e1071/R/lca.R0000755000175100001440000001572714533656212012136 0ustar hornikuserslca <- function(x, k, niter=100, matchdata=FALSE, verbose=FALSE) { ## if x is a data matrix -> create patterns if (is.matrix(x)) { if (matchdata) { x <- countpattern(x, matching=TRUE) xmat <- x$matching x <- x$pat } else x <- countpattern(x, matching=FALSE) } else ## if no data ist given, matchdata must be FALSE matchdata <- FALSE n <- sum(x) npat <- length(x) nvar <- round(log(npat)/log(2)) ## build matrix of all possible binary vectors b <- matrix(0, 2^nvar, nvar) for (i in 1:nvar) b[, nvar+1-i] <- rep(rep(c(0,1),c(2^(i-1),2^(i-1))),2^(nvar-i)) ## initialize probabilities classprob <- runif(k) classprob <- classprob/sum(classprob) names(classprob) <- 1:k p <- matrix(runif(nvar*k), k) pas <- matrix(0, k, npat) classsize <- numeric(k) for (i in 1:niter) { for (j in 1:k) { ## P(pattern|class) mp <- t(b)*p[j,]+(1-t(b))*(1-p[j,]) pas[j,] <- drop(exp(rep(1,nvar)%*%log(mp))) # column product } ## P(pattern|class)*P(class) pas <- pas * classprob ## P(class|pattern) sump <- drop(rep(1,k)%*%pas) # column sums pas <- t(t(pas)/sump) spas <- t(t(pas)*x) classsize <- drop(spas%*%rep(1,npat)) # row sums classprob <- classsize/n p <- pas%*%(x*b)/classsize if (verbose) cat("Iteration:", i, "\n") } for (j in 1:k) { mp <- t(b)*p[j,]+(1-t(b))*(1-p[j,]) pas[j,] <- drop(exp(rep(1,nvar)%*%log(mp)))*classprob[j] # column product } ## LogLikelihood pmust <- drop(rep(1,k)%*%pas) # column sums ll <- sum(x*log(pmust)) ## Likelihoodquotient xg0 <- x[x>0] ll0 <- sum(xg0*log(xg0/n)) lq <- 2*(ll0-ll) ## bic bic <- -2*ll+log(n)*(k*(nvar+1)-1) bicsat <- -2*ll0+log(n)*(2^nvar-1) ## chisq ch <- sum((x-n*pmust)^2/(n*pmust)) ## P(class|pattern) sump <- drop(rep(1,k)%*%pas) # column sums pas <- t(t(pas)/sump) mat <- max.col(t(pas)) if (matchdata) mat <- mat[xmat] colnames(p) <- 1:nvar rownames(p) <- 1:k lcaresult <- list(classprob=classprob, p=p, matching=mat, logl=ll, loglsat=ll0, chisq=ch, lhquot=lq, bic=bic, bicsat=bicsat, n=n, np=(k*(nvar+1)-1), matchdata=matchdata) class(lcaresult) <- "lca" return(lcaresult) } print.lca <- function(x, ...) { cat("LCA-Result\n") cat("----------\n\n") cat("Datapoints:", x$n, "\n") cat("Classes: ", length(x$classprob), "\n") cat("Probability of classes\n") print(round(x$classprob,3)) cat("Itemprobabilities\n") print(round(x$p,2)) } summary.lca <- function(object, ...) { nvar <- ncol(object$p) object$npsat <- 2^nvar-1 object$df <- 2^nvar-1-object$np object$pvallhquot <- 1-pchisq(object$lhquot,object$df) object$pvalchisq <- 1-pchisq(object$chisq,object$df) object$k <- length(object$classprob) ## remove unnecessary list elements object$classprob <- NULL object$p <- NULL object$matching <- NULL class(object) <- "summary.lca" return(object) } print.summary.lca <- function(x, ...) { cat("LCA-Result\n") cat("----------\n\n") cat("Datapoints:", x$n, "\n") cat("Classes: ", x$k, "\n") cat("\nGoodness of fit statistics:\n\n") cat("Number of parameters, estimated model:", x$np, "\n") cat("Number of parameters, saturated model:", x$npsat, "\n") cat("Log-Likelihood, estimated model: ", x$logl, "\n") cat("Log-Likelihood, saturated model: ", x$loglsat, "\n") cat("\nInformation Criteria:\n\n") cat("BIC, estimated model:", x$bic, "\n") cat("BIC, saturated model:", x$bicsat, "\n") cat("\nTestStatistics:\n\n") cat("Likelihood ratio: ", x$lhquot, " p-val:", x$pvallhquot, "\n") cat("Pearson Chi^2: ", x$chisq, " p-val:", x$pvalchisq, "\n") cat("Degress of freedom:", x$df, "\n") } bootstrap.lca <- function(l, nsamples=10, lcaiter=30, verbose=FALSE) { n <- l$n classprob <- l$classprob nclass <- length(l$classprob) prob <- l$p nvar <- ncol(l$p) npat <- 2^nvar ## build matrix of all possible binary vectors b <- matrix(0, npat, nvar) for (i in 1:nvar) b[, nvar+1-i] <- rep(rep(c(0,1),c(2^(i-1),2^(i-1))),2^(nvar-i)) ll <- lq <- ll0 <- ch <- numeric(nsamples) for (i in 1:nsamples) { ## generate data cm <- sample(1:nclass, size=n, replace=TRUE, prob=classprob) x <- matrix(runif(n*nvar), nrow=n) x <- (xX): ", x$pvalzratio, "\n") cat("P-Val: ", x$pvalratio, "\n\n") cat("Pearson's Chisquare\n\n") cat("Mean:", x$chisqmean, "\n") cat("SDev:", x$chisqsd, "\n") cat("Value in Data Set:", x$chisqorg, "\n") cat("Z-Statistics: ", x$zchisq, "\n") cat("P(Z>X): ", x$pvalzchisq, "\n") cat("P-Val: ", x$pvalchisq, "\n\n") } predict.lca <- function(object, x, ...) { if (object$matchdata) stop("predict.lca: only possible, if lca has been called with matchdata=FALSE") else { x <- countpattern(x, matching=TRUE) return(object$matching[x$matching]) } } e1071/R/bincombinations.R0000644000175100001440000000035114246371157014540 0ustar hornikusers## Kopie in mlbench bincombinations <- function(p) { retval <- matrix(0, nrow=2^p, ncol=p) for(n in 1:p){ retval[,n] <- rep(c(rep(0, (2^p/2^n)), rep(1, (2^p/2^n))), length.out = 2^p) } retval } e1071/R/rwiener.R0000755000175100001440000000022314173734133013032 0ustar hornikusersrwiener <- function(end=1, frequency=1000) { z<-cumsum(rnorm(end*frequency)/sqrt(frequency)) ts(z, start=1/frequency, frequency=frequency) } e1071/R/cshell.R0000644000175100001440000001461714246371157012646 0ustar hornikuserscshell <- function (x, centers, iter.max = 100, verbose = FALSE, dist = "euclidean", method = "cshell", m=2, radius= NULL) { x <- as.matrix(x) xrows <- dim(x)[1] xcols <- dim(x)[2] xold <- x perm <- sample(xrows) x <- x[perm, ] ## initial values are given if (is.matrix(centers)) ncenters <- dim(centers)[1] else { ## take centers random vectors as initial values ncenters <- centers centers <- x[rank(runif(xrows))[1:ncenters], ]+0.001 } ## initialize radius if (missing(radius)) radius <- rep(0.2,ncenters) else radius <- as.double(radius) dist <- pmatch(dist, c("euclidean", "manhattan")) if (is.na(dist)) stop("invalid distance") if (dist == -1) stop("ambiguous distance") method <- pmatch(method, c("cshell")) if (is.na(method)) stop("invalid clustering method") if (method == -1) stop("ambiguous clustering method") initcenters <- centers ## dist <- matrix(0, xrows, ncenters) ## necessary for empty clusters pos <- as.factor(1 : ncenters) rownames(centers) <- pos iter <- integer(1) flag <- integer(1) retval <- .C(R_cshell, xrows = as.integer(xrows), xcols = as.integer(xcols), x = as.double(x), ncenters = as.integer(ncenters), centers = as.double(centers), iter.max = as.integer(iter.max), iter = as.integer(iter), verbose = as.integer(verbose), dist = as.integer(dist-1), U = double(xrows*ncenters), UANT = double(xrows*ncenters), m = as.double(m), ermin = double(1), radius = as.double(radius), flag = as.integer(flag) ) centers <- matrix(retval$centers, ncol = xcols, dimnames = dimnames(initcenters)) radius <- as.double(retval$radius) U <- retval$U U <- matrix(U, ncol=ncenters) UANT <- retval$UANT UANT <- matrix(UANT, ncol=ncenters) iter <- retval$iter flag <- as.integer(retval$flag) ## Optimization part while (((flag == 1) || (flag==4)) && (iter<=iter.max)) { flag <- 3 system <- function (spar=c(centers,radius), x, U, m, i) { k <- dim(x)[1] d <- dim(x)[2] nparam<-length(spar) v<-spar[1:(nparam-1)] r<-spar[nparam] ##distance matrix x_k - v_i distmat <- t(t(x)-v) ##norm from x_k - v_i normdist <- distmat[,1]^2 for (j in 2:d) normdist<-normdist+distmat[,j]^2 normdist <- sqrt(normdist) ##equation 5 op <- sum( (U[,i]^m) * (normdist-r) )^2 ##equation 4 equationmatrix <- ((U[,i]^m) * (1-r/normdist))*distmat ## ## This had just apply(), but optim() really needs a scalar ## fn. ## What do we really want here? op<- op+sum(apply(equationmatrix, 2, sum)^2) ## } for (i in 1:ncenters) { spar <- c(centers[i,],radius[i]) npar <- length(spar) optimres <- optim(spar, system, method="CG", x=x, U=U, m=m, i=i) centers[i,] <- optimres$par[1:(npar-1)] radius[i] <- optimres$par[npar] } retval <- .C(R_cshell, xrows = as.integer(xrows), xcols = as.integer(xcols), x = as.double(x), ncenters = as.integer(ncenters), centers = as.double(centers), iter.max = as.integer(iter.max), iter = as.integer(iter-1), verbose = as.integer(verbose), dist = as.integer(dist-1), U = as.double(U), UANT = as.double(UANT), m = as.double(m), ermin = double(1), radius = as.double(radius), flag = as.integer(flag) ) flag<-retval$flag if (retval$flag!=2) flag<-1 centers <- matrix(retval$centers, ncol = xcols, dimnames = dimnames(initcenters)) radius <- as.double(retval$radius) U <- retval$U U <- matrix(U, ncol=ncenters) UANT <- retval$UANT UANT <- matrix(UANT, ncol=ncenters) iter <- retval$iter } centers <- matrix(retval$centers, ncol = xcols, dimnames = list(pos, colnames(initcenters))) U <- matrix(retval$U, ncol = ncenters, dimnames = list(rownames(x), 1 : ncenters)) U <- U[order(perm),] clusterU <- apply(U, 1, which.max) clustersize <- as.integer(table(clusterU)) radius <- as.double(retval$radius) retval <- list(centers = centers, radius=radius, size = clustersize, cluster = clusterU, iter = retval$iter - 1, membership=U, withinerror = retval$ermin, call = match.call()) class(retval) <- c("cshell", "fclust") return(retval) } ## unfinished! ## ## predict.cshell <- function(object, newdata, ...){ ## xrows<-dim(newdata)[1] ## xcols<-dim(newdata)[2] ## ncenters <- object$centers ## cluster <- integer(xrows) ## clustersize <- integer(ncenters) ## f <- object$m ## radius <- object$radius ## if(dim(object$centers)[2] != xcols){ ## stop("Number of variables in cluster object and x are not the same!") ## } ## retval <- .C("cshell_assign", ## xrows = as.integer(xrows), ## xcols = as.integer(xcols), ## x = as.double(newdata), ## ncenters = as.integer(ncenters), ## centers = as.double(object$centers), ## dist = as.integer(object$dist-1), ## U = double(xrows*ncenters), ## f = as.double(f), ## radius = as.double(radius)) ## U <- retval$U ## U <- matrix(U, ncol=ncenters) ## clusterU <- apply(U,1,which.max) ## clustersize <- as.integer(table(clusterU)) ## object$iter <- NULL ## object$cluster <- clusterU ## object$size <- retval$clustersize ## object$membership <- U ## return(object) ## } e1071/R/kurtosis.R0000755000175100001440000000111514173734133013243 0ustar hornikuserskurtosis <- function(x, na.rm = FALSE, type = 3) { if(any(ina <- is.na(x))) { if(na.rm) x <- x[!ina] else return(NA) } if(!(type %in% (1 : 3))) stop("Invalid 'type' argument.") n <- length(x) x <- x - mean(x) r <- n * sum(x ^ 4) / (sum(x ^ 2) ^ 2) y <- if(type == 1) r - 3 else if(type == 2) { if(n < 4) stop("Need at least 4 complete observations.") ((n + 1) * (r - 3) + 6) * (n - 1) / ((n - 2) * (n - 3)) } else r * (1 - 1 / n) ^ 2 - 3 y } e1071/R/plot.stft.R0000755000175100001440000000021014173734133013310 0ustar hornikusersplot.stft <- function (x, col = gray (63:0/63), ...) { x <- x$values image(x=1:dim(x)[1], y=1:dim(x)[2], z=x, col=col, ...) } e1071/R/shortestPaths.R0000755000175100001440000000146614173734133014244 0ustar hornikusersallShortestPaths <- function(x){ x <- as.matrix(x) x[is.na(x)] <- .Machine$double.xmax x[is.infinite(x) & x>0] <- .Machine$double.xmax if(ncol(x) != nrow(x)) stop("x is not a square matrix") n <- ncol(x) z <- .C(R_e1071_floyd, as.integer(n), double(n^2), as.double(x), integer(n^2) ) z <- list(length = matrix(z[[2]], n), middlePoints = matrix(z[[4]]+1, n)) z$length[z$length == .Machine$double.xmax] <- NA z } extractPath <- function(obj, start, end){ z <- integer(0) path <- function(i, j){ k <- obj$middlePoints[i, j] if (k != 0) { path(i,k); z <<- c(z, k) path(k,j); } } path(start,end) c(start, z, end) } e1071/R/rectangle.window.R0000755000175100001440000000005614173734133014635 0ustar hornikusersrectangle.window <- function (n) rep (1, n) e1071/R/matchControls.R0000755000175100001440000000420014173734133014176 0ustar hornikusersmatchControls <- function(formula, data = list(), subset, contlabel = "con", caselabel = NULL, dogrep = TRUE, replace = FALSE) { if (system.file(package = "cluster") == "") stop("Could not load required package 'cluster'!") if (system.file(package = "stats") == "") stop("Could not load required package 'stats'!") m <- match.call() m$contlabel <- m$caselabel <- m$dogrep <- m$replace <- NULL m$na.action <- function(x) x m[[1L]] <- quote(stats::model.frame) m1 <- eval(m, sys.frame(sys.parent())) ## the full model.frame is used only to determine the number of rows ## of the complete data frame m$subset <- NULL m2 <- eval(m, sys.frame(sys.parent())) if (dogrep) { ok <- grep(contlabel, as.character(model.response(m1))) controls <- rownames(m1)[ok] if (is.null(caselabel)) { cases <- rownames(m1)[-ok] } else { ok <- grep(caselabel, as.character(model.response(m1))) cases <- rownames(m1)[ok] } } else { controls <- rownames(m1)[model.response(m1) == contlabel] if (is.null(caselabel)){ cases <- rownames(m1)[model.response(m1) != contlabel] } else { ok <- rep(FALSE, nrow(m1)) for (l in caselabel){ ok <- ok | (model.response(m1) == l) } cases <- rownames(m1)[ok] } } d <- as.matrix(stats::as.dist(cluster::daisy(m1[,-1,drop=FALSE]))) which.is.min <- function (x) { y <- seq(length(x))[(x == min(x, na.rm = TRUE)) & !is.na(x)] if (length(y) > 1) sample(y, 1) else y } retval <- rep("", length(cases)) for (k in 1 : length(cases)) { retval[k] <- controls[which.is.min(d[cases[k], controls])] if (!replace) controls <- controls[controls != retval[k]] } fac <- rep(NA, nrow(m2)) names(fac) <- rownames(m2) fac[cases] <- "case" fac[retval] <- "cont" fac <- factor(fac) list(cases = cases, controls = retval, factor = fac) } e1071/R/hamming.distance.R0000755000175100001440000000060014173734133014567 0ustar hornikusershamming.distance <- function(x,y){ z<-NULL if(is.vector(x) && is.vector(y)){ z <- sum(x != y) } else{ z <- matrix(0,nrow=nrow(x),ncol=nrow(x)) for(k in 1:(nrow(x)-1)){ for(l in (k+1):nrow(x)){ z[k,l] <- hamming.distance(x[k,], x[l,]) z[l,k] <- z[k,l] } } dimnames(z) <- list(dimnames(x)[[1]], dimnames(x)[[1]]) } z } e1071/R/gknn.R0000644000175100001440000000772314533650064012325 0ustar hornikusersgknn <- function(x, ...) UseMethod("gknn") gknn.formula <- function (formula, data = NULL, ..., subset, na.action = na.pass, scale = TRUE) { call <- match.call() if (!inherits(formula, "formula")) stop("method is only for formula objects") m <- match.call(expand.dots = FALSE) if (inherits(eval.parent(m$data), "matrix")) m$data <- as.data.frame(eval.parent(m$data)) m$... <- NULL m$scale <- NULL m[[1L]] <- quote(stats::model.frame) m$na.action <- na.action m <- eval(m, parent.frame()) Terms <- attr(m, "terms") attr(Terms, "intercept") <- 0 x <- model.matrix(Terms, m) y <- model.extract(m, "response") attr(x, "na.action") <- attr(y, "na.action") <- attr(m, "na.action") attr(x, "xlevels") <- .getXlevels(Terms, m) if (length(scale) == 1) scale <- rep(scale, ncol(x)) if (any(scale)) { remove <- unique(c(which(labels(Terms) %in% names(attr(x, "contrasts"))), which(!scale)) ) scale <- !attr(x, "assign") %in% remove } ret <- gknn.default (x, y, scale = scale, ..., na.action = na.action) ret$call <- call ret$call[[1]] <- as.name("gknn") ret$terms <- Terms ret$na.action <- attr(x, "na.action") class(ret) <- c("gknn.formula", class(ret)) return (ret) } gknn.default <- function(x, y, k = 1, method = NULL, scale = TRUE, use_all = TRUE, FUN = mean, ...) { if (length(scale) == 1) scale <- rep(scale, ncol(x)) if (is.numeric(x) && any(scale)) { tmp <- scale(x[,scale]) x[,scale] <- tmp attr(x, "scaled:center") <- attr(tmp, "scaled:center") attr(x, "scaled:scale") <- attr(tmp, "scaled:scale") } structure(list( x = x, y = y, k = k, FUN = FUN, method = method, use_all = use_all, scaled = is.numeric(x) && any(scale), scale = scale), class = "gknn" ) } predict.gknn <- function(object, newdata, type = c("class", "votes", "prob"), ..., na.action = na.pass) { if (missing(newdata)) return(fitted(object)) type = match.arg(type) if (inherits(object, "gknn.formula")) { if(is.null(colnames(newdata))) colnames(newdata) <- colnames(object$x) newdata <- na.action(newdata) act <- attr(newdata, "na.action") newdata <- model.matrix(delete.response(terms(object)), as.data.frame(newdata), xlev = attr(object$x, "xlevels")) } else { newdata <- na.action(as.matrix(newdata)) act <- attr(newdata, "na.action") } if (object$scaled) newdata[,object$scale] <- scale(newdata[,object$scale, drop = FALSE], center = attr(object$x, "scaled:center"), scale = attr(object$x, "scaled:scale") ) d <- dist(object$x, newdata, method = object$method) FUN <- function(x) { o <- order(x) ks <- which(x[o][object$k] == x) ## check for ties on kth place if (!object$use_all) ks <- sample(c(ks, ks), 1) ## handle ties lab <- object$y[c(head(o[1:object$k], -1), ks)] if (is.numeric(lab)) object$FUN(lab) else { tab <- table(lab) switch(type, class = levels(object$y)[sample(rep(which(tab == max(tab)), 2), 1)], ## break class tie by random prob = prop.table(tab), tab) } } ret <- apply(d, 2, FUN) if (is.matrix(ret)) t(ret) else if (is.numeric(object$y)) napredict(act, ret) else napredict(act, factor(ret, levels = levels(object$y))) } print.gknn <- function(x, ...) { cat("Object of class 'gknn'.\n") } fitted.gknn <- function(object, ...) napredict(object$na.action, object$y) e1071/R/skewness.R0000755000175100001440000000105014173734133013220 0ustar hornikusersskewness <- function(x, na.rm = FALSE, type = 3) { if(any(ina <- is.na(x))) { if(na.rm) x <- x[!ina] else return(NA) } if(!(type %in% (1 : 3))) stop("Invalid 'type' argument.") n <- length(x) x <- x - mean(x) y <- sqrt(n) * sum(x ^ 3) / (sum(x ^ 2) ^ (3/2)) if(type == 2) { if(n < 3) stop("Need at least 3 complete observations.") y <- y * sqrt(n * (n - 1)) / (n - 2) } else if(type == 3) y <- y * ((1 - 1 / n)) ^ (3/2) y } e1071/R/bclust.R0000644000175100001440000001605014246371157012661 0ustar hornikusers"bclust" <- function (x, centers = 2, iter.base = 10, minsize = 0, dist.method = "euclidean", hclust.method = "average", base.method = "kmeans", base.centers = 20, verbose = TRUE, final.kmeans = FALSE, docmdscale=FALSE, resample=TRUE, weights=NULL, maxcluster=base.centers, ...) { x <- as.matrix(x) xr <- nrow(x) xc <- ncol(x) CLUSFUN <- get(base.method) object <- list(allcenters = matrix(0, ncol = xc, nrow = iter.base * base.centers), allcluster = NULL, hclust = NULL, members = NULL, cluster = NULL, centers = NULL, iter.base = iter.base, base.centers = base.centers, prcomp = NULL, datamean = apply(x, 2, mean), colnames = colnames(x), dist.method = dist.method, hclust.method = hclust.method, maxcluster = maxcluster) class(object) <- "bclust" optSEM <- getOption("show.error.messages") if(is.null(optSEM)) optSEM <- TRUE on.exit(options(show.error.messages = optSEM)) if (verbose) cat("Committee Member:") for (n in 1:iter.base) { if (verbose){ cat(" ", n, sep = "") } if(resample){ x1 <- x[sample(xr, replace = TRUE, prob=weights), ] } else{ x1 <- x } for(m in 1:20){ if(verbose) cat("(",m,")",sep="") options(show.error.messages = FALSE) tryres <- try(CLUSFUN(x1, centers = base.centers, ...)) if(!inherits(tryres, "try-error")) break } options(show.error.messages = optSEM) if(m==20) stop("Could not find valid cluster solution in 20 replications\n") object$allcenters[((n - 1) * base.centers + 1):(n * base.centers),] <- tryres$centers } object$allcenters <- object$allcenters[complete.cases(object$allcenters),,drop=FALSE] object$allcluster <- knn1(object$allcenters, x, factor(1:nrow(object$allcenters))) if(minsize > 0){ object <- prune.bclust(object, x, minsize=minsize) } if (verbose) cat("\nComputing Hierarchical Clustering\n") object <- hclust.bclust(object, x = x, centers = centers, final.kmeans = final.kmeans, docmdscale=docmdscale) object } "centers.bclust" <- function (object, k) { centers <- matrix(0, nrow = k, ncol = ncol(object$allcenters)) for (m in 1:k) { centers[m, ] <- apply(object$allcenters[object$members[,k-1] == m, , drop = FALSE], 2, mean) } centers } "clusters.bclust" <- function (object, k, x=NULL) { if(missing(x)) allcluster <- object$allcluster else allcluster <- knn1(object$allcenters, x, factor(1:nrow(object$allcenters))) return(object$members[allcluster, k - 1]) } "hclust.bclust" <- function (object, x, centers, dist.method = object$dist.method, hclust.method = object$hclust.method, final.kmeans = FALSE, docmdscale = FALSE, maxcluster=object$maxcluster) { d <- dist(object$allcenters, method = dist.method) if(hclust.method=="diana"){ if (system.file(package = "cluster") == "") stop("Could not load required package 'cluster'!") object$hclust <- stats::as.hclust(cluster::diana(d, diss=TRUE)) } else object$hclust <- stats::hclust(d, method = hclust.method) if(docmdscale){ object$cmdscale <- cmdscale(d) } object$members <- cutree(object$hclust, 2:maxcluster) object$cluster <- clusters.bclust(object, centers) object$centers <- centers.bclust(object, centers) if (final.kmeans) { kmeansres <- kmeans(x, centers = object$centers) object$centers <- kmeansres$centers object$cluster <- kmeansres$cluster } object } "plot.bclust" <- function (x, maxcluster=x$maxcluster, main = deparse(substitute(x)), ...) { opar <- par(c("mar", "oma")) on.exit(par(opar)) par(oma = c(0, 0, 3, 0)) layout(matrix(c(1, 1, 2, 2), 2, 2, byrow = TRUE)) par(mar = c(0, 4, 4, 1)) plot(x$hclust, labels = FALSE, hang = -1) x1 <- 1:maxcluster x2 <- 2:maxcluster y <- rev(x$hclust$height)[x1] z <- abs(diff(y)) par(mar = c(4, 4, 1, 2)) plot(x1, ((y - min(y))/(max(y) - min(y))), type = "l", xlab = "", ylab = "", ylim = c(0, 1)) lines(x2, z/sum(z), col = "grey") text(x2, z/sum(z), labels = as.character(x2)) # lx2 <- length(x2) # abline(h=qexp(.95, rate = length(x2)), lty=3, col="grey") # abline(h=qexp(.95^(1/lx2), rate = length(x2)), lty=3, col="grey") mtext(main, outer = TRUE, cex = 1.5) layout(1) } "boxplot.bclust" <- function (x, n = nrow(x$centers), bycluster = TRUE, main = deparse(substitute(x)), oneplot=TRUE, which=1:n, ...) { N <- length(which) opar <- par(c("mfrow", "oma", "mgp","xpd")) on.exit(par(opar)) par(xpd=NA) memb <- x$members[, (n - 1)] tmemb <- table(memb) cendf <- as.data.frame(x$allcenters) ylim <- range(x$allcenters) if (bycluster) { if(oneplot){ if (N <= 3) { par(mfrow = c(N, 1)) } else { par(mfrow = c(ceiling(N/2), 2)) } } tcluster <- table(clusters.bclust(x, n)) for (k in which) { boxplot(cendf[memb == k, ], col = "grey", names = rep("",ncol(cendf)), ylim = ylim, ...) if (!is.null(x$datamean)) { lines(x$datamean, col = "red") } if(!is.null(x$colnames)){ text(1:length(x$colnames)+0.2, par("usr")[3], adj=1,srt=35, paste(x$colnames, " ")) } title(main = paste("Cluster ", k, ": ", tmemb[k], " centers, ", tcluster[k], " data points", sep = "")) } } else { a <- ceiling(sqrt(ncol(cendf))) if(oneplot){ par(mfrow = c(a, ceiling(ncol(cendf)/a))) } memb <- as.factor(memb) for (k in 1:ncol(cendf)) { boxplot(cendf[, k] ~ memb, col = "grey", ylim = ylim, ...) title(main = x$colnames[k]) abline(h = x$datamean[k], col = "red") } } } ### prune centers that contain not at least minsize data points prune.bclust <- function(object, x, minsize=1, dohclust=FALSE, ...){ ok <- FALSE while(!all(ok)){ object$allcluster <- knn1(object$allcenters, x, factor(1:nrow(object$allcenters))) ok <- table(object$allcluster) >= minsize object$allcenters <- object$allcenters[ok, ] } if(dohclust){ object <- hclust.bclust(object, x, nrow(object$centers), ...) } object } e1071/R/fclustIndex.R0000755000175100001440000001521314533655727013667 0ustar hornikusersfclustIndex <- function ( y, x, index= "all" ) { clres <- y ########################################################################### ################SESSION 1: MEASURES######################################### ########################################################################### gath.geva <- function (clres,x)#for m=2 { xrows <- dim(clres$membership)[1] xcols <- dim(clres$centers)[2] ncenters <- dim(clres$centers)[1] scatter <- array(0.0, c(xcols, xcols, ncenters)) scatternew <- array(0.0, c(xcols, xcols, ncenters)) fhv <-as.double(0) apd <-as.double(0) pd <- as.double(0) control <- as.double(0) for (i in 1:ncenters){ paronomastis <- as.double(0) paronomastis2 <- as.double(0) for (j in 1:xrows){ paronomastis <- paronomastis+clres$membership[j,i] diff <- x[j,]-clres$centers[i,] scatternew[,,i] <- clres$membership[j,i]*(t(t(diff))%*%t(diff)) scatter[,,i] <- scatter[,,i]+scatternew[,,i] }#xrows scatter[,,i] <- scatter[,,i]/paronomastis for (j in 1:xrows){ diff <- x[j,]-clres$centers[i,] control <- (t(diff)%*%solve(scatter[,,i]))%*%t(t(diff)) if (control<1.0) paronomastis2 <- paronomastis2+clres$membership[j,i] ## else ## cat("...") }#xrows fhv <- fhv+sqrt(det(scatter[,,i])) apd <- apd+paronomastis2/sqrt(det(scatter[,,i])) pd <- pd+paronomastis2 }#ncenters pd <- pd/fhv apd <- apd/ncenters retval <- list(fuzzy.hypervolume=fhv,average.partition.density=apd, partition.density=pd) return(retval) } xie.beni <- function(clres){#for all m xrows <- dim(clres$membership)[1] minimum<--1 error <- clres$withinerror #sd ncenters <- dim(clres$centers)[1] for (i in 1:(ncenters-1)){ for (j in (i+1):ncenters){ diff<- clres$centers[i,]-clres$centers[j,] diffdist <- t(diff)%*%t(t(diff)) if (minimum==-1) minimum <- diffdist if (diffdist> stream x\isܶ_oM%n'n#+W3hky]}^8xjW4c A{E YP0ЅUa U* [ˊ\ ,(xepxW1, j1O]{50ܘBhyaL(LBX!TQ ,)+] ,RTP@P t]bɋ#cXbM&46 2h*n*c M!++ hԴ;nkE7 ̀w0^dP_03W%*\w0e̖V'3ۊᎤ`& @̵5f Q*ВVi34@3 *! p.ٟ>(_4r$`YQ~u^_.ߢ|MQ`mj->OrڬO +jsG<_7?Wn7xeϛbsyt/˛}yf]lWEz0Ϳ\݌uCv'R~š?@>h]uػGGz`vfoָi@jtҊ/5i-5KO7l \j|y419h- LEKK뜔{n1P~?!d @-B7?h:0@.i޼aL L AJ++񇘔X4qPkPx?BB ~8ym~ ${j=q9~_W-oxIt7]X(ndh8x*>[_l.W뷤asX 觞x(X+GA[9מ9|ah<|^V"g`G;q=:y=I" 0Fza:vdFVj`7l)eRX%MP-tۦ wF#-pG˅i4Á 粰 ͨa#,#Mq!EFZ;#`!W'cDuH(@. L 䆰",@^ 0 &0T4AL;l;pQxF;l;H,  `ݶWCvպϮl] aWLvv%ODe6jB/iF.L~~^kEBVt˩?j+ql N rw;,<'m'ۉ$;ҡ<QzQ|v\$Yr" .r"LDXHldeD„2D'$]2A޾ P/ >`0.F,Q ]*Q2P#fYpt2p(f"j,G39|9=bSoYPPl=J6It(OIt/:8NG!AItNXt~`un߁M2X$+MEP Bh",…ܱGXM@R $ɯEQ)BL|$:`{Gl\:xF!(:4,BJf}r~&oɷo=+3o?kS" r5.1M`N_|j)2Sڧy 3-nI4j%4,kzu$l뺝iۥ[@KܬXI$e@$.g\BI ,uv崺i=C4򎔌c0u|I"Ed/T:ʵkdwA) D\}vgEŁNls'OUj`ed[ ˾re}z nBex݈U\r>g+4E٢..5Qɗӟuz1懚1 Q ڍͩer*XstQ6euܔuSBuf[[z|}+?o&L8Ѐ"́U ̞8KCҤߵUPy>zzrgXȆG q̀y2?WJ.\r]7z߯.}FIM 6_Eɡ_?qw-Re wky1߭7ZݐƠ;z{/=goܣz"zXi$_Zv|ieJ_pIFF`//MSǚK#NA-S)u \%ct+nzJiT҆1MGbF;:a DLgXي옼f 0P$fqWD6"DULcW-f;::kz'V1iXQ  J8Rf(ex)md>"+B&}]c5ۛ,~:q_fF=I')s^gr\Po}tiuxlv-6۷;tl(z:pu3:a Y0J@$3?_!:CS:7j-C!9d|i$9c _s6t*rCEPgT mJrE\?R $;V+n/%*ų+xv'~X2qlLw*:+ϋTˋy"bxC`wt ™/\_/u/ӎQ_ l6q KW5qAѰAcis%lDV0I{u`"JX/;nX/;-IzIّ\X#/0æ+dpb F2TL'ہ̣,$<:2ṆyḶḷc}k> stream GPL Ghostscript 9.55.0 2023-12-05T18:29:44+01:00 2023-12-05T18:29:44+01:00 LaTeX with hyperref endstream endobj 68 0 obj << /Filter /FlateDecode /Length 2496 >> stream xYmog"(:] -[H H@(w rrl9F>= "M"Qz5,\ ZzڌUsmx0xF%y֛vԒ q,W)VW4sVp ]M\6QwS/ v[.ǭh1+ oCOH4aT,Nf}kܫwGiby 5C rB%2 D9C;p.OEWJAΥ.ˑ|^gB,w*u h>'D*dt atrk+jV\]ylKo R|H仛M^VQ \Ք&d!*iJcXXپ-ɛ|[2Y 5uLN7nTyԖDj.\B! )s7m !c]MT"Xp%x^ tzW䈔b_o$'܂qʄB ɗ/W<7e7Txư?o-?vw|pA5]Anb+KFhGRr_#"UF5U]<8R : bpJ]RSVĔ4@lP3j;hݷ$N%g{p=iVeyàf(H5>\@$&bmyYaE6pDqΩojT΂%:!`2i}sH2zȐG)qD 6Yd @HcO#3Dh"sO2szRx=NռPra"gJ3mwJ_@*0md%E7X͍DuC]/>!Ep$Fv|NOP` ui68n /\mnyw/QBzB}uܦY1x|'\ǁYy]pt%Yf 9nr"Vl,|HŘ|a^L"r!|E2ŜdWLn3ǏeWZȎ0ۣ()&Bajݼ)b\/8.doT)"_|QC6V Ip $>I+L4谊3Ud;䑃fsϙn!i!2xu@de LFkd&U.r:~`Hkc=,ogi {2a,lJ0O`0 9ik7*/w| .3ulš1};ݘ{syqXaN:H) k`cMplٽYaiC3臙b{9IxG/ Q Me@Oh*ycOf?FOHjGw5ɺ~%P>Vbov$ƃ֮˪vGR uGR@˃ˢ;Ox24J:]3ͦ P6yd(mž݃=#Æ7~ qtU7Kw_AoS*{dn#T7CH^\2Uq5|wUp*(|nڭϑqQt_!T>7Aa{zS]Nxl]oo om/ j.Kc7ػhM,mc+Uv>(m~sn|l ]R>s1 #'^w^tv%oFאIQZX} `MZ/hDj|Eh|ch޷ n,u1l[:y{=IuIw dOwwLN4WM}m&Ta෰0JI€)CJ?FEO7a `D_1ѰgGV`A#mhendstream endobj 69 0 obj << /Filter /FlateDecode /Length 3936 >> stream x[[CZIڦ@Eh"p<(Z_6fxWI8kQg8͍ŢzS,n7Ad W١VjLihrE-ƄBfl2[-ɆnM7x*GO)nVFRJ b̀tcL4 =ЈۦjHbD4ǏKmQ;Oν*j+~m gS+|JEyTY׎Ϟh_4x;lL,Y;~uT!&~0x˒cUbq߼w•ZiBT4T!AS\6#Sں!/V$2kзϨSԄgcG^ζ)>wNdz_i%vKnmwYK2 Tx~z=[Eʲq#INRdG2k7AcO-ZӘ[}9C\,'R'dDt PiueQe`o<O|m\8155r-ːWǡO_COkHh_Bdxg_ȩ_Y(Jˮ煨I 1Ȧr:+ِ6[UcR1:{?왆0Ud#]qSCAÆ1th*=g]Z}p|%U4 ֋N7Dȍ0~a/ '[[݀P*4 &y 櫃#b1]WU$)c*t;E\0@fRI*۹ Q_sp @C= ] Pn˂]}Y870B C*-0Z4'DH^DﴢqyYA@ g.d{cX0yx~6a0Lq2Y FwmS7C燼.Ct.kLl_ǥӧ[6z@Je*}ҺQ330M1nnjWׅSL)3/,z +B }+㶘}Lj"ISf-εI5ѕ\Յݺl=]x6i"zsR ~M)NTR#ͮͥJ^s-UiYUB )ѱዄ]N׻/Fam4)QH@貝oRWVm5x%&,]0'I+/ߚv;)e=N.D#d.H[+BkVpvkJ-YCEұi#XVk M ~ 6t4}È?3BG9Zv>V$7W\"8 Fr`nD"(T`A`e:s ggaLeM;b A񀬲]Z:/!GzN`R[laZihXSegq yd%xg*tIM^Wk{S/+VdYy?X`oK&&lsvɺk[:c\&_i{o_~*KX?c/3*EOTKJVDz D^JdFuM&Ҷ~-:w,#`O|/َRi&O3iv֡yk=ucmUͺlMH\W{}a8ܖ!r˗I]Bȳc\_t++hYyeJ;N| kڡuhO.okxڵ 6x<Op8eloqO}ڶc25mOBnRp:JrBL}Q̧Wm;wOtKx!2.sirich~s_A`uc2I͞#3eyN;xE8on%&3 iFweEQ ¸)c ,$] n {e&O\ ˹<憼"ɘI :Ti (JPȼHl/`o~F Ws+TPӊ|A&/sYZŤs>Nc1ŝYk:q"?tS,B5ڢD=#oT\adwORrw|E9? Wž#N`faj{BaN).jd^Nv#?o"RD#M()z.ʄU)Ʉ9 E)2>Rv "9" *)rʡsJe\T`ȵȅ%"k 6:\MG}>J`&Ε̨ENxqLN:$ Bn$:e!#s%(DTWSDU!VBbJ1)2w-3 !d_t6bD~g1Y񠊜Dx@U!7NZ$ҍʥ9\U_πH0ZC )71~3.*0Jf:+=W/bY$PE|t#?)AmɏVB'wUNYP=o9eL !'~ L-6骿 gwe࢑~lf4|C"zZui:SSM >Tn~b^" 'v.阸䬎wè 'j̺Lm 'C\cVT Gո?-:I& ƾ5][CλֶOI|n÷.F`K̂UȦ^aM2ɓU~ȍt]#ڟZ#QJ$Gs&#WS5BJ1 A16R #SD⫍PLjGJ $"^D:Gt` LP { `XJ:ײTW~$r5Ū%7RIq.²CDd#j6 6ۋ`؈P Ujb9D&<"'eɍts$`4ݜ+;c_a5j_:͛hl^5z}0!!q t ]1&,|z˼A ?vqz<5 EUgJ7r-}bU #.:7./q*T//qJE0Q s7^eoT7b'U*>]v"];<{ Iü,UMZ)h(Htm/IIlendstream endobj 70 0 obj << /Filter /FlateDecode /Length 213 >> stream x37ԳT0P0bsC3cC.=a\B3K Paĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂ;? jħ88$ ͪZ70ڊ&$_6[WL/Sd_.WO@.Vegendstream endobj 71 0 obj << /Filter /FlateDecode /Length 255 >> stream x37ԳT0PT5T03V03QH1230 !U`jlT032,X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[xr1 _eM@_Z۵òWdF HN aVp8bP}B1]=m=q;̛+?/}ձQn\Pes*sV+17MMdǂL \ \ Wendstream endobj 72 0 obj << /Filter /FlateDecode /Length 179 >> stream x37ԳT0P0V5T0T03RH1230 !U`fjT032@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQPúlNѾ)2}o]GOu6.WO@..Pendstream endobj 73 0 obj << /Filter /FlateDecode /Length 222 >> stream x37ԳT0P02V54V03P040PH1230!U`lfT0446i`&PɓKW4K?KK)YK%hp,`c ϥSW cg颠p֖QގPt鯨f_[7SjHܻ{??=o \=Yendstream endobj 74 0 obj << /Filter /FlateDecode /Length 222 >> stream x37ԳT0P04R54V0T040PH1230!U`lfT0446i`&PɓKW4K?KK)YK%hp,`c ϥSW cg颠|o>\ ow{$$^q[_} $b/][ 6L6mJwB `endstream endobj 75 0 obj << /Filter /FlateDecode /Length 186 >> stream x]A E6vMa!Eo_?cH_{gLѫ,X#~ uX[씫d@iLỜ> stream x3ԳT0P0U5T05S03QH1230 !U`j`T0@<&'BIQi*~8PKK)YK%hh,`c ͥSW bg颠R/$>db\ṗ/—_,?MCt}t[聯n۝t4i ysq1(0qz*rDzOWendstream endobj 77 0 obj << /Filter /FlateDecode /Length 181 >> stream x3631R0P0bcCKSC.=C a\B#S Pº@&f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P"i~[[o:->qV&3k:ys 7p04pz*rSLendstream endobj 78 0 obj << /Filter /FlateDecode /Length 165 >> stream x3631R0P0bc#CC.=Cɹ\ Ff`A2 ɓKW4K?KK)YK%hz,`cﭠ q)+걳tQP[vdLɕ'7.WO@.yUendstream endobj 79 0 obj << /Filter /FlateDecode /Length 202 >> stream x37ѳT0P0bsC3cC.=C a\B33 Paĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڂgY,1pxa|}ýEYV{_ڽ>^2_.RP4S! wVendstream endobj 80 0 obj << /Filter /FlateDecode /Length 193 >> stream x3531T0P0bK3cC.=ɹ\ &`A* u ͌MAj<=}JJSÁ= ]r;;66 @ܼb;;.Og$lb3hxdRvw/ǭe_GT$01(pz*rGHendstream endobj 81 0 obj << /Filter /FlateDecode /Length 245 >> stream x3534S0P0Q5T0T03QH1230 !U`bbT032@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmNwv(\縠/3{Z -'w H)mi;8gmAy{s~uڼ铽f{:6+jnjjAS! '(T|endstream endobj 82 0 obj << /Filter /FlateDecode /Length 195 >> stream x3531T0P0R5T01UPH123 !U`bdT2@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAm[o}Cc9?*eݲes.H:&nqTendstream endobj 83 0 obj << /Filter /FlateDecode /Length 258 >> stream x333Q0P0W5T03S03QH1230 !U`jaT032́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[mC.>U/͗ܛ\G>ID ֳxɷpK۫ߛ_z[k|=ԿeT؎&ή"$|08pz*r(\endstream endobj 84 0 obj << /Filter /FlateDecode /Length 193 >> stream x]M 4J6vMa!Eo_.73o~`mw]({D_Pcak@{#%NIڛ O l|WtP`JCTnl6Coʺ(.^&$Lx(."Ax,y5Rn+񊼼uCv$8`endstream endobj 85 0 obj << /Filter /FlateDecode /Length 218 >> stream x3534W0P0V5T05T0TH1230 !U`bnT@-@khsU()*M*w pV0w˥{us;qy(-VS$UD*sɦ{|K/? =ֻe[]cpi.sEbS!w3#B  Ueendstream endobj 86 0 obj << /Filter /FlateDecode /Length 201 >> stream x3136V0P0V5T01P01UH1230 !U`lfT01X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[lOKޗ_~,g?Zۿumoޖm $48\=#Aendstream endobj 87 0 obj << /Filter /FlateDecode /Length 252 >> stream x337U0P0V52T0P01UH1230!U`bbT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-\"!.RqacWڜu׫ޖݲM B؂}TU3/qt0!:9wna yN$t04ppz*r\Zendstream endobj 88 0 obj << /Filter /FlateDecode /Length 191 >> stream x3534W0P0bSC3KC.=C a\Bs Pa ĺ@FF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pb;䟦vO:{//+,̻CB Sendstream endobj 89 0 obj << /Filter /FlateDecode /Length 170 >> stream x323P0P0b#S3sC.=C a\B#C Pal700454)qU()*M*w pVr\fr;;66 @ܼb;;.OfBoOYskX\=f?_endstream endobj 90 0 obj << /Filter /FlateDecode /Length 214 >> stream x3531S0P0bK3KC.=C a\BS Pa ĺ@FF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pb;^埦vo'~}^}K_@~qꗿW~A08pz*r`Uendstream endobj 91 0 obj << /Filter /FlateDecode /Length 158 >> stream x323P0P0b#S3KC.=C a\B#C Pa ĺ@FF 5N\ %E\@ \@\N @K4X.}7}gg7 7F[A(㜟SW bg颠Ϭ/Jy?02pz*rNZDendstream endobj 92 0 obj << /Filter /FlateDecode /Length 205 >> stream x032U0P0bsKC.=C a\BsS Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pb;33J+\ϡvs%/^F~_ \6oD=\=:hUendstream endobj 93 0 obj << /Filter /FlateDecode /Length 185 >> stream x3534W0P0bSCC.=C a\Bs Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pb;zM}7Կ5__?x\x备01(pz*rHWendstream endobj 94 0 obj << /Filter /FlateDecode /Length 207 >> stream x337U0P0V5T01S01UH1230 !U`bd*2X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pp! ?G*ߗKM}]|˯)Unv+:3q$1, \ \&F}endstream endobj 95 0 obj << /Filter /FlateDecode /Length 214 >> stream x3534W0P0V5T05T01QH1230!U`bnT032@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[l9D+kr7?|w}B` $Y8}HSQp#B Sendstream endobj 96 0 obj << /Filter /FlateDecode /Length 177 >> stream x36׳4R0P0a3C.=C a\Bc# Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pڒ3 }JR[608pz*r]> stream x331S0P0V5T06U01UH1230 !U`lhT012X$sU()*M*w pVr\r;;66@\9y@-vv\. j yYYx ^o~8 l7+>qOPcca{nW{'jX!Aendstream endobj 98 0 obj << /Filter /FlateDecode /Length 187 >> stream x36׳4R0P0R5T06V03TH1230 !U`l`T032@XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠:wK'W`n׳.map`rTjGendstream endobj 99 0 obj << /Filter /FlateDecode /Length 183 >> stream x3534W0P0V5T05T01QH1230 !U`bnT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[l'y'n"1W 6]08pz*rVmIendstream endobj 100 0 obj << /Filter /FlateDecode /Length 191 >> stream x3531S0P0R5T0T01VH1230 !U`bfT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQPb,[vwmL \ \/A`endstream endobj 101 0 obj << /Filter /FlateDecode /Length 218 >> stream x3531S0P0R52P0T01VH1230!U`bfT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy((1W[tG{c_^?Ww[-_ '?_{lJ_!&Ũl `drTMendstream endobj 102 0 obj << /Filter /FlateDecode /Length 164 >> stream x323P0PP5T02P04PH1230!U`hhT02,,ɥPRTʥTɥTƥDMwwvvrllڹsJsZ<]6nxg:__[u}mɖ-8\=/endstream endobj 103 0 obj << /Filter /FlateDecode /Length 212 >> stream x337U0P0Q5R01U03SH1230 !U`b`T02<&'BIQi*~8PKK)YK%hh,`cﭠ q)+jtQP[s> ?GK/7uP:}wf[׳M˺PD B O endstream endobj 104 0 obj << /Filter /FlateDecode /Length 224 >> stream x337U0Pa33C.=C a\Bc  Pa ĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂg $Xx_/})}_YH_}]t鵽K.]e% ^RWҗ^[;-O Oendstream endobj 105 0 obj << /Filter /FlateDecode /Length 239 >> stream x337U0P0Q5R01U03SH1230 !U`b`T02<&'BIQi*~8PKK)YK%hh,`cﭠ q)+jtQP[!'`h/-˽|o??$/-;{.kg >qݻObUCD .6w͆N6$&t`aprTyQendstream endobj 106 0 obj << /Filter /FlateDecode /Length 225 >> stream x337U0P0U5R01Q03SH1230 !U`laT01LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-0--z`pbl |9͏{?ߪbUQO,l[љKM;"& "aB [jOendstream endobj 107 0 obj << /Filter /FlateDecode /Length 218 >> stream x373T0P0bs 2TH1230H*T033 U`yCc## 'O.}O_T.pz.}b.}g  4;KM V8qy(-#K0|_YH|v1F_Kio8 8N[AS! J[endstream endobj 108 0 obj << /Filter /FlateDecode /Length 220 >> stream x3731S0P0b3K3 C.=C a\B3 P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠ʐ0+slLxy$~o?@Uqӗ>pL4R iU:endstream endobj 109 0 obj << /Filter /FlateDecode /Length 199 >> stream x3333V0P0b3 PH1230H*T055 U&@ TF %N\ %E\@\@\N \.@c݀}o]s~Nin^1P,ۿ~߾}g6߿x>8B lQendstream endobj 110 0 obj << /Filter /FlateDecode /Length 173 >> stream x373T0P0b3K3 C.=C a\B3 P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠rb@C<1.bN ɼ\=U+endstream endobj 111 0 obj << /Filter /FlateDecode /Length 192 >> stream x36Q0P0b 3 C.=C a\Bs  Pa ĺ@@`djl RɥPRTʥTϥT̥`ȥ 4;KM V8qy(6-];Ϯ]ݲmSscﻞbV3GL \ \?tendstream endobj 112 0 obj << /Filter /FlateDecode /Length 249 >> stream x3534W0P0U5R0T07PH1230 !U`blT072LX9yr{*rr{Uq;8+rD wwvvrllt29y@-vv\. j  "[[j;2 8n}߳kOSe1}scV8X;ᛜDE>'#)"N}}7^54;Omaf^ݙ-!\M  \ \.Uxendstream endobj 113 0 obj << /Filter /FlateDecode /Length 183 >> stream x3731R0P0b3s3 C.=C a\B3c P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠#?&~i,`y3SF.WO@.Nendstream endobj 114 0 obj << /Filter /FlateDecode /Length 251 >> stream x3403P0P0R5RP0PH1230 !U`ijT072XD<=}JJSÁ = ]r;;66 @ܼb;;.O-FՖ83=1N4h^6#M?cWoz?M^L3%mu0d}fﵭS0ߚ[U.WO@.tendstream endobj 115 0 obj << /Filter /FlateDecode /Length 226 >> stream x337U0P0Q5T0P01UH1230 !U`blT012LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ָCN`{ ٗ~=Od\Vl~XEE|˪'W[.< 65GS! M8endstream endobj 116 0 obj << /Filter /FlateDecode /Length 213 >> stream x3534W0P0V5T05T0TH1230 !U`bnT@-@khsU()*M*w pV0w˥{us;qy(-Mij? q@5_k/CԼ_ޯ>*ٵEw]<M/;"Y\=Uendstream endobj 117 0 obj << /Filter /FlateDecode /Length 203 >> stream x3136V0P0V5T01P01UH1230 !U`lfT01X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ppFB{CK-eׯ_[W$VϬ[n]mm$u"6$,`bPrTnAendstream endobj 118 0 obj << /Filter /FlateDecode /Length 351 >> stream x]Mn0)MɢU`L"Y}oH!}S//i}ga5Sޥq*cdxm8ϒr\Ho5U{Pt[ژvN٩,4 wT{D7> stream x3532Q0P0V5T05P03TH1230 !U`bfT032XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠 am}'^ 0ᨍ?/^,!h~\ogz ݇.o&aƠ.Nendstream endobj 120 0 obj << /Filter /FlateDecode /Length 202 >> stream x3532Q0P0U5T01C.=C ɹ\ Ɩ`A3 u rN\ %E\@\@U\N \.@Cc݀}on.}ܼb;;.O;(|0o^K/W~Zݯov~މ7un:ͣ#M@mendstream endobj 121 0 obj << /Filter /FlateDecode /Length 249 >> stream x3532Q0P0VҦ && )\z@Q 1s L f@1u%<=}JJSÁ*=ʸ ]r;;66 @ܼb;;.O68Q8T%uR^ڮ2ɗwݭu9 bK߈ef}լof'>d_ K ([x Pæ.=̽PbK61q%&.WO@.1[endstream endobj 122 0 obj << /Filter /FlateDecode /Length 174 >> stream x3532Q0PbS3#C.=C a\Bc3 Paa7000177)qU()*M*w pV0w˥{+esJsZ<]lH_K.T)<(k  B @endstream endobj 123 0 obj << /Filter /FlateDecode /Length 183 >> stream x3532Q0P0U52V06W03RH1230!U`lhT02@,ɥPRTʥTɥTƥDMwwvvrllt29y@-vv\. j ][E>Gן'Yu6!۶m`hrTEendstream endobj 124 0 obj << /Filter /FlateDecode /Length 191 >> stream x3532Q0CSCC.=CU`j`Qhbf A <=}JJSÁ=J ]&r;;66 @ܼb;;.O;,o:E&G]lƢ5m? r f*_m.WO@.R1endstream endobj 125 0 obj << /Filter /FlateDecode /Length 193 >> stream x3532Q0P0S5T01C.=C ɹ\ `A3 u rN\ %E\@\@U\N \.@Cc݀}on.}ܼb;;.OGl#ۗ/4ʬǮY;3wCѢ[nmap`rTCendstream endobj 126 0 obj << /Filter /FlateDecode /Length 179 >> stream x3532Q0P0b C.=C a\BX0b]CcCCc'O.}O_T.p2.}0`ȥ 4;KM V8qy(-QE&a+P9_cM/|)j+X\=<> stream x3532Q0P0W5T01Q01UH1230 !U`lfT01́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ɖ{ U,__UjD|!z 6]{Tl{~x6f֮OZa ZCendstream endobj 128 0 obj << /Filter /FlateDecode /Length 181 >> stream x3532Q0P0R5T01Q05UH1230 !U`bhT052X$sU()*M*w pVr\r;;66@\9y@-vv\. j tԫL?Y?_׷>l٦ͣc w@endstream endobj 129 0 obj << /Filter /FlateDecode /Length 186 >> stream x3532Q0P0bKcC.=C a\B3 PadC3# 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm ̣O5Wo]z Ƿ;:AS! D+endstream endobj 130 0 obj << /Filter /FlateDecode /Length 220 >> stream x3532Q0P0V52V0T01VH1230!U`bjT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy("ݬ!NVk.?3/__w}M__}oo>ҭ6j`hrT3Tendstream endobj 131 0 obj << /Filter /FlateDecode /Length 192 >> stream x3532Q0P04WеP01V0TH1230!U`djT077`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmDkӦ5]q[+ߓC~_ }Lendstream endobj 132 0 obj << /Filter /FlateDecode /Length 193 >> stream x3532Q0PPеP06Q0TH1230 !U`djT072,XD<=}JJSÁ = ]r;;66 @ܼb;;.O72=j|;~} { X~ :nױ@T4TmCB &Fendstream endobj 133 0 obj << /Filter /FlateDecode /Length 143 >> stream x3532Q0PP0T01V02UH1230 !U`lbT0@lhirU()*MP0w pV0w˥{+esJs:<]V~ʚ̀")endstream endobj 134 0 obj << /Filter /FlateDecode /Length 119 >> stream x3532Q0P02F )\z 8#9(i0 .Pr{*rq{Ig  4> stream x3532Q0P0U5T01S03RH1230 !U`b`T032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[s> wd2=x x}wfۦQ6hnnnbk B LOendstream endobj 136 0 obj << /Filter /FlateDecode /Length 175 >> stream x3532Q0P04&& fF )\z 8#9P,TebV```habnnRɥPRTʥTͥ`ȥ 4> stream x3532Q0P0Q5T01W03RH1230 !U`bdT032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ S-[\U轶dˮku__WVkW04ppz*rCAwendstream endobj 138 0 obj << /Filter /FlateDecode /Length 248 >> stream x3532Q0P0Q5T01W03RH1230 !U`bdT032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[!~Η/&2Phb-D䗥qW_5Tue+>?ݙroˮݎm{zcٶ[7amá 01(pz*rPZuendstream endobj 139 0 obj << /Filter /FlateDecode /Length 206 >> stream x3532Q0P0bs3CC.=C a\B Paĺ@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Oj \3}‹ݿ>~o__Vb^SJS .WO@.Nendstream endobj 140 0 obj << /Filter /FlateDecode /Length 213 >> stream x3532Q0P0bS3CC.=a\B  Pº@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Oܾ[~Ffoz>-sww{][G\U6S! cWendstream endobj 141 0 obj << /Filter /FlateDecode /Length 199 >> stream x3532Q0P0bs3CC.=C a\B Paĺ@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Od,M?_Fhuփ.۪šYK20rz*rIbendstream endobj 142 0 obj << /Filter /FlateDecode /Length 218 >> stream x3532Q0P0R5T05T03TH1230 !U`baT032@XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠b+['WmOX~߿_F]hw} L:HujmvoMu`B Vendstream endobj 143 0 obj << /Filter /FlateDecode /Length 215 >> stream x3532Q0P0U5T05T01UH1230 !U4 * XɓKW4K?KK)YK%hh,`c ͥSW bg颠ЋEF&_oǽJ=1PV I,𢆺/Ex,NՊ-mHkH`p`rTDNendstream endobj 144 0 obj << /Filter /FlateDecode /Length 194 >> stream x3532Q0P0W5T01C.=C ɹ\ `A3 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]TPp|/|KM\zBnp2lfVF.WO@.n>endstream endobj 145 0 obj << /Filter /FlateDecode /Length 301 >> stream x]1n0 EwB7MKT\%Cl.> stream x3134V0P0V5T01Q0PH1230 !U`b`T02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8bN͓qȷT_ȱ__$jo[vEVC>oˎ$qG \ \Mendstream endobj 147 0 obj << /Filter /FlateDecode /Length 192 >> stream x36ӳ4T0P0R5T06U0PH123 !U`ldT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmA[b"! LJ &W/iݯUY~0neíoM  \ \>Cendstream endobj 148 0 obj << /Filter /FlateDecode /Length 178 >> stream x3236W0P0bcSKC.=a\B#  Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-8cqOK$GGO g`rT Aendstream endobj 149 0 obj << /Filter /FlateDecode /Length 234 >> stream x3135R0P0R5P01T0PH1230!U4 *F@ etU()*M*w pV0w˥{s;qy(- |FEvKA];W?ݲ޶Ko.]qzaUժ|;|^|fܥn;̙"&:ŁS! 'fT> stream x3134V0P0bS C.=C a\BC Pad#C3C 'O.}O_T.pr.}Z.}g %ht,`cﭠ q)+jtQP[Ra)GGr_f٧rG, V@Lendstream endobj 151 0 obj << /Filter /FlateDecode /Length 170 >> stream x3230W0P0aCS3C.=C a\BC  Paĺ@F& %N\ %E\@\@\N \.@c݀}o]s~Nin^1PڒǗMlҋ#Gڤ01(pz*rR=jendstream endobj 152 0 obj << /Filter /FlateDecode /Length 181 >> stream x3236W0P5Q54W0P05SH1230 !U`dhT076i`Y'O.}O_T.pR.}:.}g %hl,`c ΥSW bg颠!k 6I⥈(yz[4ڦͣsAendstream endobj 153 0 obj << /Filter /FlateDecode /Length 203 >> stream x31ֳ0R0PacS C.=C a\B Pad#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmI1@ {[?e x뗿$ׄ~߿߿o_.*N\aS! MWMendstream endobj 154 0 obj << /Filter /FlateDecode /Length 154 >> stream x3230W0P0aCS C.=C a\BC  Pad#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmIE08pz*rQt>endstream endobj 155 0 obj << /Filter /FlateDecode /Length 196 >> stream x33R0Pa3scsC.=C a\B3 Paĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-688C‡ _3Ԟ\efM"5?&7+H[唇1(0qz*rPendstream endobj 156 0 obj << /Filter /FlateDecode /Length 176 >> stream x3134V0P0bcsC.=C a\BC Paĺ@@`aij RɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. jK* [7;\QO_ |-&YAS! U?vendstream endobj 157 0 obj << /Filter /FlateDecode /Length 198 >> stream x3135R0P0R5T01P0PH1230 !U`lnT02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[C! M> stream x3134V0P0R54S01V06WH1230!U`b`T052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[Ra"cij&uKw[ߦ_?̡c#G$oG, \ \H2endstream endobj 159 0 obj << /Filter /FlateDecode /Length 172 >> stream x3635R0PacCcsC.=C a\B#  Paĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-Idoɫ4zY_c_V\=8endstream endobj 160 0 obj << /Filter /FlateDecode /Length 198 >> stream x3637U0P0V5T0 )\z@A 1s  Ɩ@1<=}JJSÁ = ]r;;66@\9y@-vv\. jfNpv|N>s8ahccQj1j-=endstream endobj 161 0 obj << /Filter /FlateDecode /Length 176 >> stream x363T0P0T5T0P05TH1230 !U`dfT052 XD<=}JJSÁ = ]r;;66@\9y@-vv\. j _zRbPGDu6m6.WO@.< endstream endobj 162 0 obj << /Filter /FlateDecode /Length 177 >> stream x3134V0P0R5T01Q06WH1230 !U`bhT02X$sU()*M*w pVr\r;;66@\9y@-vv\. jK*$l=OW|x?x^߲Dт ,\ \1Bendstream endobj 163 0 obj << /Filter /FlateDecode /Length 184 >> stream x31ֳ0R0P0R5T01R06SH1230 !U`liT062X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQ03ke۳wc_ݲ]oo]w}CB .>endstream endobj 164 0 obj << /Filter /FlateDecode /Length 211 >> stream x3Գ4W0P0R5T0P06SH1230 !U`jjT062X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQ0u[SA<˚ݽw۵K]{~['woWu8\=6Oendstream endobj 165 0 obj << /Filter /FlateDecode /Length 195 >> stream x31ֳ0R0P0bcc3C.=a\BC P 'O.}O_T.pz.}b.}g %hv,`cﭠ q)+jtQ0JS2{bwsz7nٴ[o®}^K^jվ{}UAoL \ \rAendstream endobj 166 0 obj << /Filter /FlateDecode /Length 206 >> stream x31ֳ0R0P0R54W01R06SH1230!U`liT052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQ03kebos^Vwgzvۦߺuӟ&73*N-۴X\=b8G6endstream endobj 167 0 obj << /Filter /FlateDecode /Length 190 >> stream x3135R0P0S52T06S03RH1230!U`diT02̀,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-XR{uҥG^f&Nh¯#]]],sCB Pendstream endobj 168 0 obj << /Filter /FlateDecode /Length 190 >> stream x3135R0P0S52T06S03RH1230!U`diT02̀,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(pq45ppu{ݓ>lpGbq[_{s& ,ot`hrT]nMendstream endobj 169 0 obj << /Filter /FlateDecode /Length 193 >> stream x3134V0P0bSKC.=a\B# Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\pAFP{@>ڗƒ{ce?8\=PFendstream endobj 170 0 obj << /Filter /FlateDecode /Length 213 >> stream x33R0P0b3sSKC.=a\B3S Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\p G½M½C!Gѐs/_Zw}?@ḋ,7|ʜYE30rz*rpMaWendstream endobj 171 0 obj << /Filter /FlateDecode /Length 168 >> stream x3230W0PaCs3C.=C a\BKPaĺ@ycC#K#'O.}O_T.pK.}b.}gC.}hѱ\nn@n.P9?47XΎEAm£CoHMş\1XĠ:endstream endobj 172 0 obj << /Filter /FlateDecode /Length 194 >> stream x363T0PP52P0P03RH1230!U`hiT02,,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-8^WWߪoݻy\=-)J)endstream endobj 173 0 obj << /Filter /FlateDecode /Length 197 >> stream x363T0P0Q52P02Q03RH1230!U`hiT02L,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(X(-߻w .Wq[_eˮK.u`hrT;J(endstream endobj 174 0 obj << /Filter /FlateDecode /Length 162 >> stream x3230W0P0W54S0PTH1230 !U`h`T022́,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQPaSֆ3:nK^1(0qz*rv.\endstream endobj 175 0 obj << /Filter /FlateDecode /Length 109 >> stream x323P0P0T04S02Q02TH1230 !U`ddT0҆ lfrU()*MP0w pV0wd@%endstream endobj 176 0 obj << /Filter /FlateDecode /Length 111 >> stream x3230W0PaCsKC.=C a\BK6b]48yr{*r+Xr{gC.}h\. 2 `AS! c Nendstream endobj 177 0 obj << /Filter /FlateDecode /Length 163 >> stream x3135R0P0bc3SSC.=C a\B#  Paĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PfFu3or.Q={endstream endobj 178 0 obj << /Filter /FlateDecode /Length 163 >> stream x3230W0PaCsc3C.=C a\BKPaĺ@y 020pU()*MWw pV0w˥{+esJs,<]6(<3kie?*"сS! y-endstream endobj 179 0 obj << /Filter /FlateDecode /Length 154 >> stream x333P0P0U04T03P06TH1230 !U`jbT022L,ɥPRTʥTȥTť`ȥ 44KM V8qy(t`?ڞ\`hrT{(endstream endobj 180 0 obj << /Filter /FlateDecode /Length 213 >> stream x333P0P0bSK3C.=C a\BSS Pa ĺ@ƆFF& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P) F__okqҺ/_~zKio+[11(0qz*rFQMendstream endobj 181 0 obj << /Filter /FlateDecode /Length 194 >> stream x353R0P0bSCSsC.=C a\Bs Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(p?=߿'9~@?ظ B vLendstream endobj 182 0 obj << /Filter /FlateDecode /Length 189 >> stream x333P0P0bSKSsC.=C a\BSS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(:!0tEa? N E]endstream endobj 183 0 obj << /Filter /FlateDecode /Length 176 >> stream x3Գ4W0P0bSsJ1230H*T056 U .P8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j;g`7~GDG68\= Fdendstream endobj 184 0 obj << /Filter /FlateDecode /Length 211 >> stream x3135R0P0V5T01R0PH1230 !U4 *[@khsU()*M*w pV0w˥{us;qy(-9l#`\ck{g;qkeC]j`wߥ?p4Hu)AS! WFendstream endobj 185 0 obj << /Filter /FlateDecode /Length 202 >> stream x3134V0P0R5T01V0PH1230 !U`b`T02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[Ra)Gd13&ך__^_z(gq6ͬ \ \IKendstream endobj 186 0 obj << /Filter /FlateDecode /Length 189 >> stream x36ӳ4T0P0V5T06U0PH123 !U`lhT02X$sU()*M*w pVr\r;;66@\9y@-vv\. j %921e%K_e_OӸ^{=Ww˶KIq1(0qz*ṙ;endstream endobj 187 0 obj << /Filter /FlateDecode /Length 393 >> stream x]n0D{}):@&iRd TD0!,ǧm[|K{)o|&}ڛKT5kO}5\>)cJsu~YRSO\廴I X> stream x313T0P0bcKS#C.=C a\BcC Paĺ@憦 5N\ %E\@ \@\N @K4X.}7}gg7 7F[A(㜟SW bg颠YZzOJS/&.WO@.; endstream endobj 189 0 obj << /Filter /FlateDecode /Length 159 >> stream x313T0P0b ebeg`!U`lb2LXɓKW4K?KK)YHD͎wwvvrllt29y@-vv\. j+p4i '< endstream endobj 190 0 obj << /Filter /FlateDecode /Length 190 >> stream x313T0P5& f )\z >ɹ\@y PH #3 #'O.}O_T.p.}j.}gC.}h\nn@n7$.}ܼb;;.OgsTQxki}ɹ(s~eZ_c .IWSj/o`hrTvK'endstream endobj 191 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0bcKc3C.=C a\Bc# Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-lg^˄AQoWf-8>۔j{M鉜eO07AS! .9endstream endobj 192 0 obj << /Filter /FlateDecode /Length 175 >> stream x313T0P0b#c3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(xe*7lSc-_;Uo01(pz*r7>Gendstream endobj 193 0 obj << /Filter /FlateDecode /Length 189 >> stream x313T0P04QеP06W0PH1230!U`ddT033`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmӡҵKAk__}OO}o6|"AS! HCendstream endobj 194 0 obj << /Filter /FlateDecode /Length 188 >> stream x313T0P0WеP06P0PH1230 !U`ddT032́X,ɥPRTʥTȥTť`ȥ 44KM V8qy(8 x|0vuq[/Р.WO@.lD:endstream endobj 195 0 obj << /Filter /FlateDecode /Length 199 >> stream x313T0P0bCSCC.=a\BcK Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[Y'4h~q@_ozKsHebP`rT3Gendstream endobj 196 0 obj << /Filter /FlateDecode /Length 206 >> stream x]An! E 㨐J7&FU c"a,rI#=-{ǜV=}օy1P+>%e5'KW_ԴQXOfckMO\}Qq,7Y [r;9P:6NJ;"pu (k,lٗ^i4k $c2,w& AgAendstream endobj 197 0 obj << /Filter /FlateDecode /Length 216 >> stream x3Գ0T0P0Q5T05S05UH123 !U`jh*2LX$sU()*M*w pVr\r;;66@\9y@-vv\. j 7L`0PQБ"E{us׾nmڭh6 :ܼM'4\=^Ffendstream endobj 198 0 obj << /Filter /FlateDecode /Length 177 >> stream x3635Q0Pacc C.=C a\B#  Pº@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PB~y_OX, ?&.WO@.HZendstream endobj 199 0 obj << /Filter /FlateDecode /Length 158 >> stream x3635Q0Pac cC.=C a\B#K Paĺ@ 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PB.V?' b?02pz*rHaendstream endobj 200 0 obj << /Filter /FlateDecode /Length 190 >> stream x373P0P0bsCSC.=C a\B33 Pº@@`b`d RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-<ʸ !{\C<_|_/>oGo`hrT&Miendstream endobj 201 0 obj << /Filter /FlateDecode /Length 182 >> stream x353T0P0bS 2QH1230H*T013 U@ T&F %N\ %E\@\@\N \.@c݀}o]s~Nin^1PBCE_ب/~BurK륿~ r}_GT08pz*rzNCendstream endobj 202 0 obj << /Filter /FlateDecode /Length 229 >> stream x35ԳT0P0Q5T0P05UH1230 !U`blT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[MFPF }Q^&%j KSSG۾Ï|Nf{x-_kׇ v( a?E'--  \ \nKendstream endobj 203 0 obj << /Filter /FlateDecode /Length 216 >> stream x331V0P0V52Q03S05VH1230!U`fdT072,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(h28Y:u_o޲׳z{]ۺ@D>ٯ_m}i7eYwҶ 20rz*rb|Xendstream endobj 204 0 obj << /Filter /FlateDecode /Length 211 >> stream x373P0P0bs C.=C a\B33 Pa ĺ@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڂkμB xٛLY*_(pRoa@ϱY]άG]\=`> stream x3337W0P04  )\z 8#9P,Te$t* AJ<=}JJSÁ= ]fr;;66 @ܼb;;.Or cĹy+3Y?>pF.WO@.I=endstream endobj 206 0 obj << /Filter /FlateDecode /Length 240 >> stream x43U0Pa 3 #C.=C a\B  Pa ĺ@F& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P6CҶ'W/]' oozCqM;b?yHkHWM~o]w* B $`endstream endobj 207 0 obj << /Filter /FlateDecode /Length 266 >> stream x430T0P0W5TP0VH12!U`a`T02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[YmC, k ȮQMd],e^SKy/U2˾Kl׏4z{]w.흫c6wKyTۂZ\X[-V\S! D`:endstream endobj 208 0 obj << /Filter /FlateDecode /Length 243 >> stream x3337W0P0Q5T03U05UH1230 !U`f`T0LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[c" '`𡋉}^/o{׷&+d}Ȫ>cUחfɡחѩHl&p(1Š сS! Q[endstream endobj 209 0 obj << /Filter /FlateDecode /Length 230 >> stream x]An E dI6Y4^!b33N#=NSɛ>a)mrK.B=x UtP~+H4@}j-- I)?ߑV{bNOebg[xq#= ѢѲy G27= '+BEFY,c1"&F(~=@e.5(7ƍP_u(pendstream endobj 210 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2128 >> stream xuypWsҩC] t8G)b7N$-cڒ,Yd+tZ-#>.w)g1 3m3! ,t1Mf?}'"&"hjIYYEOo^qN~ /'C ^_]} +DHnpKvw -S9Wx%o-ZTR)VT2]#WhatVNsд' 2ensItt^kWIWU=R.}٥D4rL]%שt5j U ce?ID11Jk:"^$4ᧉ<⸨VtwC[=ҔLTԣhr|V_߹(aN\Ș':#6O{Ea6̆tl?V+vRvVmăF$fEW+6jrIJ(K=sO ђk&u~WTf467099 ((e3U]{M\!lc =~4u73dFjF[8z0h ec!:f[Jw%-eŀ6ێkT/Xyl3<G>8rP[WoU9T2(G^>ƦBWt96_~ j8$90 3n%I-Fx#:}fd[u˿QG"i4#G ؉x8^~P: 1J#|~:&sϜ "!o`]4 ďRX0(k7740>!qcn.sN iTc#>K-u:=N*~HwL#Rڡ`_ VtL=솪n8UXO`TNד[a&E!m;)50jP0^o0-'E*OrAVzn+ `=]ڒPζ0hRg\0ل<[&OY} z.%jBol.M}1ICAEnvsT5Rw壘 xR"O >wwy)e*'И̅.A R8?zez8@&=%R{Te@B!ge;fI{IL h4Iu:4Nv"y;XO2xE0g}a*g76֧ʋ==esKy&m\U!`{P$!EcI@Vʷ/?>[cG ,4wVcH5eO $^;6/~ Q<2i- hDkN 8;P4Sy(SKB m@X%mNJZOIK$o(lѾB:{5:Uц׿:y@ 3.Ȇ:퍐K/thnVKxt|1 ]ђ^HpMIF2z~ W4MP. ?flahF-;,t0젂iB >[x@v3Ǐ7AWA˄!JZyU܌ ; Ǘ`$ ֐5W8Udij[!gAq,{"f ֨=tԅHKY1\RujMF{ Fcd|5+`a}C[B23|ƌ<[;M"DA|(nZɐU沀品tXtuv?WJay2[]΀_؁< @8K,> stream x33R0PT5T0T06WH1230 !U`diT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmM(̾7{/szwem^냗oدl;"vCabbSCB K%> stream x33R0P0Q54W01T06WH1230!U`lfT052@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[၇‡~ >z/:~W[Zޥ9n oM~noZ?+8q8le`rT_Lendstream endobj 213 0 obj << /Filter /FlateDecode /Length 208 >> stream x3131Q0P0U5TL-R @c$r*[L- S 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]> stream x3231S0P0W5T0P05UH1230 !U`d`T052́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ذa~"e#^MXuA_-W#X\=n8@endstream endobj 215 0 obj << /Filter /FlateDecode /Length 209 >> stream x313P0P0W5T0T06WH1230 !U`bhT02́X$sU()*M*w pVr\r;;66@\9y@-vv\. j8jT nh~93n__2%j쵥_-7˂}׆Zk_z}bC  \ \^'Gendstream endobj 216 0 obj << /Filter /FlateDecode /Length 196 >> stream x36ֳ4U0P0S5T06U06WH1230 !U`daT01̀X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[s;CK{m7۷>|lإj݊QئŠ!9endstream endobj 217 0 obj << /Filter /FlateDecode /Length 189 >> stream x323T0P0W5T06R05RH1230 !U`dbT052́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[?__`Nʕ[!.rz}.-PCB &A)endstream endobj 218 0 obj << /Filter /FlateDecode /Length 194 >> stream x33R0P0W5T01T06WH1230 !U`llT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[4!~Sۿ^_F>7ױ@\7_qgM᝴!aB *D@endstream endobj 219 0 obj << /Filter /FlateDecode /Length 202 >> stream x3131Q0PT5TR @c$r*- K 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]<,O%~fVo뵥_ˆemVZXx$i$:08pz*rAendstream endobj 220 0 obj << /Filter /FlateDecode /Length 204 >> stream x] @| ݘҋ^*`9vfendstream endobj 221 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 394 >> stream xcd`ab`dddwu0415H3a!-C5e&ł 002时Lq/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS .ԃP%E )Eyť R2 r+#Y~tɰ.z ݌2,l߯(+f-k,=ۏ?^N=Aeꟴ?v}~V;`[KǭXZVIl%]]] ?͐3.Ɇ)sϾkKe>I<<@endstream endobj 222 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 396 >> stream x~CMMI7'+   ]ZWnsCopyright (c) 1997, 2009 American Mathematical Society (), with Reserved Font Name CMMI7.CMMI7Computer ModerniJ(Ҫopnqnzv`~z\e~}t;_bdw揗cT(]z~ᷯpt|rMwCp`  7 [җ8endstream endobj 223 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1147 >> stream xMmPTew )Xed})J)FD₉zb BXMQ++idK M2K8ӗg3g?<4 h֘Svo iyQ 7%MUAˀVuzC.yCӶ*ԑkq1Y)))q"!!I`yY61%iN(SYyTYcq: Wǻ\LkQݑ.vsZR8 e6FUg9vkaSr)la(*ܞ%V]JQۨfj @͡)-5W1TI;aa ͼt˞HS)'Qe|[Bh#?KqF<'{ c3pt v_j /ӵ8xwmpNԟŷ:2 c/:~am.kg]<<0IO Np]6Sn 4; .wϚ<iNN>/Ob1b ׯhԘnH"2Z>*T{Gƕ=:]kR$쫨/E&eVӃj戵&PMkP~$F0.D32m (3>KSV.W?I:<9d|lYik7OO\epD|03L(}uܕ-İMxam#_6Wwh|OaC?U`DĨU7*sֺ=m+5ދ"YC6yD\Qpc D5 kBƦ_n !eu?ĝ>M3\PR&>ǖ=1FҔAmBdq@6>!{`B*ѯ8k#(?; endstream endobj 224 0 obj << /Filter /FlateDecode /Length 160 >> stream x]O10 :"0~ 8ʀ0%:t8K结ϲ=(ul"-~H0X t2qA6ٝL٨=4R> stream xcd`ab`ddds 4H3a!O/nnW }=I19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;OL:)槤$N-/````c`b`bddK{O=?0))(݋tWUg)..Z=G?تK%g/it=\{b^k$endstream endobj 226 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 340 >> stream xcd`ab`dddw 441UH3a!&nnO }O=B19(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU8NB9)槤10001e Gh&9{f{?3T^%:gnU6UUv#w߂_gLtBӦL6]_s:&uK6455tvwN+^~!oi웹6sqpnļ =~endstream endobj 227 0 obj << /Filter /FlateDecode /Length 190 >> stream x3533V0PbS#S C.=C a\Bc P@y 0243pU()*M*w pV0w˥{+esJsZ<]4Xlzý:B]+߷A~ _ f`rT]Dendstream endobj 228 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 @EЅUqP:QC_Ct;,ҳ ":EY7'*x@f7&8Ǽ*:MWHAH)1OٜufT~p8榹I*`~xS /2KS> stream x332V0P0bcK3C.=C a\Bc3 Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-3}~!]/.ⰛWkfݼefݝ5M"`VCB EDendstream endobj 230 0 obj << /Filter /FlateDecode /Length 176 >> stream x332V0PcSc#C.=C a\BcC PalpU()*M*w pVr\&r;;66 @ܼb;;.Og9lԗ/*b~e篿4m~ X\=q4endstream endobj 231 0 obj << /Filter /FlateDecode /Length 173 >> stream x332V0P0bc3C.=C a\BcC Paĺ@@`ajfRɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. j q|y>Xt4VW\S! I<endstream endobj 232 0 obj << /Filter /FlateDecode /Length 219 >> stream x332V0P0R5P0"cC.=C(ɹ\ Ʀ`ASC  N\ %E\@\@e\N @%hj,`c ΥSW bg颠p bz?GlFs&ޭ?ۦg;YYܡϣ/>!FYxY/;4am)7lpD.WO@.HLendstream endobj 233 0 obj << /Filter /FlateDecode /Length 179 >> stream x332V0CcK3C.=CU`laQhbfɓKW4K?KK)YK%hr,`cﭠ q)+jtQP[1Yϔ?u~?1om3TU, \ \JCendstream endobj 234 0 obj << /Filter /FlateDecode /Length 171 >> stream x332V0P0bcSsC.=C a\B#K Pa ĺ@@hRɥPRTʥTͥ`ȥ 4> stream x332V0P0Q54W0T01WH1230!U`dbT01@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[UU;:?'(u>\u4d X\=5=?endstream endobj 236 0 obj << /Filter /FlateDecode /Length 159 >> stream x332V0P0bcS3C.=C a\Bc Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(¡j@HoPCB R9"endstream endobj 237 0 obj << /Filter /FlateDecode /Length 177 >> stream x332V0P5& F )\z >ɹ\@y PHTɓKW4K?KK)Yq˥{s;qy(9GA!G vU,Q(!vݓCV-`bPrTB$endstream endobj 238 0 obj << /Filter /FlateDecode /Length 161 >> stream x332V0CcKc#C.=CU`laUhe<=}JJSÁj=  ]r;;66 @ܼb;;.Os6s=RׯSm.  B ;endstream endobj 239 0 obj << /Filter /FlateDecode /Length 177 >> stream x332V0P0bcSc#C.=C a\Bc PabpU()*M*w pV0w˥{+esJsZ<]:akk+9^_iwi Nڶmá\ L\ \k5endstream endobj 240 0 obj << /Filter /FlateDecode /Length 192 >> stream x332V0B]Csc 2RH1230ɹ\ f`AK'BIQi*~8PPS!K4X.}7}gg7 7FK9?47ΎEAmŜC6 \ȲP~wջeGJ 8 05$F.WO@.Cendstream endobj 241 0 obj << /Filter /FlateDecode /Length 166 >> stream x332V0P0bcsc#C.=C a\Bc PadpU()*M*w pV0w˥{+esJsZ<]Vi,q^ۿ0t?*AS! 3Fendstream endobj 242 0 obj << /Filter /FlateDecode /Length 184 >> stream x332V0P0bcc#C.=C a\B#  PajpU()*M*w pV0w˥{+esJsZ<]M2P-}a[5YmbM?69F,짶_j@PL \ \e3endstream endobj 243 0 obj << /Filter /FlateDecode /Length 175 >> stream x332V0P0bcCC.=C a\BcC Paĺ@@`ihfRɥPRTʥTϥT̥\fr;;66 @ܼb;;.O"@S%HD-upD B :!endstream endobj 244 0 obj << /Filter /FlateDecode /Length 157 >> stream x332V0CcKc#C.=CU`laUhe<=}JJSÁj=  ]r;;66 @ܼb;;.Os-.꧞`?6񤬰?ƫ\ap`rTP9endstream endobj 245 0 obj << /Filter /FlateDecode /Length 171 >> stream x332V0P0bcsc#C.=C a\Bc PadpU()*M*w pV0w˥{+esJsZ<]Vyڟ\y[3ow#B ;7endstream endobj 246 0 obj << /Filter /FlateDecode /Length 179 >> stream x332V0P0bc c#C.=a\Bc3 PahpU()*M*w pV0w˥{+esJsZ<]VΚ3km9Fj˦qw%ebP`rT7?)endstream endobj 247 0 obj << /Filter /FlateDecode /Length 184 >> stream x332V0P0bcsc#C.=C a\Bc PadpU()*M*w pV0w˥{+esJsZ<]v*?ot{tkc˗oW|wZr#B P;Uendstream endobj 248 0 obj << /Filter /FlateDecode /Length 200 >> stream x332V0P0R54W0"#C.=C(ɹ\ &`AK  N\ %E\@\@e\N \.@Sc݀}ov.}ܼb;;.Om^'WhJ{Mww[cG&p\7УmnbP`rTEXendstream endobj 249 0 obj << /Filter /FlateDecode /Length 179 >> stream x332V0P0Q5S06U05RH1230 !U`l`T02LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-ܘ0GGoNr'& }#wnuY L\ \_?endstream endobj 250 0 obj << /Filter /FlateDecode /Length 181 >> stream x332V0P0Q5S06U05RH1230 !U`l`T02LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(8caQj{CA5j[č^C^gٴODaB ۍ@endstream endobj 251 0 obj << /Filter /FlateDecode /Length 181 >> stream x332V0Pc33C.=C a\Bc# Pa ĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-HX?ZCaC_ BDT[*@ׁS! tAendstream endobj 252 0 obj << /Filter /FlateDecode /Length 225 >> stream x332V0P0Q5S06U05RH1230 !U`l`T02LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-xƨC&y*|uOuﳾ-jS ~TmѢ[۶ AN> stream x332V0P04V5S06V05RH1230!U`hiT00f`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmar(n%.տr>7{wu`aprTQ>^endstream endobj 254 0 obj << /Filter /FlateDecode /Length 189 >> stream x332V0P0S5S02S05RH1230 !U`hiT02̀XD<=}JJSÁ = ]r;;66 @ܼb;;.Ob'|p߷◮2QWcUJ.WO@.0?endstream endobj 255 0 obj << /Filter /FlateDecode /Length 186 >> stream x332V0P0U0W06Q0TH1230!U`daT062L,ɥPRTʥTǥTĥ`ȥ 43KM V8qy(-<۾v[s`tDbbkC9B|VAS! 6iendstream endobj 256 0 obj << /Filter /FlateDecode /Length 159 >> stream x332V0P04V54P02W)\z@a 1s FPXɓKW4K?(ɥTǥ`ȥ 46KM jw)+jtQP[s^n8k*VF.WO@.*endstream endobj 257 0 obj << /Filter /FlateDecode /Length 116 >> stream x332V0P0S04Q06V0TH1230 !U`dfT0 XɓKW4K?KCK)YK%hd,B ? >B (7endstream endobj 258 0 obj << /Filter /FlateDecode /Length 117 >> stream x332V0P04F  )\z@>ɹ\@I ah$t*ɓKW4K?KL:8+rD tQcooAl9.WO@.#endstream endobj 259 0 obj << /Filter /FlateDecode /Length 167 >> stream x332V0P0bcsC.=C a\B#3 Pº@@hRɥPRTʥTͥ`ȥ 4&.WO@..;endstream endobj 260 0 obj << /Filter /FlateDecode /Length 157 >> stream x332V0P04F F )\z@>ɹ\ `A*'BIQi*~8PP S!K4X.}7}gg7 7F[A(㜟SW bg颠AG<:pN"AS! *endstream endobj 261 0 obj << /Filter /FlateDecode /Length 175 >> stream x332V0P0BcS#C.=Cɹ\ `Ac RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1P)&f&.m&aNqZ:>o> e>|5endstream endobj 262 0 obj << /Filter /FlateDecode /Length 152 >> stream x332V0P0V04Q06S06RH1230 !U4 *Z@lhbsU()*M*w pV0w˥{+esJsZ<]vOϬ, \ \r'endstream endobj 263 0 obj << /Filter /FlateDecode /Length 201 >> stream x332V0P0bcs3C.=a\BcS Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(h3oPylVM_}*cˏO^_׾_g!o_1(0qz*r!MKendstream endobj 264 0 obj << /Filter /FlateDecode /Length 209 >> stream x332V0P0Q5T06U01WH1230 !U`l`T02LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[$%pܮ(Ԫ|c{yQǶ|Lӓ{Vm[D,$Dlendstream endobj 265 0 obj << /Filter /FlateDecode /Length 188 >> stream x332V0P0T5T0P01SH1230 !U`lfT012 XD<=}JJSÁ = ]r;;66@\9y@-vv\. j+ڴ&oz]6݊- [02pz*rH=endstream endobj 266 0 obj << /Filter /FlateDecode /Length 153 >> stream x332V0P04U5S06W05RH1230!U`dhT00f`I'O.}O_T.pJ.}2.}g %hj,`cﭠ q)+jtQP[?~0endstream endobj 267 0 obj << /Filter /FlateDecode /Length 153 >> stream x332V0P0R5S02Q05RH1230 !U`dhT02X,ɥPRTʥTȥTťD wwvvrllt29y@-vv\. j+]\M1LQ4bP`rT6+endstream endobj 268 0 obj << /Filter /FlateDecode /Length 183 >> stream x332V0PcKc#C.=C a\BcS PalpU()*M*w pV0w˥{+esJsZ<]0}hPſ|f=q'+B`allyēN8ȶAS! 5endstream endobj 269 0 obj << /Filter /FlateDecode /Length 175 >> stream x332V0P0bcSc#C.=C a\B#K PajpU()*M*w pV0w˥{+esJsZ<]dg|ݭ뎭KlkJߙcmڭE]&a 3endstream endobj 270 0 obj << /Filter /FlateDecode /Length 395 >> stream x]n0DwAB VUS@8;zdzn4:|q|k9Suu?ۃ7]_g5 P͇}ږKiuR^;WaUG~WnGHm,R'bE2EbE>w{ JL@!ƛ7V6ެZZhrx2shrv`Œ f%PA,jb~F` w,xD!a*hAF &6mCDb ǎh&r"VQ@+ )l wB6"ZfGD@ R\k)R@64g$vD\3.s?t_> stream x31ֳ0R0P0V54S01Q06WH1230!U`b`T052@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[t _]P?/wo\-{ I>l} ? ,\ \~Kendstream endobj 272 0 obj << /Filter /FlateDecode /Length 204 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-x~AC9/l_f_2_03km}wfibI;Lhmfe`rT@Jendstream endobj 273 0 obj << /Filter /FlateDecode /Length 211 >> stream x3135R0P0bc SSC.=C a\Bcc Paĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P3/n7R_*$n5GVuku@Olڴib&]ZĶR&.WO@.@endstream endobj 274 0 obj << /Filter /FlateDecode /Length 222 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-hK/~w>:nˮ V<$ec~h?*n{'eݐcͣ#%Kendstream endobj 275 0 obj << /Filter /FlateDecode /Length 215 >> stream x3135R0P0Q5R0P05UH1230 !U`llT052LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-1czcY^uu_ɋ=?_uM\mhm{nt#MG AS! k{Fendstream endobj 276 0 obj << /Filter /FlateDecode /Length 220 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-p1!Uzomq,9P76&r?Z_Kv_wd\6mb< \ \<Kendstream endobj 277 0 obj << /Filter /FlateDecode /Length 206 >> stream x3г0R0P0bSSsC.=C a\BS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy((56<`G?_}^}B?g$?J~__oKLq`drTQOendstream endobj 278 0 obj << /Filter /FlateDecode /Length 205 >> stream x3535T0P0bSSsC.=ɹ\ `A* u ɓKW4K?KK)Yq˥{+esJsZ<]O8y=Cpݿc ? _/'\ĠPQYendstream endobj 279 0 obj << /Filter /FlateDecode /Length 153 >> stream x3ԳT0P0aKSsC.=C a\B#3 Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(<T[;xyd9F.WO@.>(endstream endobj 280 0 obj << /Filter /FlateDecode /Length 199 >> stream x3734R0P0bscSsC.=C a\B3K Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(]ˮݲo*䀵Xz͙sO7kendstream endobj 281 0 obj << /Filter /FlateDecode /Length 226 >> stream x333P0P0U5R0Җ )\z@A 1s LM f@)<=}JJSÁ =K4X.}7}gg7 7F[A(㜟SW bg颠ExHT>T\*K)jcvߙn;3wi"rY7HlqL8zQ(endstream endobj 282 0 obj << /Filter /FlateDecode /Length 231 >> stream x3134V0P0Q5R01R0TH1230 !U`lnT032LX,ɥPRTʥTȥTť\r;;66 @ܼb;;.Og4z[2|_&ݏjn̓5ol>}"^qOc_ݨQ;B$ )&:t`aprTO_endstream endobj 283 0 obj << /Filter /FlateDecode /Length 178 >> stream x333P0P0R5R03P05WH1230 !U4 *ZF@ "rN\ %E\@\@U\N \.@Cc݀}o]s~Nin^1PaOYӸ3mzoc_/2n04ppz*rNendstream endobj 284 0 obj << /Filter /FlateDecode /Length 226 >> stream x333P0P0b3SsC.=C a\BX0b] 0121)qU()*M*N \.@c݀}o]s~Nin^1Pڊ4N2{[l{}=Wwk-{];u۷Ŗe}{վ֭[7R~/}Gᑄ.WO@.qSHendstream endobj 285 0 obj << /Filter /FlateDecode /Length 452 >> stream x]n@D|0tے5C(0X">]U9P+=f.Ozk/?k]onQ߯GT_׭C;E-o\{mB]N~;=C:},a&S*tvs>C FVdg hĐ%,)KhYN1KbDƈ(U(I@prth i숰B8n,OĄI=1f Hg"w*aIu2#C@SĺW;܂!},U5MuD0E$;)K@6hXiC3`(b0gqVܱ#/ 9R^̯8vYםZqAendstream endobj 286 0 obj << /Filter /FlateDecode /Length 205 >> stream x313T0P0bcSCC.=C a\BcK Pa ĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[`AT'F'N{;P}@j]e*IZH4e`rT˅E,endstream endobj 287 0 obj << /Filter /FlateDecode /Length 197 >> stream x313T0P0ac3C.=C a\BcS PH.PY8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j 5>h|募*K]僳EY=y6v:ͣ#T>endstream endobj 288 0 obj << /Filter /FlateDecode /Length 175 >> stream x313T0P0asSCC.=C a\Bcc PZX8yr{*rs{s;8+)hٱ\nn@n.P9?47ΎEAmႋ9_^\_S?MG'_S! >endstream endobj 289 0 obj << /Filter /FlateDecode /Length 184 >> stream x313T0P0bcSCC.=a\BC Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[Ϭu?_~D_ .i깂S! AHendstream endobj 290 0 obj << /Filter /FlateDecode /Length 180 >> stream x313T0P0Q5P06T05RH1230!U`dfT072L,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[@L~%do5-\pMBS! |N@endstream endobj 291 0 obj << /Filter /FlateDecode /Length 176 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(X{˗'Wy__G> stream x313T0P0ac3C.=C a\BcS PH.PY8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j &4簵}por¯K?jVv_6={۴Ü9a$"[\=|;}endstream endobj 293 0 obj << /Filter /FlateDecode /Length 203 >> stream x313T0P0T5P01T06SH1230!U`liT052 ,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[ -h?NSe ~Wo[&hI}8X w4bP`rTdHendstream endobj 294 0 obj << /Filter /FlateDecode /Length 179 >> stream x313T0P0bCc3C.=C a\Bc  Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(x!rENP0" ߒ׿^ ~<m8endstream endobj 295 0 obj << /Filter /FlateDecode /Length 180 >> stream x313T0P0bc 3C.=C a\BcS Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-mOz) 6dmIGs08pz*rZ:4endstream endobj 296 0 obj << /Filter /FlateDecode /Length 172 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(Xɡ5_ߖ20rz*rAOendstream endobj 297 0 obj << /Filter /FlateDecode /Length 198 >> stream x313T0P0b#c3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(Иoߔ8iKߖn7oGU᫿ܛ\uo{S_ [з:[vry L\ \C9endstream endobj 298 0 obj << /Filter /FlateDecode /Length 237 >> stream x313T0P0U5W0T0PH1230 !U`llT032@X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-lfF}B[Ĥ/_߿of-;>m{a~Cw\~tEܗm,۔mp`02pz*r:Ttendstream endobj 299 0 obj << /Filter /FlateDecode /Length 164 >> stream x313T0P04U54R0 R @c$r* @PXɓKW4K?KK)YK%hl,`c ΥSW bg颠ᅪ>z:C\ \ \-Cendstream endobj 300 0 obj << /Filter /FlateDecode /Length 117 >> stream x313T0P0W04S06W02TH1230 !U`diT0@lhfrU()*MP0w pV0wPaS! H)endstream endobj 301 0 obj << /Filter /FlateDecode /Length 119 >> stream x313T0P04F )\z@>ɹ\@I ah$t*ɓKW4K?KL:8+)h\. ? \ \&pendstream endobj 302 0 obj << /Filter /FlateDecode /Length 171 >> stream x313T0Pac S#C.=C a\B#  Pa ĺ@憦 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂ6cKsO )*]/|<CB )=endstream endobj 303 0 obj << /Filter /FlateDecode /Length 213 >> stream x313T0P0b#SCC.=C a\BcK Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[&j*$~Y[7}ү/Meկ_u_~]k~u{&02pz*rKoendstream endobj 304 0 obj << /Filter /FlateDecode /Length 221 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ym^uMqo[V~cAʼnL SH\V(a~~;oYԪk  \=RHendstream endobj 305 0 obj << /Filter /FlateDecode /Length 174 >> stream x313T0P0R5T01R05TH1230 !U`liT052@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[&縷݂_oׁ+8\=WKendstream endobj 306 0 obj << /Filter /FlateDecode /Length 153 >> stream x313T0P04W5W01T0PH1230!U`dlT035 (ɥPRTʥTɥTƥ`ȥ 45KM V8qy(t}U!|ⵙAS! .1endstream endobj 307 0 obj << /Filter /FlateDecode /Length 154 >> stream x313T0P0V5W02W0PH1230 !U`dlT032@]s'BIQi*~8P!PS!K4X.}7}gg7 7F[A(㜟SW bg颠1'W58\=:Mendstream endobj 308 0 obj << /Filter /FlateDecode /Length 203 >> stream x313T0P0ac3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-VlpgC.?lϱHčЋX?X>Co b;%pqCB Aendstream endobj 309 0 obj << /Filter /FlateDecode /Length 190 >> stream x313T0P0bc3C.=C a\Bcc Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-xba7 _MH,1Ug خ[#:08pz*r5;oendstream endobj 310 0 obj << /Filter /FlateDecode /Length 336 >> stream x]Mn@ CNțtE`*DȢ'颋cbWyz_[9SmIˋ~Sф Mn)k|,Z"@oU͟^oKto-u-aBS ;p^8⠆Im {6dqpwWhFW`WFd&Q$T% P.e3ܐ;63Eq!*7"/RJ ;q5:}bCLd D &}JL@sOU}DS{CLd ;->e x^Bag1Nwb˼XV endstream endobj 311 0 obj << /Filter /FlateDecode /Length 191 >> stream x3534S0P0R5T01Q07SH1230 !U`bhT072X$sU()*M*w pVr\r;;66@\9y@-vv\. j 8-'(rϬgOswnv(ZmáKX\=P2endstream endobj 312 0 obj << /Filter /FlateDecode /Length 190 >> stream x373P0P0Q5T07T05QH1230 !U`ffT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[Ŭ pBfMi-x^r7۾Ixo1ؑX$Mendstream endobj 313 0 obj << /Filter /FlateDecode /Length 136 >> stream x5L@ C CTRSa _\$%vl'-s8!,> stream x3337W0P0as C.=C a\BSc PH.P9H'BIQi*~8P9P-S!K4X.}7}gg7 7F[A(㜟SW bg颠p',r-~_(ܛ\ŹWw}uٸ{f_ۛYtiӦGq{{;fff*IM^3*nӽ/{ǖ^- OGendstream endobj 315 0 obj << /Filter /FlateDecode /Length 215 >> stream x34237W0P0bC#C #C.=Cɹ\ f`Q2 u* -,L@<=}JJSA:=ʹ ]r;;66 @ܼb;;.O5uW?"@ϣG݊wfmaXR )C967wHpzICo\=xAendstream endobj 316 0 obj << /Filter /FlateDecode /Length 215 >> stream x331W0P0Q5T05Q05UH1230 !U`biT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[p_FC!~|O[Kޗ_ko[?+Μm߶yۮn&c0툎E L\ \IFendstream endobj 317 0 obj << /Filter /FlateDecode /Length 226 >> stream x]An! E 0AFlM`D, 2YME҃olp/%rh[]\bh \62?k*ӛ?$ u~7>C?ҽ)lh\A,J%%'WZ5=:8Xb벣AB!i%i% 1Ne,z!ΜyL/[4Z6#Z@a.ã5(;'ƉP_u%Qqendstream endobj 318 0 obj << /Filter /FlateDecode /Length 300 >> stream x]1n0 EwB7#[T\%C> stream x3131Q0PT5T01W0PH1230 !U`lnT02@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[py'^ 89>g/e/_=~kvZToVm}Yo!I3820rz*r M'endstream endobj 320 0 obj << /Filter /FlateDecode /Length 222 >> stream x33R0P0U5T01R0PH1230 !U`lfT02LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[R'˿__j?Uy{,+oeG3~U_p'nW79W+iuVF.WO@.Pendstream endobj 321 0 obj << /Filter /FlateDecode /Length 169 >> stream x3232R0P0W5T02S0PH1230 !U`haT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[)b}c#\?n5߰<\ L\ \'?dendstream endobj 322 0 obj << /Filter /FlateDecode /Length 193 >> stream x3131Q0PT5T01R06WH1230 !U`ldT02,X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pcB!j&WM}i}^/~kЗuӣN7}鶦ۜ \==endstream endobj 323 0 obj << /Filter /FlateDecode /Length 211 >> stream x3131Q0B]C3#csC.=C(U`bhT0561K9yr{*rq{q;8+9.@3c݀}ov.}ܼb;;.Om(d_\v6soUվikWcuUүeԛJ֯MrfcP`rTJendstream endobj 324 0 obj << /Filter /FlateDecode /Length 178 >> stream x3630T0P0W5T01T06WH12!U`llT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[cEBK~M F{X[eyY__N$`hrT$;Rendstream endobj 325 0 obj << /Filter /FlateDecode /Length 201 >> stream x33R0PT5T0P0PH1230 !U`daT02@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[>OYr~r?nׯGjU_49{]KwT7rq1(0qz*r>Eendstream endobj 326 0 obj << /Filter /FlateDecode /Length 188 >> stream x33R0PT5T0T06WH1230 !U`diT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmMH |t)KewKսa &nì \ \fA9endstream endobj 327 0 obj << /Filter /FlateDecode /Length 218 >> stream x]1n0 EwB7-7pI -)*YPI:<O"796:S"ى)ِpLO|bӗ/?,P\?nЫnm9гx̱m#S׮SJ7&`uh kD`@aDQ@qFPXx^$}wZ)/&"ALHeQ qendstream endobj 328 0 obj << /Filter /FlateDecode /Length 1802 >> stream xXK67`RԋZ4Z 쥍"k9HzE{onRaW<>ii0 w,VWq7dYBb;G4 ) d;VmjYϔF5;o>WnSx:˛-Es8zSyz7Qibx欜|U`e7к`w9X}VRx孭R2ޫ{|a:IՉu#cݟգ uþ}L`Oq nK)!p 2z>~Z>3%a|97tB}3m~,KlhAmUQ]WnEeIg> stream x]An0E  &dѪj{cEgHYzg8]Ηicӗl0N*&;S|ޏi{8gd=ޤ~r{Q{/1dmYr; *nxnu f?NwUh+* ŀT#PDikbÇSEW765>4J n&TC!;ѐ:k5$5l@p&ٹ l@53dE(i*B|+!cJd_ =jal@6,syTE`!KPu@1up^sǺʴtЌ 2/Ztendstream endobj 330 0 obj << /Filter /FlateDecode /Length 194 >> stream x332V0Cc 3C.=CU`lnQhbfɓKW4K?KK)YK%hr,`cﭠ q)+jtQP[1h̬O*U_I/{T_VM_s}߯]39ְ+#B TDendstream endobj 331 0 obj << /Filter /FlateDecode /Length 161 >> stream x332V0PP02Q06T01WH1230 !U`ddT022,,ɥPRTʥTȥTť`ȥ 44KM V8qy(mHd?߰A۬.WO@.*-endstream endobj 332 0 obj << /Filter /FlateDecode /Length 210 >> stream x332V0P0V5S06S05RH1230 !U`ldT02X,ɥPRTʥTȥTť`ȥ 44KM V8qy(ax߷s_+w5W__ǯR&/Vj7rߺkosM\=,Mendstream endobj 333 0 obj << /Filter /FlateDecode /Length 156 >> stream x332V0P0V0S06S01PH1230!U`ldT062,ɥPRTʥTǥTĥ`ȥ 43KM V8qy(-lf >訙< ʰ2endstream endobj 334 0 obj << /Filter /FlateDecode /Length 200 >> stream x332V0P0V5T06S01WH1230 !U`ldT02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ިgH__~)_x;{clNڶmۆL \ \Dendstream endobj 335 0 obj << /Filter /FlateDecode /Length 193 >> stream x332V0P0bcSsC.=C a\Bc Paĺ@@hRɥPRTʥTͥ`ȥ 4noҥ@ӥC./ս^8>9dB =endstream endobj 336 0 obj << /Filter /FlateDecode /Length 176 >> stream x332V0P0BcS#C.=Cɹ\ `Ac RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1Pڊ|yl|p65– Mq{C]AYM  \ \M6Gendstream endobj 337 0 obj << /Filter /FlateDecode /Length 194 >> stream x332V0P0bcssC.=C a\Bc Paĺ@@hRɥPRTʥTͥ`ȥ 4> stream x332V0P0bcs3C.=a\BcS Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(?9G6@}O8_7(L \ \AAendstream endobj 339 0 obj << /Filter /FlateDecode /Length 181 >> stream x332V0P0bcs3C.=C a\Bc Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(t}r5GV?aQw=S\`hrTA=endstream endobj 340 0 obj << /Filter /FlateDecode /Length 164 >> stream x332V0P0bc33C.=a\Bc Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(4nSdϱ z7> stream x332V0Ccs3C.=CU`lfQhaɓKW4K?KK)YK%hr,`cﭠ q)+jtQP[1ic'G;/~(~̲Ksΐ`hrT;@endstream endobj 342 0 obj << /Filter /FlateDecode /Length 463 >> stream x]n0{=tq H:2TX'"o"N\yzzy~{qܦ_/6qLuΡI;{wz6ǁ4>8~:6}1n{,ߧtihɃ`,M6db*M.\<ća&^JJ&q*MĹ4y Zendstream endobj 343 0 obj << /Filter /FlateDecode /Length 193 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(x6ySO>?}۽<5Խy;_VB 4@Hendstream endobj 344 0 obj << /Filter /FlateDecode /Length 216 >> stream x]n1 > /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 346 /ID [] >> stream xnLQ8~2mD"D"q˫ He2T7(緇K<◕u^{Z{P|1 a~ pdϸFt~ٕ{E/z^xv y\8Y^v2Y . wmp 哪8Y'紦 2<2oI1VMPOR+FC/5>bueKpP:IEzԄ;ԯ+!.EZ2UliWE94QӰ\WirV]R4)N}-X[ۤ슪+?܈'_㹎}Wj&tE:[VM?QsRO?LRb(sr/b[k&'u?c[z)T{OjލK&[O`TM2 ^5u!<]g*4Im.<ͫR}S5iIoK@T~9*oOw, endstream endobj startxref 92683 %%EOF e1071/inst/doc/svmdoc.pdf0000644000175100001440000062650514533657010014557 0ustar hornikusers%PDF-1.5 % 1 0 obj << /Type /ObjStm /Length 5936 /Filter /FlateDecode /N 81 /First 689 >> stream x\rF}߯1 P7{#{.?ݢ&$a}ϩBeH(B"*/'Ѕ S(c [hS-Z]E U_sUQ m45A ֵhZuS8SV[N+UѸJxѺ-*ڮrE@MU:]ʁoQdO9ʀĂ7VMh.+Zj :t'h^[Anee:eݡ3MA+ (c@jXXӢ ;o-8*h_=6j(;~ (aH@SQw-F¢GU9A+1. ~IgUum05zΪZUh U[L98]o@YUbT{9(+b89:Z5 Fets0 n MlZ6AH(S niq roc1{ͯy bb _|(f/qf#zS|!lrz5-^#1dawU؎|>jrw]\f?[nzWb\'_|^|rJk MSjYje};: ] ?dUx8DaV @R І]xy tx6%/׫b03WOx a(A5uv|yXlwKH>5*ktf_Y>ʻ&#w=@gѩ]+Ưn*sM-WPF-+Pi\A+WM?3CGG`\_-WoHfcaU񌶒A ^w\yOSHw~9[-Â,@?c,vהKT4IÏkJeķp/[4*i4Kވ L&}d 1&IbS8d{hڲ=,l3Dur&I!>ՠo+_~+ >W|KO/P ;* /T.)!C%?*b#+"'pX>4#$o"tkudЇՑ”:rNE(tt͡@́6t GrB&dP5eZ/|LZptk o7kRz1֔ax2.y[K[iQѸ´hS`)UnJ%%"%"UD(PD-)i&%"́iQ"K8/#'(1D}D|FeJE :1]dpD&r@0jGmqЋ\;*h!}av@HT8TٻB8{c+'zs0`9wpz|U˸AM{71욚pT#u!{䳶gIMt)qI/EhO_ }K"LZ,zSD@ũ|z0ݗnhlDv5kٚ.ߝELk~ 1/|{ɼbL2{9b:^bI`r쯳|v9\};]zUrf.6z9̷׳f?X8|377LKG&ڐ^r?^,#{˯28Ow՛Z^/[s?/w/IE&c$9rUbN>4TSbNNj,r;W౱|f]4r>t&&@O:]2Oӱ$MeM%w=fI4 Ex [tA>fPi` S 5m=$Fp/FpCs`764ݙazlPnd]wh=-i|O4LLq`5SbY7S3?Ӻ:x)rkA)Y|M:@f5[% -5M[҈PĢ.ix5qyU^3H;k͇~B_7WM_gॿ }]Zڶׅ.+S2M6U/W?',k}J^SDE_j2xKSaӢ ># ϴ@R;eOCl،1!0zt:10ɱUjeTN)':@ z.}j2Ab.5.\MZp)Sn[:RT z%)Sl^?}ѰJ)}!+I3]>\66ks4cГ={9Q΄O8^pc|ĴeI']g{Ms=r|T7jXܺX/D拙~)ӟf"@do2Dșʦq[^GʝӸ(|`\:57#M}bdQb6d* :lߩ9a/{zpa Z  ͤ}ȓyfbkv' #wp+zo轠~OVu,'`"B p! 8 _~bRv#ppla6˞lnkpr#3ea6Dž9?Ɣ"'Sb?ho@ȍQ'7-xsrCh;A{D"6yO|~Ƨk̲®}>g<ϱ*1]sOԉqQ}8c{L΢T93bOyOv=u$} FҼi5󉎽 * F8AQMkQ?Lbq{9SqDX;t~Ϣ72?2<\JXۨ8=z1j5sҧ{?;7JtϋSl.ԏG$=0qVf3¸?1zs#Ɩ}31} Ǚ6*`?Sa7Xj;6} qvرdgG`c7IkggfNL=aMaYOhB(cȌ e/Y=endstream endobj 83 0 obj << /Subtype /XML /Type /Metadata /Length 1387 >> stream GPL Ghostscript 9.55.0 2023-12-05T18:29:43+01:00 2023-12-05T18:29:43+01:00 LaTeX with hyperref endstream endobj 84 0 obj << /Type /ObjStm /Length 5395 /Filter /FlateDecode /N 81 /First 773 >> stream x]YǑ~_яPwUG8AEz4mQ=@Cj@__Vu}>ˬӕ7u]9W UJԖW5fyU-*ejjWժ2\֕ZUskQ37q9T],*PmDbJS( LťB8å5@II3gtʕ6gqggkɲZ³86] %pǩ?oIZP]5=T% 8#Q 3P8i TǠ]fBJ\rIK3 2s)qFଦaBz*BJAwцTU.цjAIPӎՇvT%1t mg%%Ђ(І6b|Q<~pf#^hmgmha J2Igh*A4ڰf٠ 0pf ]C-m_tVҊXXUWVGcI㞉%!cޫSIUT{ L(  HTjfΏ?rsS+|y?~sWO!jΫ~C؂MZ:s_Sr( hOW˿nЀ j У7Sҷj\Ƥ YIO2~HF'd M+#9H : vɕJOp%  ]=4XGmNƙ/PyFmZ 3j#M *O-JtaȦ6̃AVe\ a0LrM I^8X6{^ל^Ȅ@ACꌠ 2i[gx-ӥ53d8;̓ ͓KvjKCHfB/$#GLZ5d>j-FSQ}e1~'ZI7llCʨ~z&bª6:0s8j*O"T\IQU+E~GV߯$754lӴ5 6|hcjv i61=^b7׻ۏ%=w=_hy%8hޏ62Ie,O% MXrJ=JfCu 8;śĭK,!t"KA"Ĝ-H xa1!V\\7qqhxN,p9&OCoSa?EK&>xj#xw^} .鮺t _w}ud&fM˩uݵw%*Xz},!smnn%u^YUm- H4rs&$qV=|_lmݬf|Ͻ_ޯ?\S$}q\x)"D, 09`Ǜzj}$3 r+8/ j)HR8R"CT RP^\v.Ayh.yh4ߤ퍜 <i1:_ MWu4sјt/kL꧍IqTG͸pb9)hp'$Ov^YV3Sd), /5"'34J)e ޴\Cb=噲iSFod!&4^L,aTU?Grhƞ=ЧM[ܩ0._oU7Bi'Z$0E|_j%gnR-G >3xf&>4u]6lPU:$;;тYCZqFm#D=lV­RmõE!n)5O XE-Ʈ{q*VmZ`bTiLVtZr277,XMtDO|ΟOTt$kvT ƦpOw|bu\h|_M>nsGnm$f֝InĨ"T8!k=Vh/dRF[A h|E,VrV>S&q1el3|O|ඬiZOvw^;pSb߼4ל,~̋$hc(\J;Dł?Z/h%*umuFg)w"7g)H;"yEXVt1G#h~x$1E =m!?ݱ#~y3}Aq+~t}x]wȮI[d<ٖ\)tj֙wZ-wwMb<9,jK¹3y̌x}g){%YkdSc.RX;$[yk+t\$eTF*5C3eB4IYBI)aw 851k'm;4Ec7̳)2RS ç(,u36gL=4P3 X9f +:Q8[ࢍׄ|"D.򦺑9qdcMTGG@ϖTu{*hLY\oT҇.^՟wn`v*H1}ob9ҒmYF7+='R i{k Sak8zfri_(:M֓/B1e=?ܯZcqw^qu|,?,zy#f>Gn>n?/-ȓh2覃srPΝj)os/ٛo|mII໺w;λ тBMí`CxɂC1Ç-7-^bj4 aTcLԞݹX=_|q_isO;jybVkbɩǸ<:pC?Wc~_ov?}X/oVz+4tGG>O|{bf1w痨 P 1ybrL837sXCƊ2]&8#ҟU۞U[װ#Xg[drel@CWיӤv>{VAˠe_~/,Ԛb.{@kDL_X.| 3E|>\M9e!?k^' f^/ݯW1ܬwpaA,}= YYepl3㦵M{;8x\Q=܎ΒJ "ϱ2!R $~_D[qGc'%sF۟(} Z!q 1p;넽3l//]xc[3=%]@ ,s{|qc#'sئLk 1zц\dɹws t--ȲvݾnV6)6=MzУ+c&!QG|uk ع!wѰ*1foHXu驘 E(Ջby16Yx+Wٙ~졤܃}ALx4G%?|KOE^E<9ɍa7!nDF$%)-)ȩpC4;ZeyѦ(*@qgA"|򈣋 q8MCn 9BsD2E6L/M~G،Fw'E9-ƇCM!,irb$HDWfShf7*?h*gVDΦ186Vt'<ړkk>e=OnhBw.xI\WЙS|5Co6~;{uyqMKMIPqcvVYV`aY{7kQǜCNH;?8Sm}eכꎕ7LL$U`$zppUׄw٧eIp#:t ~o(0}<N!P 4ќH>8 SLg58 $2J =$i4FԆ}> stream xYKܶ%%9ć99GC!WlUlo9)jڥCIήׇupVcY*ɵ~|u7"M"=Kg?I~ŧgSj!DI-.^%r,QYXKb{L|+eE׏˕:IaIQ#^%+7z r+R&X@%Aʬs͙dy O\ev,>WT(eįbrebolf)/4q󞉺=#EB\/]:y![p\%\TVJ` ʺĹ<(bR.\iMbYMuӝsY6NSXwE}ASZ\,jӶWm}w]aOٷgibBɂ2-3AOQna j 4|Z2,+R-w/gǿf42Q*_r&Y7*`h2&v(PH lL2ojnǛ lC;_MLTƊٿ*ʰQx%o_EnIXB˱шPm¦xЛYhƥicsDk mb3iն88vk k4oӧKAr0o]NNj炂&!t;ov3|I!xFҊ<\OɱJPo6 cj2J]f<́:$ޞo/(aAq<0}_۱([)Ml@X҇NIqCS qՍ4cC&yr[/5SSѢʾxnڷ8{b+++pHyN@z[7e䗹|r&|Q\#fg< kJhZr@IDI^6%TewE4ŮlKrMnX*%Trvܳc<8FDl54sM| z22Gl;oA2צjxYīV=/rQ ffV! fj |*_/ŽZ9+U? z璴7=^2y>X3/jB|]#N@=d(x>e*BN*gYO+*/<$K*!5c(fN((:kH 0zD%e|JY}6'Xekc=wy\'0ܩmMbqYy kʊDDJRS#_V~{pAJ $͋fufБ;>r攡$e̘զZ,D[juTûMAtN>O]mQ<&/7=k$7n~ڇY3&VˣѳWUˑl6N [$OC3֮xEIPgQuNuhFTsxtCEJ&그PAtUD :e7-OrrNpђL69t{ⶇ?z%zPEݖwQ@]&*GB@nwEᅫCNٖe\5w˫@u4 พڤ+/p&(\u{H(fB!F̟؃x&]ٳ W TQr]Ms72gAtȯ' t⢻ :;)7n>7S"}v5ݼqP$B{G5%]dOMpV㔎gQ@! 97.㔼n=rCXJp˔.~Ϭ׶3S*\̶&.35ɗ/$g*p)rw j0htxA-on;@hPG2g`W.ѰD{6:GUx;/C7Po7e_d+Z&sBaZmNBdj t 1E]fڊʿnsH&' >-aabb[o6MRt?Єc?)Mr,qM #UMF6_g>}J[3W-q>;mg)R4gG4[^y~|etOxoJJJ>8M*>=&h6%wABzGu>+qXPLYü:2iu; PeēB|DJVcr1t͍U0W}5o܋a CH+C֔W*r@fbCd L."EԊ_7k0}@,UI`\iC8W9UX~$\AFzvtVO5Y` .O֞z'}o$!v+DHd[E>>գwl)Q' R8=|x{{(*i}RmxWM>ܱ-b1}XZm˟߮?y&L.(0{< oqendstream endobj 167 0 obj << /Filter /FlateDecode /Length 227 >> stream x3ԳT0P0U5T05S03QH1230 !U`j`T0@<&'BIQi*~8PKK)YK%hh,`c ͥSW bg颠R/$>db\ṗ/—_,?MCt}t[聯n۝t4i ysq1(0qz*rDzOWendstream endobj 168 0 obj << /Filter /FlateDecode /Length 210 >> stream x37ѳT0P0bsCCC.=Cɹ\ ff`A2 ɓKW4K?KK)YK%hz,`cﭠ q)+걳tQP[$??C?K/ez޿~~}-&2r6ǠK)lendstream endobj 169 0 obj << /Filter /FlateDecode /Length 181 >> stream x3631R0P0bcCKSC.=C a\B#S Pº@&f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P"i~[[o:->qV&3k:ys 7p04pz*rSLendstream endobj 170 0 obj << /Filter /FlateDecode /Length 202 >> stream x37ѳT0P0bsC3cC.=C a\B33 Paĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڂgY,1pxa|}ýEYV{_ڽ>^2_.RP4S! wVendstream endobj 171 0 obj << /Filter /FlateDecode /Length 230 >> stream x333Q0P0U5T03R03QH1230 !U`jfT032@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[`#A3s|42R{=??L];v_w-.Ryؐ!aB ҞTendstream endobj 172 0 obj << /Filter /FlateDecode /Length 245 >> stream x37ѳT0P0Q5P07P03VH1230!U`fjT42L,ɥPRTʥTɥTƥ\r;;66 @ܼb;;.O5,1qxOxK_A>>[v,s[\M&[ͳ ?02pz*rQlendstream endobj 173 0 obj << /Filter /FlateDecode /Length 193 >> stream x3531T0P0bK3cC.=ɹ\ &`A* u ͌MAj<=}JJSÁ= ]r;;66 @ܼb;;.Og$lb3hxdRvw/ǭe_GT$01(pz*rGHendstream endobj 174 0 obj << /Filter /FlateDecode /Length 245 >> stream x3534S0P0Q5T0T03QH1230 !U`bbT032@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmNwv(\縠/3{Z -'w H)mi;8gmAy{s~uڼ铽f{:6+jnjjAS! '(T|endstream endobj 175 0 obj << /Filter /FlateDecode /Length 195 >> stream x3531T0P0R5T01UPH123 !U`bdT2@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAm[o}Cc9?*eݲes.H:&nqTendstream endobj 176 0 obj << /Filter /FlateDecode /Length 204 >> stream x37ѳT0P0Q5T07T03VH1230 !U`ffT032@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ O|FRs֕(?n}z}ߦM}å)6HsS! $6\endstream endobj 177 0 obj << /Filter /FlateDecode /Length 220 >> stream x34235Q0PbCCSK C.=Cɹ\ `Q2 ɓKW4K?KK)YK%hz,`cﭠ q)+鱳tQP8;(KTLNZߙ]mw+GQ8`E'PU]HAz#8\=Qeendstream endobj 178 0 obj << /Filter /FlateDecode /Length 302 >> stream x37ѳT0P0W5R0P040PH1230!U`f`*3́XJ:yr{*rUr{q;8+rDwwvvrllt29y@=vv\. j 7,^jax!.ufX/%4g/9o~__55jjo1zԭ8OC‚cORLZRLWp|~ߛwVmݵu.-zaM N2I:6suH(1(0qz*rPpendstream endobj 179 0 obj << /Filter /FlateDecode /Length 214 >> stream x34030S0P0R5RTPH1230 !U`ifT04# @I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEA!qɁ ˲ 达uu/_m9^z̸^` gľg|AS! Etendstream endobj 180 0 obj << /Filter /FlateDecode /Length 258 >> stream x333Q0P0W5T03S03QH1230 !U`jaT032́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[mC.>U/͗ܛ\G>ID ֳxɷpK۫ߛ_z[k|=ԿeT؎&ή"$|08pz*r(\endstream endobj 181 0 obj << /Filter /FlateDecode /Length 228 >> stream x3ԳT0P0U5T05S03QH1230 !U`j`T0@<&'BIQi*~8PKK)YK%hh,`c ͥSW bg颠`&&'~3.8QWkC_'W`wvg.6V4a6ĎĄ\=Pendstream endobj 182 0 obj << /Filter /FlateDecode /Length 238 >> stream x]1n0 EwB7DR \%Cd ew,>py)mzR`tZ0yk;SQSݧ^^ P\jBAaI[21G@0v&{x;:@әn'V N/ YGzV8! :RO 0V([=䪞xo &}J_\RV҄wendstream endobj 183 0 obj << /Filter /FlateDecode /Length 213 >> stream x337U0P0S0V0"3C.=Cɹ\ f`AB @)'O.}O_T.p:.}".}gC.}h\nn@n.P9?47ΎEAm ߯/їj+_Ll틘DcbGkDCJqLJmrB7*H|{4]menrkkX\=GRendstream endobj 184 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 @% thU@p' aK,N>z ":ր#ME݀w' 9ܔ> stream x3534W0P0V5T05T0TH1230 !U`bnT@-@khsU()*M*w pV0w˥{us;qy(-VS$UD*sɦ{|K/? =ֻe[]cpi.sEbS!w3#B  Ueendstream endobj 186 0 obj << /Filter /FlateDecode /Length 201 >> stream x3136V0P0V5T01P01UH1230 !U`lfT01X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[lOKޗ_~,g?Zۿumoޖm $48\=#Aendstream endobj 187 0 obj << /Filter /FlateDecode /Length 183 >> stream x33T0P0bc3sC.=C a\Bcc Paĺ@@`lihRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\ӑ?g.M\ ~\tĠIendstream endobj 188 0 obj << /Filter /FlateDecode /Length 252 >> stream x337U0P0V52T0P01UH1230!U`bbT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-\"!.RqacWڜu׫ޖݲM B؂}TU3/qt0!:9wna yN$t04ppz*r\Zendstream endobj 189 0 obj << /Filter /FlateDecode /Length 191 >> stream x3534W0P0bSC3KC.=C a\Bs Pa ĺ@FF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pb;䟦vO:{//+,̻CB Sendstream endobj 190 0 obj << /Filter /FlateDecode /Length 170 >> stream x323P0P0b#S3sC.=C a\B#C Pal700454)qU()*M*w pVr\fr;;66 @ܼb;;.OfBoOYskX\=f?_endstream endobj 191 0 obj << /Filter /FlateDecode /Length 214 >> stream x3531S0P0bK3KC.=C a\BS Pa ĺ@FF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pb;^埦vo'~}^}K_@~qꗿW~A08pz*r`Uendstream endobj 192 0 obj << /Filter /FlateDecode /Length 205 >> stream x032U0P0bsKC.=C a\BsS Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pb;33J+\ϡvs%/^F~_ \6oD=\=:hUendstream endobj 193 0 obj << /Filter /FlateDecode /Length 185 >> stream x3534W0P0bSCC.=C a\Bs Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pb;zM}7Կ5__?x\x备01(pz*rHWendstream endobj 194 0 obj << /Filter /FlateDecode /Length 207 >> stream x337U0P0V5T01S01UH1230 !U`bd*2X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pp! ?G*ߗKM}]|˯)Unv+:3q$1, \ \&F}endstream endobj 195 0 obj << /Filter /FlateDecode /Length 214 >> stream x3534W0P0V5T05T01QH1230!U`bnT032@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[l9D+kr7?|w}B` $Y8}HSQp#B Sendstream endobj 196 0 obj << /Filter /FlateDecode /Length 177 >> stream x36׳4R0P0a3C.=C a\Bc# Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pڒ3 }JR[608pz*r]> stream x331S0P0V5T06U01UH1230 !U`lhT012X$sU()*M*w pVr\r;;66@\9y@-vv\. j yYYx ^o~8 l7+>qOPcca{nW{'jX!Aendstream endobj 198 0 obj << /Filter /FlateDecode /Length 187 >> stream x36׳4R0P0R5T06V03TH1230 !U`l`T032@XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠:wK'W`n׳.map`rTjGendstream endobj 199 0 obj << /Filter /FlateDecode /Length 183 >> stream x3534W0P0V5T05T01QH1230 !U`bnT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[l'y'n"1W 6]08pz*rVmIendstream endobj 200 0 obj << /Filter /FlateDecode /Length 191 >> stream x3531S0P0R5T0T01VH1230 !U`bfT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQPb,[vwmL \ \/A`endstream endobj 201 0 obj << /Filter /FlateDecode /Length 218 >> stream x3531S0P0R52P0T01VH1230!U`bfT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy((1W[tG{c_^?Ww[-_ '?_{lJ_!&Ũl `drTMendstream endobj 202 0 obj << /Filter /FlateDecode /Length 164 >> stream x323P0PP5T02P04PH1230!U`hhT02,,ɥPRTʥTɥTƥDMwwvvrllڹsJsZ<]6nxg:__[u}mɖ-8\=/endstream endobj 203 0 obj << /Filter /FlateDecode /Length 212 >> stream x337U0P0Q5R01U03SH1230 !U`b`T02<&'BIQi*~8PKK)YK%hh,`cﭠ q)+jtQP[s> ?GK/7uP:}wf[׳M˺PD B O endstream endobj 204 0 obj << /Filter /FlateDecode /Length 224 >> stream x337U0Pa33C.=C a\Bc  Pa ĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂg $Xx_/})}_YH_}]t鵽K.]e% ^RWҗ^[;-O Oendstream endobj 205 0 obj << /Filter /FlateDecode /Length 239 >> stream x337U0P0Q5R01U03SH1230 !U`b`T02<&'BIQi*~8PKK)YK%hh,`cﭠ q)+jtQP[!'`h/-˽|o??$/-;{.kg >qݻObUCD .6w͆N6$&t`aprTyQendstream endobj 206 0 obj << /Filter /FlateDecode /Length 225 >> stream x337U0P0U5R01Q03SH1230 !U`laT01LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-0--z`pbl |9͏{?ߪbUQO,l[љKM;"& "aB [jOendstream endobj 207 0 obj << /Filter /FlateDecode /Length 218 >> stream x373T0P0bs 2TH1230H*T033 U`yCc## 'O.}O_T.pz.}b.}g  4;KM V8qy(-#K0|_YH|v1F_Kio8 8N[AS! J[endstream endobj 208 0 obj << /Filter /FlateDecode /Length 220 >> stream x3731S0P0b3K3 C.=C a\B3 P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠ʐ0+slLxy$~o?@Uqӗ>pL4R iU:endstream endobj 209 0 obj << /Filter /FlateDecode /Length 199 >> stream x3333V0P0b3 PH1230H*T055 U&@ TF %N\ %E\@\@\N \.@c݀}o]s~Nin^1P,ۿ~߾}g6߿x>8B lQendstream endobj 210 0 obj << /Filter /FlateDecode /Length 173 >> stream x373T0P0b3K3 C.=C a\B3 P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠rb@C<1.bN ɼ\=U+endstream endobj 211 0 obj << /Filter /FlateDecode /Length 155 >> stream x3634W0P0a#3 C.=C a\B#  Pa ĺ@@`djl RɥPRTʥTϥT̥`ȥ 4;KM V8qy(<mxC~CB C>endstream endobj 212 0 obj << /Filter /FlateDecode /Length 192 >> stream x36Q0P0b 3 C.=C a\Bs  Pa ĺ@@`djl RɥPRTʥTϥT̥`ȥ 4;KM V8qy(6-];Ϯ]ݲmSscﻞbV3GL \ \?tendstream endobj 213 0 obj << /Filter /FlateDecode /Length 183 >> stream x3731R0P0b3s3 C.=C a\B3c P1H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠#?&~i,`y3SF.WO@.Nendstream endobj 214 0 obj << /Filter /FlateDecode /Length 251 >> stream x3403P0P0R5RP0PH1230 !U`ijT072XD<=}JJSÁ = ]r;;66 @ܼb;;.O-FՖ83=1N4h^6#M?cWoz?M^L3%mu0d}fﵭS0ߚ[U.WO@.tendstream endobj 215 0 obj << /Filter /FlateDecode /Length 226 >> stream x337U0P0Q5T0P01UH1230 !U`blT012LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ָCN`{ ٗ~=Od\Vl~XEE|˪'W[.< 65GS! M8endstream endobj 216 0 obj << /Filter /FlateDecode /Length 213 >> stream x3534W0P0V5T05T0TH1230 !U`bnT@-@khsU()*M*w pV0w˥{us;qy(-Mij? q@5_k/CԼ_ޯ>*ٵEw]<M/;"Y\=Uendstream endobj 217 0 obj << /Filter /FlateDecode /Length 203 >> stream x3136V0P0V5T01P01UH1230 !U`lfT01X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ppFB{CK-eׯ_[W$VϬ[n]mm$u"6$,`bPrTnAendstream endobj 218 0 obj << /Filter /FlateDecode /Length 350 >> stream x]An0E)MɢU`L"YHEz18_^.Ӹ:ϴ8k5KU.Ǹ=~]._?KAvk`U8鶴1SYi4KSo.E u٩NT4Pk5WBJ 6j@TQQj@{Q ےګ|el.YYW,^A^̞ed//vBUFFE^̨E^BҩU_8[Mj@y2WNl(XW(XГsspsiЌSe^+/!kendstream endobj 219 0 obj << /Filter /FlateDecode /Length 221 >> stream x3532Q0P0V5T05P03TH1230 !U`bfT032XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠 am}'^ 0ᨍ?/^,!h~\ogz ݇.o&aƠ.Nendstream endobj 220 0 obj << /Filter /FlateDecode /Length 202 >> stream x3532Q0P0U5T01C.=C ɹ\ Ɩ`A3 u rN\ %E\@\@U\N \.@Cc݀}on.}ܼb;;.O;(|0o^K/W~Zݯov~މ7un:ͣ#M@mendstream endobj 221 0 obj << /Filter /FlateDecode /Length 249 >> stream x3532Q0P0VҦ && )\z@Q 1s L f@1u%<=}JJSÁ*=ʸ ]r;;66 @ܼb;;.O68Q8T%uR^ڮ2ɗwݭu9 bK߈ef}լof'>d_ K ([x Pæ.=̽PbK61q%&.WO@.1[endstream endobj 222 0 obj << /Filter /FlateDecode /Length 174 >> stream x3532Q0PbS3#C.=C a\Bc3 Paa7000177)qU()*M*w pV0w˥{+esJsZ<]lH_K.T)<(k  B @endstream endobj 223 0 obj << /Filter /FlateDecode /Length 183 >> stream x3532Q0P0U52V06W03RH1230!U`lhT02@,ɥPRTʥTɥTƥDMwwvvrllt29y@-vv\. j ][E>Gן'Yu6!۶m`hrTEendstream endobj 224 0 obj << /Filter /FlateDecode /Length 161 >> stream x3532Q0P0b33CC.=C a\BcK Paĺ@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.O> stream x3532Q0CSCC.=CU`j`Qhbf A <=}JJSÁ=J ]&r;;66 @ܼb;;.O;,o:E&G]lƢ5m? r f*_m.WO@.R1endstream endobj 226 0 obj << /Filter /FlateDecode /Length 193 >> stream x3532Q0P0S5T01C.=C ɹ\ `A3 u rN\ %E\@\@U\N \.@Cc݀}on.}ܼb;;.OGl#ۗ/4ʬǮY;3wCѢ[nmap`rTCendstream endobj 227 0 obj << /Filter /FlateDecode /Length 179 >> stream x3532Q0P0b C.=C a\BX0b]CcCCc'O.}O_T.p2.}0`ȥ 4;KM V8qy(-QE&a+P9_cM/|)j+X\=<> stream x3532Q0P0W5T01Q01UH1230 !U`lfT01́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ɖ{ U,__UjD|!z 6]{Tl{~x6f֮OZa ZCendstream endobj 229 0 obj << /Filter /FlateDecode /Length 181 >> stream x3532Q0P0R5T01Q05UH1230 !U`bhT052X$sU()*M*w pVr\r;;66@\9y@-vv\. j tԫL?Y?_׷>l٦ͣc w@endstream endobj 230 0 obj << /Filter /FlateDecode /Length 186 >> stream x3532Q0P0bKcC.=C a\B3 PadC3# 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm ̣O5Wo]z Ƿ;:AS! D+endstream endobj 231 0 obj << /Filter /FlateDecode /Length 220 >> stream x3532Q0P0V52V0T01VH1230!U`bjT032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy("ݬ!NVk.?3/__w}M__}oo>ҭ6j`hrT3Tendstream endobj 232 0 obj << /Filter /FlateDecode /Length 143 >> stream x3532Q0PP0T01V02UH1230 !U`lbT0@lhirU()*MP0w pV0w˥{+esJs:<]V~ʚ̀")endstream endobj 233 0 obj << /Filter /FlateDecode /Length 119 >> stream x3532Q0P02F )\z 8#9(i0 .Pr{*rq{Ig  4> stream x3532Q0P0U5T01S03RH1230 !U`b`T032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[s> wd2=x x}wfۦQ6hnnnbk B LOendstream endobj 235 0 obj << /Filter /FlateDecode /Length 175 >> stream x3532Q0P04&& fF )\z 8#9P,TebV```habnnRɥPRTʥTͥ`ȥ 4> stream x3532Q0P0Q5T01W03RH1230 !U`bdT032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ S-[\U轶dˮku__WVkW04ppz*rCAwendstream endobj 237 0 obj << /Filter /FlateDecode /Length 248 >> stream x3532Q0P0Q5T01W03RH1230 !U`bdT032LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[!~Η/&2Phb-D䗥qW_5Tue+>?ݙroˮݎm{zcٶ[7amá 01(pz*rPZuendstream endobj 238 0 obj << /Filter /FlateDecode /Length 206 >> stream x3532Q0P0bs3CC.=C a\B Paĺ@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Oj \3}‹ݿ>~o__Vb^SJS .WO@.Nendstream endobj 239 0 obj << /Filter /FlateDecode /Length 213 >> stream x3532Q0P0bS3CC.=a\B  Pº@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Oܾ[~Ffoz>-sww{][G\U6S! cWendstream endobj 240 0 obj << /Filter /FlateDecode /Length 199 >> stream x3532Q0P0bs3CC.=C a\B Paĺ@@`ddnRɥPRTʥTϥT̥\fr;;66 @ܼb;;.Od,M?_Fhuփ.۪šYK20rz*rIbendstream endobj 241 0 obj << /Filter /FlateDecode /Length 218 >> stream x3532Q0P0R5T05T03TH1230 !U`baT032@XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠b+['WmOX~߿_F]hw} L:HujmvoMu`B Vendstream endobj 242 0 obj << /Filter /FlateDecode /Length 215 >> stream x3532Q0P0U5T05T01UH1230 !U4 * XɓKW4K?KK)YK%hh,`c ͥSW bg颠ЋEF&_oǽJ=1PV I,𢆺/Ex,NՊ-mHkH`p`rTDNendstream endobj 243 0 obj << /Filter /FlateDecode /Length 218 >> stream x3532Q0P0T5T0P03TH1230 !U`bfT032 XR$ɥPRTʥT̥Tɥ`ȥ 48KM Z˥SW bg颠SAjO'6pcͫ8C~篿 ]=e> stream x3532Q0P0W5T01C.=C ɹ\ `A3 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]TPp|/|KM\zBnp2lfVF.WO@.n>endstream endobj 245 0 obj << /Filter /FlateDecode /Length 297 >> stream x]n0 _:6 *%cQ; QB:N )A%CU#IK[k{2Drap2 Qhà*+XV5TEX5Q*JGh]~Ȁ6=Mb"C4J Zx"CT7"9JU+wTvs^.ݷnS)?º /?昑endstream endobj 246 0 obj << /Filter /FlateDecode /Length 210 >> stream x3134V0P0V5T01Q0PH1230 !U`b`T02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8bN͓qȷT_ȱ__$jo[vEVC>oˎ$qG \ \Mendstream endobj 247 0 obj << /Filter /FlateDecode /Length 192 >> stream x36ӳ4T0P0R5T06U0PH123 !U`ldT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmA[b"! LJ &W/iݯUY~0neíoM  \ \>Cendstream endobj 248 0 obj << /Filter /FlateDecode /Length 178 >> stream x3236W0P0bcSKC.=a\B#  Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-8cqOK$GGO g`rT Aendstream endobj 249 0 obj << /Filter /FlateDecode /Length 234 >> stream x3135R0P0R5P01T0PH1230!U4 *F@ etU()*M*w pV0w˥{s;qy(- |FEvKA];W?ݲ޶Ko.]qzaUժ|;|^|fܥn;̙"&:ŁS! 'fT> stream x3134V0P0bS C.=C a\BC Pad#C3C 'O.}O_T.pr.}Z.}g %ht,`cﭠ q)+jtQP[Ra)GGr_f٧rG, V@Lendstream endobj 251 0 obj << /Filter /FlateDecode /Length 170 >> stream x3230W0P0aCS3C.=C a\BC  Paĺ@F& %N\ %E\@\@\N \.@c݀}o]s~Nin^1PڒǗMlҋ#Gڤ01(pz*rR=jendstream endobj 252 0 obj << /Filter /FlateDecode /Length 181 >> stream x3236W0P5Q54W0P05SH1230 !U`dhT076i`Y'O.}O_T.pR.}:.}g %hl,`c ΥSW bg颠!k 6I⥈(yz[4ڦͣsAendstream endobj 253 0 obj << /Filter /FlateDecode /Length 203 >> stream x31ֳ0R0PacS C.=C a\B Pad#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmI1@ {[?e x뗿$ׄ~߿߿o_.*N\aS! MWMendstream endobj 254 0 obj << /Filter /FlateDecode /Length 154 >> stream x3230W0P0aCS C.=C a\BC  Pad#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmIE08pz*rQt>endstream endobj 255 0 obj << /Filter /FlateDecode /Length 196 >> stream x33R0Pa3scsC.=C a\B3 Paĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-688C‡ _3Ԟ\efM"5?&7+H[唇1(0qz*rPendstream endobj 256 0 obj << /Filter /FlateDecode /Length 176 >> stream x3134V0P0bcsC.=C a\BC Paĺ@@`aij RɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. jK* [7;\QO_ |-&YAS! U?vendstream endobj 257 0 obj << /Filter /FlateDecode /Length 198 >> stream x3135R0P0R5T01P0PH1230 !U`lnT02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[C! M> stream x3134V0P0R54S01V06WH1230!U`b`T052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[Ra"cij&uKw[ߦ_?̡c#G$oG, \ \H2endstream endobj 259 0 obj << /Filter /FlateDecode /Length 206 >> stream x31ֳ0R0P0V54S01Q06WH1230!U`b`T052@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[t _]P?/wo\-{ I>l} ? ,\ \~Kendstream endobj 260 0 obj << /Filter /FlateDecode /Length 172 >> stream x3635R0PacCcsC.=C a\B#  Paĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-Idoɫ4zY_c_V\=8endstream endobj 261 0 obj << /Filter /FlateDecode /Length 198 >> stream x3637U0P0V5T0 )\z@A 1s  Ɩ@1<=}JJSÁ = ]r;;66@\9y@-vv\. jfNpv|N>s8ahccQj1j-=endstream endobj 262 0 obj << /Filter /FlateDecode /Length 176 >> stream x363T0P0T5T0P05TH1230 !U`dfT052 XD<=}JJSÁ = ]r;;66@\9y@-vv\. j _zRbPGDu6m6.WO@.< endstream endobj 263 0 obj << /Filter /FlateDecode /Length 177 >> stream x3134V0P0R5T01Q06WH1230 !U`bhT02X$sU()*M*w pVr\r;;66@\9y@-vv\. jK*$l=OW|x?x^߲Dт ,\ \1Bendstream endobj 264 0 obj << /Filter /FlateDecode /Length 184 >> stream x31ֳ0R0P0R5T01R06SH1230 !U`liT062X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQ03ke۳wc_ݲ]oo]w}CB .>endstream endobj 265 0 obj << /Filter /FlateDecode /Length 211 >> stream x3Գ4W0P0R5T0P06SH1230 !U`jjT062X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQ0u[SA<˚ݽw۵K]{~['woWu8\=6Oendstream endobj 266 0 obj << /Filter /FlateDecode /Length 195 >> stream x31ֳ0R0P0bcc3C.=a\BC P 'O.}O_T.pz.}b.}g %hv,`cﭠ q)+jtQ0JS2{bwsz7nٴ[o®}^K^jվ{}UAoL \ \rAendstream endobj 267 0 obj << /Filter /FlateDecode /Length 206 >> stream x31ֳ0R0P0R54W01R06SH1230!U`liT052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQ03kebos^Vwgzvۦߺuӟ&73*N-۴X\=b8G6endstream endobj 268 0 obj << /Filter /FlateDecode /Length 183 >> stream x36ӳ4T0P0bcc3C.=ɹ\ Ɔ`A* u ɓKW4K?KK)Yq˥{+esJsZ<]v>nKA_vů_d~oo/M{/Zziϒi?8\=69endstream endobj 269 0 obj << /Filter /FlateDecode /Length 177 >> stream x323P0P5T06V0P0PH1230!U7 * cc'BIQi*~8P%PS!K4X.}7}gg7 7Fhs~Nin^1Pb=ឺ*[&:ެm;W[5 VF.WO@.-2endstream endobj 270 0 obj << /Filter /FlateDecode /Length 172 >> stream x323P0Bcc#KS C.=C U`daT025h18yr{*rq{p;8+rDwwvvrllt29y@-vv\. js4wÙ3_jժ᫮LAS! 5endstream endobj 271 0 obj << /Filter /FlateDecode /Length 129 >> stream x030Q0B#C c#cC.=C U`ad`QkapU()*MPN \.@c݀}o]s~Nin^1P.WO@.Smendstream endobj 272 0 obj << /Filter /FlateDecode /Length 198 >> stream x331Q0P0bScSKC.=a\BSC P%H'BIQi*~8P=P1S 4;KM V8qy(-\pAq6 GYqUzfnCA\+37\> B mUaendstream endobj 273 0 obj << /Filter /FlateDecode /Length 193 >> stream x3134V0P0bSKC.=a\B# Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\pAFP{@>ڗƒ{ce?8\=PFendstream endobj 274 0 obj << /Filter /FlateDecode /Length 260 >> stream x333P0P0V5R03T03PH1230 !U`jnT032X9yr{*rr{Uq;8+rD wwvvrllt29y@-vv\. j <0=^K/zKox7e(/}[6mbuӣ|xڴצ[moTײKMw+\3fֲ[ʾm 9B-ٴylbap`rT8_endstream endobj 275 0 obj << /Filter /FlateDecode /Length 161 >> stream x3230W0P0W06V0P0PH1230 !U`h`T022́,ɥPRTʥTȥTť`ȥ 44KM V8qy(ml)kÙ^}ҥK\=?.4endstream endobj 276 0 obj << /Filter /FlateDecode /Length 194 >> stream x363T0PP52P0P03RH1230!U`hiT02,,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-8^WWߪoݻy\=-)J)endstream endobj 277 0 obj << /Filter /FlateDecode /Length 197 >> stream x363T0P0Q52P02Q03RH1230!U`hiT02L,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(X(-߻w .Wq[_eˮK.u`hrT;J(endstream endobj 278 0 obj << /Filter /FlateDecode /Length 155 >> stream x333P0P0U5S03P0PH1230 !U`jb0LX,ɥPRTʥN \.@Cc݀}o]s~Nin^1P)1F#φ{;R04ppz*rT>Qendstream endobj 279 0 obj << /Filter /FlateDecode /Length 162 >> stream x3230W0P0W54S0PTH1230 !U`h`T022́,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQPaSֆ3:nK^1(0qz*rv.\endstream endobj 280 0 obj << /Filter /FlateDecode /Length 109 >> stream x323P0P0T04S02Q02TH1230 !U`ddT0҆ lfrU()*MP0w pV0wd@%endstream endobj 281 0 obj << /Filter /FlateDecode /Length 111 >> stream x3230W0PaCsKC.=C a\BK6b]48yr{*r+Xr{gC.}h\. 2 `AS! c Nendstream endobj 282 0 obj << /Filter /FlateDecode /Length 204 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-x~AC9/l_f_2_03km}wfibI;Lhmfe`rT@Jendstream endobj 283 0 obj << /Filter /FlateDecode /Length 163 >> stream x3135R0P0bc3SSC.=C a\B#  Paĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PfFu3or.Q={endstream endobj 284 0 obj << /Filter /FlateDecode /Length 211 >> stream x3135R0P0bc SSC.=C a\Bcc Paĺ@ff 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P3/n7R_*$n5GVuku@Olڴib&]ZĶR&.WO@.@endstream endobj 285 0 obj << /Filter /FlateDecode /Length 215 >> stream x3135R0P0Q5R0P05UH1230 !U`llT052LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-1czcY^uu_ɋ=?_uM\mhm{nt#MG AS! k{Fendstream endobj 286 0 obj << /Filter /FlateDecode /Length 220 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-p1!Uzomq,9P76&r?Z_Kv_wd\6mb< \ \<Kendstream endobj 287 0 obj << /Filter /FlateDecode /Length 220 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-x~AC|Ͻ,־4eiEK.'a1dӎ&620rz*rM1endstream endobj 288 0 obj << /Filter /FlateDecode /Length 163 >> stream x3230W0PaCsc3C.=C a\BKPaĺ@y 020pU()*MWw pV0w˥{+esJs,<]6(<3kie?*"сS! y-endstream endobj 289 0 obj << /Filter /FlateDecode /Length 176 >> stream x3230W0P0W54S0P06SH1230!U`h`T052́,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQPa7N\l4H[ \ \a2endstream endobj 290 0 obj << /Filter /FlateDecode /Length 200 >> stream x332T0P0bcSSKC.=ɹ\ `A* u ɓKW4K?KK)YK%hv,`cﭠ q)+jtQP[tP?~wʲI/e]ڴQu?%_6AS! B]endstream endobj 291 0 obj << /Filter /FlateDecode /Length 213 >> stream x333P0P0bSK3C.=C a\BSS Pa ĺ@ƆFF& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P) F__okqҺ/_~zKio+[11(0qz*rFQMendstream endobj 292 0 obj << /Filter /FlateDecode /Length 206 >> stream x3г0R0P0bSSsC.=C a\BS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy((56<`G?_}^}B?g$?J~__oKLq`drTQOendstream endobj 293 0 obj << /Filter /FlateDecode /Length 222 >> stream x3Գ4W0P0U5R05U0TH1230 !U`biT032LX,ɥPRTʥTȥTť\r;;66 @ܼb;;.O ȳHd?.b!-_Y{TW|կWmlo~_wݙۦQmN8$ƣ#`Iendstream endobj 294 0 obj << /Filter /FlateDecode /Length 194 >> stream x353R0P0bSCSsC.=C a\Bs Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(p?=߿'9~@?ظ B vLendstream endobj 295 0 obj << /Filter /FlateDecode /Length 170 >> stream x333P0P0bSKSsC.=C a\BSS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(h3LrTg5?8\=)NBendstream endobj 296 0 obj << /Filter /FlateDecode /Length 174 >> stream x3133W0P0V5R0T05WH1230 !U`ljT02X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-?&7_EYS.60!7 B 0JAendstream endobj 297 0 obj << /Filter /FlateDecode /Length 170 >> stream x35ԳT0P0bKSsC.=C a\BS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(h2-׏xo1 \ \$@iendstream endobj 298 0 obj << /Filter /FlateDecode /Length 199 >> stream x3734R0P0bscSsC.=C a\B3K Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(]ˮݲo*䀵Xz͙sO7kendstream endobj 299 0 obj << /Filter /FlateDecode /Length 189 >> stream x333P0P0bSKSsC.=C a\BSS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(:!0tEa? N E]endstream endobj 300 0 obj << /Filter /FlateDecode /Length 231 >> stream x3134V0P0Q5R01R0TH1230 !U`lnT032LX,ɥPRTʥTȥTť\r;;66 @ܼb;;.Og4z[2|_&ݏjn̓5ol>}"^qOc_ݨQ;B$ )&:t`aprTO_endstream endobj 301 0 obj << /Filter /FlateDecode /Length 176 >> stream x3Գ4W0P0bSsJ1230H*T056 U .P8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j;g`7~GDG68\= Fdendstream endobj 302 0 obj << /Filter /FlateDecode /Length 178 >> stream x333P0P0R5R03P05WH1230 !U4 *ZF@ "rN\ %E\@\@U\N \.@Cc݀}o]s~Nin^1PaOYӸ3mzoc_/2n04ppz*rNendstream endobj 303 0 obj << /Filter /FlateDecode /Length 211 >> stream x3135R0P0V5T01R0PH1230 !U4 *[@khsU()*M*w pV0w˥{us;qy(-9l#`\ck{g;qkeC]j`wߥ?p4Hu)AS! WFendstream endobj 304 0 obj << /Filter /FlateDecode /Length 202 >> stream x3134V0P0R5T01V0PH1230 !U`b`T02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[Ra)Gd13&ך__^_z(gq6ͬ \ \IKendstream endobj 305 0 obj << /Filter /FlateDecode /Length 189 >> stream x36ӳ4T0P0V5T06U0PH123 !U`lhT02X$sU()*M*w pVr\r;;66@\9y@-vv\. j %921e%K_e_OӸ^{=Ww˶KIq1(0qz*ṙ;endstream endobj 306 0 obj << /Filter /FlateDecode /Length 506 >> stream x]Tn@+1^K-?:!8}I 43p>=˽=oӯzo:O۲6}he?5oV[W4 S݇6+4uD /Bp> stream x313T0P0ac3C.=C a\BcS PH.PY8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j 5>h|募*K]僳EY=y6v:ͣ#T>endstream endobj 308 0 obj << /Filter /FlateDecode /Length 173 >> stream x313T0P0bcKS#C.=C a\BcC Paĺ@憦 5N\ %E\@ \@\N @K4X.}7}gg7 7F[A(㜟SW bg颠YZzOJS/&.WO@.; endstream endobj 309 0 obj << /Filter /FlateDecode /Length 159 >> stream x313T0P0b ebeg`!U`lb2LXɓKW4K?KK)YHD͎wwvvrllt29y@-vv\. j+p4i '< endstream endobj 310 0 obj << /Filter /FlateDecode /Length 190 >> stream x313T0P5& f )\z >ɹ\@y PH #3 #'O.}O_T.p.}j.}gC.}h\nn@n7$.}ܼb;;.OgsTQxki}ɹ(s~eZ_c .IWSj/o`hrTvK'endstream endobj 311 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0bcKc3C.=C a\Bc# Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-lg^˄AQoWf-8>۔j{M鉜eO07AS! .9endstream endobj 312 0 obj << /Filter /FlateDecode /Length 175 >> stream x313T0P0b#c3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(xe*7lSc-_;Uo01(pz*r7>Gendstream endobj 313 0 obj << /Filter /FlateDecode /Length 207 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[CyzξP7nrK4oݲ{clNڶmá\ L\ \(Iendstream endobj 314 0 obj << /Filter /FlateDecode /Length 171 >> stream x313T0Pac S#C.=C a\B#  Pa ĺ@憦 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂ6cKsO )*]/|<CB )=endstream endobj 315 0 obj << /Filter /FlateDecode /Length 181 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[qÄS?LU]/3KGE}]DK}@~02pz*r;endstream endobj 316 0 obj << /Filter /FlateDecode /Length 199 >> stream x313T0P0bCSCC.=a\BcK Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[Y'4h~q@_ozKsHebP`rT3Gendstream endobj 317 0 obj << /Filter /FlateDecode /Length 216 >> stream x]n! w7'E^%C c"p\}/C-p8K^U\broHL\:f\&/^CU#ԟG%(m~ Wȗنptr!GاJWszvz'cnՃ: ΰ XoFVW=k:U@~|=_U5*\H.s#֥_om=endstream endobj 318 0 obj << /Filter /FlateDecode /Length 159 >> stream x363P0P0b#sc C.=C a\B#C Pa ĺ@@`dalRɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. j yc:#\`6endstream endobj 319 0 obj << /Filter /FlateDecode /Length 164 >> stream x]O %h,qzR$0gu17/4S;endstream endobj 320 0 obj << /Filter /FlateDecode /Length 163 >> stream x3135R0P0Bc3csC.=Cɹ\ `Ac# RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1PBC/'Wual6.&.WO@.Ӷ/Sendstream endobj 321 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 Da@,tahU@p$ aKB,N>aFoE6j7ڰ1d&.1>܄{n uX?/uVB+iu 3늢'mi0O%Fc&=&6{YS}IUSendstream endobj 322 0 obj << /Filter /FlateDecode /Length 274 >> stream x]n0 @|ErC91\@9n6CgXvs\˼.7*>g'EٓNs~MbU5װ~})oG7tEqIXC h 9’=a:,&qcͰrGj{5"%~ucNJ]J]Rllƴ[I΂`LSyJ9ٷ gHϬK+ϭ|HJuR}&K\4~ٍendstream endobj 323 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 2543 >> stream xuyPWǧԤƀqxbu#(*&ZL`kfa`0"#W&FctT6Fc+ZoȳRېc]}K#bLvng&/;~v0R5uܽPDĎGx$A*Mm̖k%;U)\8b@$TbHŽ ߖU5Y*y󪪪$ʹ2ΥªUpX)V Wʤ*ZD,use$JX!̕RQXS$%J\YR..xe)(+)+%wu9vI`*A(a':w©&-TL> ADe<Ϧ}>poBz">L rґP待m zЁ0Z::2H ʁs=A*]Tqn&k@oiz_t]$ѵ|:'m-2Kdm#?>\WQWK z?8NA<^C^",ksE; *jwG[`QHeNUzI< XKRYXDGD=E Ds}'ԉW@64Z@cTaiV{+VYwX;t!W"Ѳ-Exa8:ĻMPWi5 \bOӾ}T&ւ%b6Nu# !C.v#E?FR9(>C ab]WWa`"ͺ=m}9x N$17pF35rÞtև圤M⠢"~ -_4jh3[@}aSL:vlzo,gsέً~wnM \'ڌqҫȍ[lF_ p`|``rf[ %ZIw/QhAQ%Wȫ֮.jAq9,Q#-vvYb;&kWԗ.2ă>47Rv`4fM͜Qp%zDp4}pDrtڅ(oUˍl5:n/T/PnQiaU`+gtxƾ(~$p0Zڼ&Wv5 peM@cOY;xC!hGeogKllD\X pu> cQ3&u~.#8sOFǚ6}Ñ# m %n{TԅmA|BUQ>a\UV)dH`SNnnսQ4Ec)nxB|9+TIJTڦlkzΖߎ&^'V 8#v |:13~K`K XϏ6lǯH'@ |ӆaಟ>m*qQ 56fØfNnd9|q-;l^SOדoQҥ:6$G?>Oo~j0.kI\@A?{HZkQLBs!o`js!WǏQF`0 S16e*in>T^*8HCKz52ݓ ,shendstream endobj 324 0 obj << /Filter /FlateDecode /Length 216 >> stream x3Գ0T0P0Q5T05S05UH123 !U`jh*2LX$sU()*M*w pVr\r;;66@\9y@-vv\. j 7L`0PQБ"E{us׾nmڭh6 :ܼM'4\=^Ffendstream endobj 325 0 obj << /Filter /FlateDecode /Length 177 >> stream x3635Q0Pacc C.=C a\B#  Pº@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PB~y_OX, ?&.WO@.HZendstream endobj 326 0 obj << /Filter /FlateDecode /Length 190 >> stream x373P0P0bsCSC.=C a\B33 Pº@@`b`d RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-<ʸ !{\C<_|_/>oGo`hrT&Miendstream endobj 327 0 obj << /Filter /FlateDecode /Length 221 >> stream x3337W0P0Q5T03R05UH1230 !U`jnT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[`@<‡d~/{վ~uok?@09t{㿯v\-.HmfpD`C&  \ \MJendstream endobj 328 0 obj << /Filter /FlateDecode /Length 228 >> stream x373P0P0V52V0T05QH1230!U`fjT072,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-bvp["{GOd>̹o_u[l[K{o> stream x35ԳT0P0Q5T0P05UH1230 !U`blT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[MFPF }Q^&%j KSSG۾Ï|Nf{x-_kׇ v( a?E'--  \ \nKendstream endobj 330 0 obj << /Filter /FlateDecode /Length 191 >> stream x3534S0P0R5T01Q07SH1230 !U`bhT072X$sU()*M*w pVr\r;;66@\9y@-vv\. j 8-'(rϬgOswnv(ZmáKX\=P2endstream endobj 331 0 obj << /Filter /FlateDecode /Length 240 >> stream x43U0Pa 3 #C.=C a\B  Pa ĺ@F& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P6CҶ'W/]' oozCqM;b?yHkHWM~o]w* B $`endstream endobj 332 0 obj << /Filter /FlateDecode /Length 243 >> stream x3337W0P0Q5T03U05UH1230 !U`f`T0LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[c" '`𡋉}^/o{׷&+d}Ȫ>cUחfɡחѩHl&p(1Š сS! Q[endstream endobj 333 0 obj << /Filter /FlateDecode /Length 215 >> stream x331W0P0Q5T05Q05UH1230 !U`biT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[p_FC!~|O[Kޗ_ko[?+Μm߶yۮn&c0툎E L\ \IFendstream endobj 334 0 obj << /Filter /FlateDecode /Length 209 >> stream x]1!E{N vA]4Lƨ`a0;̪#y'O)N9]p!&_1>C9-&Mm`QRG{ܩz'h4 NjW] eH7hڪ(C!H T!]bꎵtR0M%\6 \$!j(endstream endobj 335 0 obj << /Filter /FlateDecode /Length 190 >> stream x3137W0P0bCcsC.=C a\BX0b] 4)qU()*M*N \.@c݀}o]s~Nin^1Pڂ;2{~Yk_;,0گ'fwѓHmq: 2y;)endstream endobj 336 0 obj << /Filter /FlateDecode /Length 171 >> stream x3235V0Pa#SSKC.=C a\B#C Pa ĺ@@`h`i RɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. j-T?ۆCW:H\:&.WO@.&>Nendstream endobj 337 0 obj << /Filter /FlateDecode /Length 153 >> stream x3235V0Pa#3S C.=C a\B## Pal#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm '|4ek>Eendstream endobj 338 0 obj << /Filter /FlateDecode /Length 176 >> stream x3530U0P0bS#csC.=C a\B  Pa ĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-ϑg*ΝVq/Ek+&?endstream endobj 339 0 obj << /Filter /FlateDecode /Length 194 >> stream x3137U0P0bScsC.=C a\BC Pa ĺ@@`aij RɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. j J>d}ik)oUot;WMC'\=5J=endstream endobj 340 0 obj << /Filter /FlateDecode /Length 199 >> stream x3530U0P0R54S05P06WH1230!U`bnT052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[4gLBCv<_OC`>޺q,3_`8{p.WO@.Eendstream endobj 341 0 obj << /Filter /FlateDecode /Length 171 >> stream x336V0P0bcsJ1230H*T061 UF@ T %N\ %E\@\@\N \.@c݀}o]s~Nin^1Pڢ$>4ʪzW>04ppz*r \:endstream endobj 342 0 obj << /Filter /FlateDecode /Length 200 >> stream x3633W0P0aScsC.=C a\BcC Pa ĺ@@`aij RɥPRTʥTϥT̥D͎wwvvrllt29y@-vv\. j 9OLM,h_Њn򗏿l<7{~T_Kل:'465p04pz*r?endstream endobj 343 0 obj << /Filter /FlateDecode /Length 180 >> stream x3634Q0P0bc#ScC.=C a\B#K Paĺ@@`naiRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-> stream x3235V0P0b#CcsC.=C a\BCc Pº@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(y"7OSog[OY&20rz*r{1endstream endobj 345 0 obj << /Filter /FlateDecode /Length 227 >> stream x3г4W0P0U5T03Q0PH1230 !U4 *Z@khsU()*M*w pV0w˥{us;qy(-f{DG E) C,_/{,~>>E\w--1p3犀!7N[@#B |F)endstream endobj 346 0 obj << /Filter /FlateDecode /Length 209 >> stream x3131R0P0b3csC.=C a\B# Pa ĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-HODֹvoo}[XҞvΦ+kbj]3k6jWo|8TAS! 5@endstream endobj 347 0 obj << /Filter /FlateDecode /Length 217 >> stream x]10 E"7hBR.4 e8.00HϱoW,sgC2>gv({(%FD;t{%Ԁ~hm,CnlEWy]zl-0ʴ߭Z`YmHu2eHF.ꀡ_SQFH=0Pi9JwW9cB|x;bRxnendstream endobj 348 0 obj << /Filter /FlateDecode /Length 197 >> stream x33R0PT5T0T06WH1230 !U`diT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmM(̾7{/szwem^냗oدl;"vCabbSCB K%> stream x33R0P0Q54W01T06WH1230!U`lfT052@,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[၇‡~ >z/:~W[Zޥ9n oM~noZ?+8q8le`rT_Lendstream endobj 350 0 obj << /Filter /FlateDecode /Length 196 >> stream x3231S0P0W5T0P05UH1230 !U`d`T052́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ذa~"e#^MXuA_-W#X\=n8@endstream endobj 351 0 obj << /Filter /FlateDecode /Length 235 >> stream x33׳4T0P0W5T07P06WH123 !U`fdT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[lQ#ñEőCf9i_74(~e%^_[o߿տ<5ZjUZUׯG nڰ__/]!7/[3B 0T\endstream endobj 352 0 obj << /Filter /FlateDecode /Length 209 >> stream x313P0P0W5T0T06WH1230 !U`bhT02́X$sU()*M*w pVr\r;;66@\9y@-vv\. j8jT nh~93n__2%j쵥_-7˂}׆Zk_z}bC  \ \^'Gendstream endobj 353 0 obj << /Filter /FlateDecode /Length 193 >> stream x3131Q0PT5T01R06WH1230 !U`ldT02,X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pcB!j&WM}i}^/~kЗuӣN7}鶦ۜ \==endstream endobj 354 0 obj << /Filter /FlateDecode /Length 211 >> stream x3131Q0B]C3#csC.=C(U`bhT0561K9yr{*rq{q;8+9.@3c݀}ov.}ܼb;;.Om(d_\v6soUվikWcuUүeԛJ֯MrfcP`rTJendstream endobj 355 0 obj << /Filter /FlateDecode /Length 178 >> stream x3630T0P0W5T01T06WH12!U`llT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[cEBK~M F{X[eyY__N$`hrT$;Rendstream endobj 356 0 obj << /Filter /FlateDecode /Length 196 >> stream x36ֳ4U0P0S5T06U06WH1230 !U`daT01̀X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[s;CK{m7۷>|lإj݊QئŠ!9endstream endobj 357 0 obj << /Filter /FlateDecode /Length 189 >> stream x323T0P0W5T06R05RH1230 !U`dbT052́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[?__`Nʕ[!.rz}.-PCB &A)endstream endobj 358 0 obj << /Filter /FlateDecode /Length 205 >> stream x3135S0P0W5T01W06WH1230 !U`liT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[4g8ڱ/]~}v]oZ?qcx̿k~_r=W}!gaL \ \GRendstream endobj 359 0 obj << /Filter /FlateDecode /Length 194 >> stream x33R0P0W5T01T06WH1230 !U`llT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[4!~Sۿ^_F>7ױ@\7_qgM᝴!aB *D@endstream endobj 360 0 obj << /Filter /FlateDecode /Length 202 >> stream x3131Q0PT5TR @c$r*- K 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]<,O%~fVo뵥_ˆemVZXx$i$:08pz*rAendstream endobj 361 0 obj << /Filter /FlateDecode /Length 188 >> stream x33R0PT5T0T06WH1230 !U`diT02@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmMH |t)KewKսa &nì \ \fA9endstream endobj 362 0 obj << /Filter /FlateDecode /Length 226 >> stream x]n! w7"/ɒU80C8D.C߾sC\˪/\u.5u-Qx)USfkhj8PS懿+Ȗy4%ᭅ= 8!gPXӿ#uy+uHw & 멆ԃ@c݃`Y9Qtb :ROOdH*OC W#ޱĹq&/ft!endstream endobj 363 0 obj << /Filter /FlateDecode /Length 179 >> stream x3631Q0P0U0R02S02VH1230!U`d`T022L(rU()*Mr{q;8+)h\nn@n.P9?47ΎEAmpm]/}MSLJ:l:|[> stream x]O10 m%HU0q u4=M20g_/W#8|QcY`ѲIy!'X d p:U]B4^!#֘N?i fs6+86ſ+)J7cnw>`cYSendstream endobj 365 0 obj << /Filter /FlateDecode /Length 198 >> stream x33T0P0R5T06W01SH1230 !U`lbT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[D`0uM> stream x3636U0P0R5T0T06TH1230 !U`dfT062@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[VMnK_:u{IJC> stream x3235U0P0b#3sC.=a\B# Paĺ@@hRɥPRTʥTͥ`ȥ 4GCz9>zendstream endobj 368 0 obj << /Filter /FlateDecode /Length 214 >> stream x3632W0P0R54U06Q06PH1230!U`lhT012,ɥPRTʥTɥTƥDMwwvvrllڹsJsZ<]s $s<ģ;ʷ w+ҽ;׾&̾\o^Z/읫e&nM  \ \Eendstream endobj 369 0 obj << /Filter /FlateDecode /Length 179 >> stream x33T0P0bcs3C.=C a\Bc Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-+~?}G/ `hrTG/C endstream endobj 370 0 obj << /Filter /FlateDecode /Length 165 >> stream x33T0P0bCs3C.=C a\BC Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-yk?d_Z47p04pz*rb8Oendstream endobj 371 0 obj << /Filter /FlateDecode /Length 154 >> stream x33T0P0bC 3C.=C a\BCS Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-+8~r`P=&.WO@.*9endstream endobj 372 0 obj << /Filter /FlateDecode /Length 191 >> stream x33P0P0bS cC.=C a\BSS Paĺ@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڲ I%\`./_,Uars}CB չF{endstream endobj 373 0 obj << /Filter /FlateDecode /Length 175 >> stream x33T0P0bcscC.=C a\Bc Paĺ@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڲV  '_$oVFz.WO@.;endstream endobj 374 0 obj << /Filter /FlateDecode /Length 186 >> stream x3632W0P0R5T06V06TH1230 !U`l`T062@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[s?CU/׾47'vKy  l8 9endstream endobj 375 0 obj << /Filter /FlateDecode /Length 195 >> stream x33T0P0R54V06W06PH1230!U`lbT012,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[V*%yrF/w ~KVŘ<۲#NB_(b [  B ܠAdendstream endobj 376 0 obj << /Filter /FlateDecode /Length 168 >> stream x323T0P0a3cC.=C a\B#c Paĺ@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڲF7 oq+n .w*T04ppz*r4endstream endobj 377 0 obj << /Filter /FlateDecode /Length 187 >> stream x32׳0R0P0R5T02S06TH1230 !U`dlT062@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[lȶ6~8mwF'[Z[\=8endstream endobj 378 0 obj << /Filter /FlateDecode /Length 168 >> stream x3231V0P0T5T02V01TH1230 !U`dhT012@]sU()*M*w pVr\r;;66@\9y@-vv\. j9=:pɕ2!v58\=C9endstream endobj 379 0 obj << /Filter /FlateDecode /Length 176 >> stream x3632V0P0T5T06S0TH1230 !U`lbT062 XD<=}JJSÁ = ]r;;66@\9y@-vv\. VO6}}߭ۦά>{7 c5endstream endobj 380 0 obj << /Filter /FlateDecode /Length 200 >> stream x35г4Q0P0T5T05P0TH1230 !U`baT062 XD<=}JJSÁ = ]r;;66@\9y@-vv\. VFuJͬWMw_m_{2[Ro,m01(pz*roEendstream endobj 381 0 obj << /Filter /FlateDecode /Length 186 >> stream x3632V0P0bc3#KC.=a\Bc PahC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEfֆ:K.ݶ;l׍o_>soo _]křCB Q:cendstream endobj 382 0 obj << /Filter /FlateDecode /Length 192 >> stream x3632V0P0T54Q06S0TH1230!U`lbT012 ,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQ|rGu_݊zmyo][7Џu6eMUc@endstream endobj 383 0 obj << /Filter /FlateDecode /Length 172 >> stream x3636U0P0a #KC.=C a\B#S PadC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmKvyګ}]ҥkRWouD.WO@.4endstream endobj 384 0 obj << /Filter /FlateDecode /Length 185 >> stream x3231V0P0S54W02V05PH1230!U`hfT032@.'BIQi*~8P%PS!K4X.}7}gg7 7FK9?47ΎEAmK@p{m~/~}o@AS! 8Cqendstream endobj 385 0 obj << /Filter /FlateDecode /Length 188 >> stream x3231V0P0Q54W02T05PH1230!U`hfT032L,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQ{ջwo^wAendstream endobj 386 0 obj << /Filter /FlateDecode /Length 155 >> stream x33T0P0S54V04SPH1230 !U`iS022̀,ɥPRTʥ`ɥTť\fr;;66@\9y vv\. j;t-=#z \ \(endstream endobj 387 0 obj << /Filter /FlateDecode /Length 106 >> stream x3235T0P0T04V0 )\z A 1s  - &@ RN\ %E\@u\ &\N \.@#c<]?G\ \!endstream endobj 388 0 obj << /Filter /FlateDecode /Length 99 >> stream x33T0P0bCS C.=C a\B 63 ;yr{*r+Xp{gC.}hi\. 6uΆS! t'endstream endobj 389 0 obj << /Filter /FlateDecode /Length 162 >> stream x3632W0P0Q54W06T05PH1230!U`dfT032L,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[zUz0D@pΏ  \ \B-endstream endobj 390 0 obj << /Filter /FlateDecode /Length 189 >> stream x3632W0P0V5T06R01QH1230 !U`daT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[sȉ!{k&׿i g{݊maĎD.WO@.+=endstream endobj 391 0 obj << /Filter /FlateDecode /Length 161 >> stream x3632W0P0bcC.=C a\B#c Paĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1PӝeN~U:`hrT8endstream endobj 392 0 obj << /Filter /FlateDecode /Length 195 >> stream x3632W0P0a#C.=C a\B#  Pa ĺ@Ɔ %N\ %E\@\@\N \.@c݀}o]s~Nin^1P"~/8/7*臷Zq[K/T]R}ݔ.WO@._A> stream x3632W0P0V5T06R01QH1230 !U`daT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[sȑڗ߾㯿b33uwM/ ]&"&&MfADendstream endobj 394 0 obj << /Filter /FlateDecode /Length 202 >> stream x3632W0P0V5T06R01QH1230 !U`daT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[VMnrҺ_cZunb9 Iٮ_/66ga.&.WO@.?>endstream endobj 395 0 obj << /Filter /FlateDecode /Length 156 >> stream x33T0P0bCS#KC.=C a\B PafC 'O.}O_T.p .}R.}gC.}h\nn@n.P9?47XΎEAmGTaͬ[W}U \ \,?endstream endobj 396 0 obj << /Filter /FlateDecode /Length 193 >> stream x35ҳ0V0P0bSCsC.=C a\B  Paĺ@@hRɥPRTʥTͥ`ȥ 4> stream x35г4Q0P0Q5T01W01SH1230 !U`bd*2LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8!lf[eT̛oׯ?ܿ۽/^܊Qm;#ڦ!aB TB9endstream endobj 398 0 obj << /Filter /FlateDecode /Length 198 >> stream x35ֳ0U0P0bSSC.=C a\B3 Pa ĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PKS1coAǯe>FG CB  Cendstream endobj 399 0 obj << /Filter /FlateDecode /Length 185 >> stream x3130T0P0bcSC.ɹ\ &`A* u ,,LAj<=}JJSÁ= ]r;;66 @ܼb;;.OAv<}||@_`hrTcFBendstream endobj 400 0 obj << /Filter /FlateDecode /Length 210 >> stream x3536V0P0Q5T05R01SH1230 !U`bn0LX,ɥPRTʥN \.@Cc݀}on.}ܼbb;;.Os.X7po-hd?O/͏_Od\bm@뤿I= ƐCBB tHIendstream endobj 401 0 obj << /Filter /FlateDecode /Length 154 >> stream x323Q0P0acSC.=C a\B# P)XX8yr{*rp{Us;8+rD wwvvrllt29y@-vv\. 'WJN]\f~7endstream endobj 402 0 obj << /Filter /FlateDecode /Length 166 >> stream x3632T0P0V5T06R01UH123 !U`daT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[TTp^WK7\:, B ^> stream x35ҳ0V0PaSSC.=C a\B3 Pa ĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pb[ow$ ߿/ 9dg`rTN}endstream endobj 404 0 obj << /Filter /FlateDecode /Length 206 >> stream x35ԳT0P0V5T05R01UH1230 !U`baT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP9s<܃__}^}q1ߟ}ٙ./di:h04ppz*r~Hendstream endobj 405 0 obj << /Filter /FlateDecode /Length 173 >> stream x35г4Q0P0bKSC.=C a\B3 Paĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pz;O&GO30rz*rl=Gendstream endobj 406 0 obj << /Filter /FlateDecode /Length 184 >> stream x35ҳ0V0P0T5T05R01UH1230 !U`j`T012 XD<=}JJSÁ = ]r;;66@\9y@-vv\. Ֆeeu߲gz{[PxMo;~+#B [Dcendstream endobj 407 0 obj << /Filter /FlateDecode /Length 194 >> stream x3632W0P0V5T06U06TH1230 !U4 *@ 9yr{*rr{Uq;8+9.@Cc݀}on.}ܼb;;.OE3/nl_0Bo?Q6?eU|LEO2r|#  .WO@.;endstream endobj 408 0 obj << /Filter /FlateDecode /Length 193 >> stream x33T0P0R5T06W01SH1230 !U`lbT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[V?93_i,E$j/ w4/,,9 kBxendstream endobj 409 0 obj << /Filter /FlateDecode /Length 180 >> stream x3636U0P0R5T0T06TH1230 !U`dfT062@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[sCN^{/}oCnڭy"$48\=5endstream endobj 410 0 obj << /Filter /FlateDecode /Length 424 >> stream x];n@ DsB7? ؉/ ^@j qo`Di[o帖/6y_ۺucܾwi/ԥ齞^eklA:׏}*ڝb]".Κ4& XIHIc Vk5iL0GsTb4 mDڈ꜐&yT qccS2(^jB*i HBɟ9 /P3 e^(OD^H9+Aquqb ~=g]FZ*+\AS!xf) .؞ct#> 'Aۣ?Es;l_( ),ؾ‚<d Rws> stream x3631Q0P0b#SccC.=C a\BC  Paĺ@@`ial RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-![\$pAS! &2endstream endobj 412 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O0 XЪjqP(_Ct;,: ":ր#MEY' ߔȫrӴxO$ڢZc:A#0Y]Fu?M%Λk17MR{;RA|-S0endstream endobj 413 0 obj << /Filter /FlateDecode /Length 194 >> stream x3632W0P0bcCC.=C a\BcC Paĺ@@`ihfRɥPRTʥTϥT̥\fr;;66 @ܼb;;.O;$m%C?7k_o׷هc;1^t#` B _@endstream endobj 414 0 obj << /Filter /FlateDecode /Length 179 >> stream x3632W0P0aC#KC.=C a\B#s PalC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm!ϑ~R͵vvf2NJ7uytL۸\=I2Vendstream endobj 415 0 obj << /Filter /FlateDecode /Length 217 >> stream x3632W0P0R54S06Q06PH1230!U`lhT012,ɥPRTʥTɥTƥDMwwvvrllڹsJsZ<],s*p|&buQ`K-Dlץ׳++?ߨ|B /\ezpLGwL \ \JEUendstream endobj 416 0 obj << /Filter /FlateDecode /Length 173 >> stream x3632W0P0bcCC.=a\Bc# Pº@@`ihfRɥPRTʥTϥT̥\fr;;66 @ܼb;;.OVÞcɳ/Pc&w L\ \;endstream endobj 417 0 obj << /Filter /FlateDecode /Length 169 >> stream x3632W0P0bcC#C.=C a\B# Paĺ@@`nad RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-amO"OǣfsJ,Z ߥ5endstream endobj 418 0 obj << /Filter /FlateDecode /Length 173 >> stream x3632W0P0V54U02U01RH1230!U`dhT052,ɥPRTʥTɥTƥDMwwvvrllڹsJsZ<]p`OQ+Y?6%?L)U[`B  ;$endstream endobj 419 0 obj << /Filter /FlateDecode /Length 158 >> stream x3632W0P0bc#CC.=C a\B#s Paĺ@@`ihfRɥPRTʥTϥT̥\fr;;66 @ܼb;;.O/dOzW<>*AS! G6endstream endobj 420 0 obj << /Filter /FlateDecode /Length 165 >> stream x3632W0P0bc#KC.=a\Bc# PahC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEDC}>ssVlB 7 endstream endobj 421 0 obj << /Filter /FlateDecode /Length 189 >> stream x3632W0P0T54U06V0TH1230!U`lhT012@.'BIQi*~8P%PS 45KM jw)+jtQ0Q~d|Oɕg?4޿[= uo+ʃ?8\=Z@Vendstream endobj 422 0 obj << /Filter /FlateDecode /Length 172 >> stream x3632W0P0bcc#KC.=C a\Bc PadC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmł˭j+4C01(pz*r^1endstream endobj 423 0 obj << /Filter /FlateDecode /Length 183 >> stream x3632W0P0bc#KC.=C a\B# PajC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm׹? _5Ym۹<O$UXl U[qAS! m2endstream endobj 424 0 obj << /Filter /FlateDecode /Length 173 >> stream x3632W0P0bc 2WH1230H*T027 UF@ T %N\ %E\@\@\N \.@c݀}o]s~Nin^1P" 5$dk?zfNmL \ \5.endstream endobj 425 0 obj << /Filter /FlateDecode /Length 163 >> stream x3632W0P0bc#KC.=a\Bc# PahC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEDfi?_߰ǯq#6.WO@.vD9endstream endobj 426 0 obj << /Filter /FlateDecode /Length 185 >> stream x3632W0P0bc#KC.=a\Bc# PahC 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAmłPOm80?'kﳣ=˿v< .WO@.@endstream endobj 427 0 obj << /Filter /FlateDecode /Length 162 >> stream x3632W0P0bc##KC.=C a\BX02X'BIQi*~8Pt pV0w˥{+esJs󊁊<]v]җ]QP)q\ނ08pz*r/endstream endobj 428 0 obj << /Filter /FlateDecode /Length 155 >> stream x3632W0P0U06R06P01TH1230 !U`dbTҦ@lldrU()*MPw pV0w˥{+esJs:<]Ԗ(Ds> stream x3632W0P04F )\z@.ɹ\ `10mh $t `fnRɥPRTʥ`ɥ" ]ry(13oz;.WO@.V endstream endobj 430 0 obj << /Filter /FlateDecode /Length 162 >> stream x3632W0P0Q5S06T01SH1230 !U`dfT052LX$sU()*M*w pV0w˥{+esJsZ<]:n@52 |eCB =;endstream endobj 431 0 obj << /Filter /FlateDecode /Length 158 >> stream x3632W0P04F F )\z@>ɹ\ `1"<XU8yr{*r+Xr{r;8+rDMwwvvrllt29y vv\. j; |n9C-`bPrT+endstream endobj 432 0 obj << /Filter /FlateDecode /Length 184 >> stream x3632W0P0aS#KC.=C a\BcC PalC 'O.}O_T.pr.}Z.}g %ht,`cﭠ q)+jtQP[a˾ýˏWk'XC$WmHbP`rT3endstream endobj 433 0 obj << /Filter /FlateDecode /Length 176 >> stream x3632W0P0bcC#KC.=C a\B#S PX'BIQi*~8P9P-S!K4X.}7}gg7 7F[A(㜟SW bg颠@u=U%OS_7Q67MS! ^4!endstream endobj 434 0 obj << /Filter /FlateDecode /Length 271 >> stream x]n0 > stream xXKcR<)Ôż03ؖ]vKĒAᱫ!?;t̀!qJK zfLL_[4t]|XpZ]?E|yx[rHK.TbS4ip͂]vmQOCյUKLdSrkׯ~~[Y8+Wk$=<X.WGgfib7 67^-JX8(v_mopcjX[O>i*F V撵+ۭl,ۼ8V Pƛ4{XX&*Xw{|9͜0eǏ!.fv3#I2<jra.Y'>&z?C(&ג(+T?`CF W;B>Y$c^\];|qKrҘw 4z_*D0H?D )BE/5KZ1AҴsFO5$D#.GeH!VJ[ \mhv2}9RƫVP5 ,JtHxR@۲&l6H4Vj)3, ØjNi򙃢UU‰ 4&V jQSrM̀x* -x>JgGDa3|[*7B{@OI*|QSyp/E&C~~o?*^5]gٿ~&*oy !}_׌y?־ Gy9p-n胆oV0WcGD=fTȅ:6RЇ#9()X h$dCF16QFJm&eg{ B2C(4To<~EI/}.ZųPhB0ChP;rK*"MMdz)$u^ٌӛw7F#|,H$h6B3> stream x͓9r'vwO>XKuڱayU0.H왝oӬ + _Hd&~O.O݇W?|A_}uzw*z?j\>?uW秷?o,5=߾G"ޫQ6oL~}M.ei_s}z: "m\w_|7v ~c;fOav/>?~xKu#o?f^WoR_{oJ#?ޫhw j#A^?w?5@WqcN/ZgzG`C? uMBZKucۅ-,]oq慕33zsյɶ}ǯD+ye\LJM]1~_}|Ͽ"U^DL)K1!/?G g9[J<]3x0кOti6p];bzMQۏk?ӟ|~|㇇_?}|?[S&~gM_ih p`Oy_EݢC> ve+ߏTEXLJ's> Ϋݽ~|X}Ư"8!ϟ6>Ϡ/)p<]T7o|z? q׷_җ7Žw??%f[ȇЯJ?}%ْ׭[{[ɑр0|c$+p#{x iov0Se}Oso~=DW&h)U[emKj\EV |"bFԤ>o|{ᙴ_%MtzzS 6Qr?Oi L %OV75UU?wݏr/R"wgbUkoV{s{Bk/W8\W.kCkzb 7d6W~ @ rVI @ Xۀ @\ ӿ!2H̀&vrٳ2H`ާ€|_ CIZM !M!I +dR,X8El($'C:i`(s x, !> H ^U2@i{cg؁_t|9g2sb+y,t9b^rʧt}gbG{| .hUNtetg 3-b:woHb"Rf&s #Eq(C m ,0@ơBloCOcsz{c e)bؐJ3ޛK<ڏY9[y'c[ I'/뾮nmaȑdXߐzJȆ\SPˇ\T0)! Vߐ|h ơ=Z4 ,D4U6s̪lpU>?UխJQNN+NONs/j1|ԪqPlYIsAHεjO:]vӭ"݄̿ &F@a"_Qq<}]~ b7x]UHcLmDI"i?LӮ$َ'[l!mU2˷r]o7{S9l 0FglhlQ6w6t7[ݬbYja7e)0*U&+}e 770ڞH6ۖo^P(ݶɏ: ,5W 4soаmʂ"8-qbѷ Vk[THb +"(lZg-S r dd;4 A*&EKڂE[ى! Fbn`"g7mdB ?Ӂy/ctV iaAT_'z[dî 与ϝ {qfݑjm~/m3n Ճ#u].p(l%qڐܐ1݂?OQސq#W P0_<1Gc8!cnJkԨ{:RZD[˙CwƬ;uJn26%L nemE mKv(Cՙ իRQF UF-NPUNt5/b'|ԔqP\f9I 3>gHδjC:)vPs$dLm.;8">SLu _7cfO_Xl8ŐSvQ&'6Rzqʂ7@í2*t1HfJLqJmBvJF\|y[BrnM!}T2OtLEe,b ֥27ɻ!}*!? ,VIgc܋Tcۖ5ov_XcdCl 'FZnSvSvؐ뺎M_mDߐl +r@>~* )<oK\kJ=Xqy5"3VḺYhCLHƐp! ᓊW &C-\z`cCz-ST!p :5iب J݉7DlW51j9R9-sSs|&yUͦZVy.j]vĈtwTWTcs(L0}`~wyxqأ~σw2 P4)+<5x`1hֿh&k4T-rcӁli x6X霏~sV<,W~RG<\ʮnUbѳE nc# դ6zHZ:+ ,a7@qpC ho4tF՞Ч"rň7}_uӉ*I!2XMӪ@:!IgqF x"\X"%2 9-E A#k`)CJ(, a׋2C8AcXCy[Tސ!x tCd;sџ$_qi4ѷ. >FBqb@`r[Az>ي}[}~rQ5r6#w}\)s/ }]Z2]J.r 3;vnKU]7Z_ɕÆS阫x>za3lzb>G:Xe?UVM2ۮZU>lX3^=iCr9xn<8wr=j:$ά I (IEC&m|+%rCzYjb {8V9aF 2BD[h4G,J/-נ V: zډ މ.&E^=jKԆ9'snS[ҹVms]~.!j]ύ~ .oObS orYd{lmQAercOc2Amb^^ЌK:\=<H?;ځcӚS ڦlHUX'"d|[By%'$fK@2}STyUz7U0R jO*6dR 2pYr*B̝\I(4: -˕e*Y7DSEsR% $1 B IyuBee !w4٭,Nd-ZV@HZPVN ]E:CSMFr/h8]23IW^089Hυ'MK:akPHf>(9@y/ ;Rpy⮕1mcĮ# %E*sB N3" %Gv-c#GG9dRj28HQ 9J* f@% Zqh9Ȱ9 Üic3oc`c;F;+|l^6e!Xr5ivfۗfFyUPɰZd'@,҆#WRYD H̝U.!J"+1]c*—*πk=hơ\c00AљaTBEbrDU%TWC;6O͉ﯚ5K'bԸ9tT#lkXیqd3&EfM4k>ɴ&拘npEǍOw̵qڄOUWEw 4'b)@㛥!S._ +-u1r/7kE< 9UQvǾ9+.˗~RG˕9kjEBI;uδO%֙!B0QsG҆ sBX4ҁs0x!ܧ̔E Ӭ EZU)^ɉ.U|Sj'8\cs7'c v0>QJ3lC֋c7(\]$91~HE c2ܯCo~+Bhaauzz0 efJб7W*YV~,R3G]3 V[z;Q7+miW`["iXGME98"r 9(G"<e1D߮C<.j$ T)S*9N.uHKj> OXƆNny":*@D9fu>CL_U_^'jg'owiݫ!4Y|G jԬ9s>T輪Y ` .9j]ޛK2n.~20Oe_-BPU@WefK9 Jj>W9LYkgڛ6kx P|ӑO|ƊW#OꈯR H#[V, RmERΟ'RM2۫pM!HY {$]E!-:p_1yҝ T@פcH¯IǐKkц+ i55 @ q#ZNc(@ kH_۟ %  yVK \|w%3ghјՌ1Xcz3&fMx̘7!4@܆d3V"[zŜqPTg.̋28] kbPeUD6׬EĬw5'Sɺmd|ZSG[wc!76gc벱|'}zEhy$$uqʓ/r,r,RbbT T˷,'Rۢl#ctf bH;3X7#c03c=33c ^)&5z &B4<A^\>Ǚ=;x%(o/ʯAY:$-"[Z艻p^7YH8A7EQPaoA4 17'[%EB5ohaUF/K2Z]lk,Kwrl-_̘ʌQ4xҌ,uxیo-x9DT, dRL-dRL--dRM/XzKA4,$.. E߅MM_V__jhjq*zZqjQ|s8er&Qe|Y,HW5jj`vQ&DP]Ru\piW/D)2N_%Ͻd.bg"6\83IYR;n2m>۝3sjEgX|U:x0O/ct*ܮ"}@p܀:ӯBEzWx TxC{C_ Pص$U ƩweM!TsH*:/LPVRNɱ$M$Xg֡5IP'p5lMTHCPg + |ԊNB{*Po+ $Ldudd•Y_S2lr?XtH&*0@6HMܳ~#B:Wč !}"~>? _…um(/D'Zdyro\|ag9 r LIE>ʬW̕ΏBkγs!rrP^ .ecCB|Hz&eT 2Na$9%:O1'OK 7uiiɠ."ẬDž%|()Jz$iZQtygN{i.=44W$9)MmB5#CוiJ{dl@iG@%(dӊ *V<8[hzq)9@ҡ^ Qd(0(0?Qa X:EZzb 43ELE:1'a{D,s7g5Fe3Z, bM"&vߥP\ >a#!S1qz3/U> ۫8UrAoKS$"@ KFN5~j {[yP[C&*t|ӸXӸ%ո/W|,xºd>8JLht 7-qKEy+^%)Iiʓz JGi*jgAT tߗ>-DT8 ՠn2<0Y*٦{q;K$Pߡiژ E ehp'n_+CأFgLGh?C-'ef&Bmg$mC!CPKn Y#Cy3B*HVQeƆ+̟%ɍs }d\H%sͩݹT"Hk-|Y4-lwxa\$oiN'q976v6ik<&797q"N̰._s ?"Ĵui&c./P nPHw2L} M1#Uћ=G3lڙLc(() WSH [>WUFݫCϸr)^Sn6qU+h\mOo]5- g)ڐYkEi-uD*Q TG.7^?Y|hՅ>;՗UJUN U桰@MUNq5+j(lԖުWcFdq@lju~2/KcUD-1Fh* 3&B(ЌR"ė(Z}Yg~a JZ7 D}x6^6I[Hw=PL'*#X&]a\| E0 OKhs!}Fa ӎwV?s2c#U, DvE).Wc1u1D#L$ٹ.Iigg@'k@d' ="K!QN*CsRaykcK B Vu1r1K&0HWg4jb(!"g y?ΝO3%ّW,dW#i洳 Hu*gz!h\5A 0!2v]ί.C5eqN^f&1H,)Ī[m Z"N}R7aE޻hϲͭǭSc+uFAuj2 ׊XvY+.zdh@uZHbn,eq! ,Ҹ^;Ҏh zeyaZH Uz;uX)}s>iUB +Z9Lw (@x1asH C6YlM`GYf<'OyRLcX13CLu AId Ȫ Aٵ"/GP 桘85 :`OC{_Lezިv{4EQovWxcFIPCn3߿4ӹ5K;|0g%c^.r' @2eh YLNĨ O-~6Ħ%NB,*W, |$i*%rR(JrkrP,e,W$24FUH=˜JӴ/{:Y*#]QkKmiw®YFME|ËQ)P$P@9m|${9RA2as9wKsJ}Ӧ|dq^BskBEN@:b'z/i]N`i'@j|>q>I祤9oGnmN;oSf:k'쟒lgtCŜ⢆KC- גDdꋢ QJ6 DS $-Жdӳ'[G*5`)VF+K2zZ\l[,˶Βl{-qX2ˌM48ӌ,8܌k-N9΄CL|,%$L -$L-E$M+XiKG4DT&s̪|tՈ>CQիPUN N0FSUBs)j)|ԚުWlRڴ۹iŔ|Ӫ*o W:Npy:-&uZX̛iAӢ3iWO׼Էy{>)~Z!gMj b<'{sP/yB Z>-$jRJg\!U[WJ-tJhSKAZ0TעR9T\-\V-u>*<+[-:3j3:Sk3lhկViJ K)k)+-w6dZF`Ml2=ofX#7]zSJx?8Sz_9%ӍtyN7COYě)Y?=4o']]q27S*$P yABFj EJ=TUkxDQ,X;Ek0ǫZES]i PukTtP촲Œޝj|_H։UKXD s545|Ίj]Հ:KuW;좡G|C \TupiV]W L+ЎN_P%rٻjuw( hobUPf&XPQ'lY>кfǠ>GL@a'enS" !B=/W&TCa3ee'+N)i[RVùij{IJp- 뮹 + 5[)g-=5_)KrՆuTG')wO5YBGutB)-5К8@4R49kRyZ|̣::+ӕJ@@Q H;ƧRu8jp$B 2bJ8:WS^6-6̰R ;1ө%şR.ac4lT jRE^3Ial`8) LγRZtK!o) "$.eR2QʊJqg)O2/A/HsP߆S4%2+vE\/-V-| jS^ѝ[si5nޕu)c \ M%oe*'kYp䵍D腳m9\j]6I]K_W98-* 2<Gu4 /CXOEȐ8fwqt։a7*D  (&Zi*ީ. l؋ybS L )0/%1qmdD:ǪuVSk|EC-u1.Ҭ.Kz!O1q2A}4X}ju JrTIhӵVA%ǂْ.22Uʵlx9 %a:XUHa'ucDNIђA=%?OtLqx$͠hv&iE;ϳӅ"9i%x\nBW 9[{in} ^zx>vpH=w)E%7YV#hovD/\|vR)g-B]eiGh#eHeB:@䡐YЀN5V5Akdy1Քqԯs 劋@Y9։dŋSko39qzΞa14c u8 r\$hNCܘ&XTR\89㶳 Ht!`E!APSbvaN=%5Ȳ hY3Kxvc_Bb~Ҏ|NKTR\ItPz^zQiҍEB^Jl%<+l,9T!iϕ2!J,B;E L+i*H+gIN,H J48/CXOEH8fIE' `*7Ct4e=.wFE<(a41JOp^M `I1oŐޮ`~5&j]ԢwATUhu0\ qŠӗyLj`%q2+"ɵ }0,AJܲ}>$o 7O2X:#Ktd Ɖ>UA#%G!E!6E^H)^w) @TPC[Sz!k3Rm {I&ϲ6F6#^!S |Fs> z, @mHX]ӫ@P<]Zdp§p@.%@[ 0鎥KRzרizTyBrZRض5bdyPw;2u>SlukH>rLw>uaKF^dF*uFrn'hqJ[w oШ/rIy$I rs7cYT4惫oإey$C(JQR䂰*gD^}Zˢ: 27(أ*ިX͸Huitzh5b\ٗ%ͻh:?ץ1*fSG?*Wغk#|(N藽$!2?q$ZL6@ly?ʫ^@r&M<a9YUMNO_/QuAr}(,S\mo 9%jo$9r>R漦QsPjj]:^Mw)S &aȫj<S3qp:nd q-Kߨݰ$mRu}#F,OܗfUٿ&| =\b:l,D.7>gұ|'}"'CƋ  `jR䀀OƶÃ7(ޚu|eVTIKxI Trnn}FP/)T6IeO O$“ɛ* ݺ+ҳH"vxWh?Y3ٟ"6VoqDV>)ђaޢIXن>$ELlHV}ͷ^lQWĤ.猨XUmsWx.b]nĐhwSET]S| r;Lobp_^q 7P/uKdѴMM$   hJvy`#̿d N9Ȇo^ {?>|ePa'uG[&57*a>DH4Л>$* +H&@I/fPy&-$.s6 C(jjonGg b$[V7 A$5nȤMBBY:idؐΏuU&A7 C*onHUwn/s#qwp$! l[V/rm䇫l' 輕])ߐO8uEep/T@d#[׹$~*@.!HFܸ$Lr=ʎƏn9 *T 夤YuFya?j|֣Sv`l[g*v6,ߖsV-I\)p| rM)ª&Yp'!|(hB\% 7W%F0= Gofk"/#l>"̝e5ӫ5ndn4/۲ylj@Iʱ&ZoKcβY:C9[oHrת|ܕ*;+7A-w!E|2N;\0e .}T)BD5/G,- -*ЧZҗԗ) ؉: z݉6E̓[53jE\99+QtvU,^ Xh.\j]p!5w< v:L!gbJ^~G$ i>0S4)m%&4MCMF5X8+8IlfP$M>H|M: ׫Ȩ;t[_:mop@}UTUZi>얶Jky>p--#㌎ŧ"kOxJa܋ڛܨ Zt"fmh-+M&6v!ԕ|m@HR*fzg~XKzx7Q>o#s*Y,gNrWlj1wʸn$vLn@LZJZ\Y5!]O4nBBj(Ѯ,/A5Z4h$r-ժ 1I,ER.Q< TvOV0B/ oo2x յ,.Q>0Zz-J7hpiVmQWf Mb3I !_$IUkmyEȪTC+Q!Sͱ:_hi>0&{™툧H=lxxmʘևme XMN<[jDFX<6J#>BȚ_>2ݺV %]s 4Yd7xw[2*&M< E'VL_Q$AU::?sQ%ްø'GѬ]XҘU'Ǹ8 [ 'B=-ep{a.@`U2HM}YBӟaԕم3&E~G#)5o$ cԫ1A&yNѠS $ޣ}j"va8mE!/M+ e}`7 !FC邏:5Dֺ.= udP;Bψ2n;Y *+S\JF!j#pOqwJk,y8wЋ ݦ8w6p"#+>0EʆG] }b-=/z/zCGZ܆Rl}a,}>4W3(Y |y^o@sXsŏEFVS*,58>IbEq(O) xw8xTn>܉ -PaVcP]tR#]L NˈPrHwpJ.O4q:VkC4Z q.-_ ƝBGCE8ނ(Ck68(ΫøU+Tŗ-QuI3qarf[EޠaԃB:p eһj /`Ĺ<0nH=܆{EJ?!aRᾁ G$%JZ! nAG*RI"O,y~? ;P'dzt*yaܝ2ʒ2L2<5 +g .sGPDshv5^rÅkkr^Β}uuY.n!EEr{XSV =!,~R)扇q#B]S1:78F"K<n|WE!EX O\H^쉆Qn<;D9 $C,0԰yq/R4@ y@}U2O($~QbO[ޠa,qČ(]pTzcKr Aw)\xwՂcSJvu(S>K7nphuב5JL18aon. Wj\S㞜}RR׸&aG8o ƽ؆ocvq 5# ;hf˚$U ?q ]406yh)͈3 D.F9N9O4UZu>*QB*qMطx.5kJB]MAݜ)wB*K-Vs .(˞qe XZlgGXV~퓢O|V$ ca([K֥1@ɠI؅^.~c ݸ#5(]PM\QVԚ|H?k+z1cI.QG[+rVh4ާk"YKpq7G[(89ĺEOlqk5;8rã%qK+ ?IPgvtר0 ƾBqՄ.]e}bM3!x'PSIaH A*Iʪ#ܳ$]P}5?M"o0:8l5$]PfB'֤8oEZ!Wn0Akw.;SUi^LZƲZO4ı# dlJ:RC*np 7x7nQ@+V#PGу)q-" "IM7Ho!\F#5R%OX5TH&GƟhu4 (֢CZ"ۋ몊L a`a̓9Xī{F wYظkvon,E6H ˧KA%- _N! tEI=/X;)WWCVI4B\kT,]|j% =[VH/Rb޿DQ${jN#& x.. C8~NG)+[>il(jP1e(5)ւ>d"&r4z F#59PզScigi\|CSua6Xt(_Iɘ/Rǔ^(І+672]N%o9Յ4pw9Lyw=r$|Ѹ5#7,SE mޜ^#Uy}nk))+Jz/ IGM*Ͱ}A)7X! FURVSK:X74oPICy|}[+?iüGeqx"B IMdIkO4+?Iw48PWb[ +EՎ/;irFvq2d$_A_g>5/iR0cJ'bTLF?+_+?&/_p,5!EK*t?Bc)+KKTå:Oa&\|>MURf ;$a67>gұ|'} ;\GiK8p`/rE)KK$Rn% %R*ap0ⱈA#Mֻn]L uq(c:M#- NPUR%X9qG) 3X]y8;sM7 O5|jUo@5#5kīolƆWCO50Piϝ=a>%mk޿)It.+>G%*SzH_lUP:/A4IE.jdCIELU#rRvr^$uOt*-M'auo@"k8|uX:jː , *6#D[uiۉDI{L[["s%Q}n1OΆ2oϦc!Ha㢾%~І#O|ƊWCO$*d#"OZ>bGJ!uC=~,&(#|)+ǿ(JdtΘB-=9AվhSK˚w#YNϤvk/r8J;SOl#$/bZS9o0 #wnAҌޗT/gZXʑam|g'\)ipp\~SV<*W~RGCj%,Uvi':QKY+fH[̣ɘGQ{89PȪd5P6/aEg#D>M6$ν,<1cޚeǼ>2!(nt3j-̏76gc벱|'}nο3G3=zTMϿyo,:gxYt,_I@=zaEkҡ|'mor9[';6e8EoCd7ق&r>TҜ N+^9omq>Yزt(_I\ gRZT8P gK}$M{Pu4kij1I7|nxlo~sV<.~GoD.B\HMˢf)^Zd?pVkHzm$-"$ɡ4~Wϱ4F3ݧbT-F4y5R]U$&)+u3B ?f=ɖkx1Xru>0\4yPL taUH:z(|!5sWTTՁĝu$pހ$I`L>4b$ukc3?L5-,OE8on@\'#߄ (+K!\M|*ɑJq,銍ը*OCc ƈ`)!zVvy^I]r76vL&˳=' yKwl0cAV%CQ' V6Q}+gs+G*UW|gy}rߠ@SP(KfxSzcI4f# **Kt 7_p-S秺 ,JTydKVeD++])!7X\ Bɪ*i] $x$'u5idoœOX~G55Mˆ&ބ g7Fԅs'\$Xњ7 x*u CUn&f#IGuy 2jZVծ})rUejzQJ'M MZҠl.:ߐ'+ylEP@q r!0=DE=K^[ S?UoOMGY}T2!(G|Z}c54 1-K(PA8j"RÒ=b4('$ e6agphBuLǾ)[ 8]K$N7[&"%PZL]zoZLl;h96̾=o&?mXA @^;&c؄/J%}7\T&wu4dR츍Isi+F;-iФXLfrU,4|3\܂X-1fH|E:2}.]LKH}BNv2˫ZV۫76-ce+`}www ~5T^N>?/>>;dem>|!#PÝn4c?*u>|Q9Yvyoy9oJis ._xůX_2es+CF*=v_dW2*mhrcR5JBs㞛PMgNTBzۀfpNk^$+5 i Q#ZNn9<4Ƒ1篤xxp =G'/KNj*R<_/nl $_xv<7w?F1Om’@9f%;PH}KXR;n]gY湕Azշ;ܚ%Z k?|=w/ ܡYO/B< vvx2_Lx2W>SOC_fR{HZ 4SDU}"m2!(M .ہx Z#F_hn{Zgv~v*tg)X Vpq9^b fWc0=  25f8`U%'Z *G7ui |k^F .O/xt ?{W4 ?K#l~=IE D:'-~;&oٷ3ޘa!kHD9OnPD[HwW`-S0*q6}Lohg#Շ[*]<=Y+MtqͩFu 9%?Zkޥ}z=޽#ywO^cx3ݗ~~'CT޽ϯI`ߠ7[M&Vw>~C76{/{/~|}:]u.fo_x8}O^ޯ;/~|QL>}|F kOzu=1֦{L-z@x*  ئ&o3ԑB^_ԚlW?9$f 7"/Ůs,~sM+jE=݇ONO'aNOSp$gt܌['E]b|ht@~ºyP1d#)f\~}'é>o8 4 {oI@?%D|?fzP>/g7D i4LcmY œ@V>DI 5֚w+Q?mXF`nioɶ`wo?ʗ!:Plv f+Y[ 4)q(li*x:r-i?Xwۯfh" 4wy| 4'??{K5ޫCI?}|`-]uJ7dhkV`%Ii3_}|?:m5+\\h_X/{L#=zuڳw统^-Y"&HFg3T[}6<>|?O_  ;~x8v7wG޶iS_[$2u㻽?VojwOWlz\{awqm \w}W67M ,nv6H\ҳ]b7'p=y^hpݧyF?^OlC+La?xop׳O~TYۊ&M][zjw?|Y0m^[}G7c#0'{SlEgaن.F_Mendstream endobj 437 0 obj << /Filter /FlateDecode /Length 235 >> stream x3137U0P0V54W01W0PH1230!U`blT052@.'BIQi*~8P%PS!K4X.}7}gg7 7FK9?47ΎEAm2nv9?q?u9M/.]}]7w@Pmn$r>'3%ݻ`^ρ&{:zi9Y$ZM8\=APendstream endobj 438 0 obj << /Filter /FlateDecode /Length 194 >> stream x33P0P0b ebeg`!U`nf2X,,M-AJ<=}JJSÁ= ]fr;;66 @ܼb;;.OE9x{(|hT˨]Q"Gͯ ?&h*ɖ" B hJ\endstream endobj 439 0 obj << /Filter /FlateDecode /Length 177 >> stream x3530U0P0bS#csC.=C a\B  Pa ĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-Ȗb$ ws;HX'#>endstream endobj 440 0 obj << /Filter /FlateDecode /Length 176 >> stream x353Q0P0b csC.=C a\BS Paĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy((1r᯷Ǯw}={o(|[:`aprT>%endstream endobj 441 0 obj << /Filter /FlateDecode /Length 199 >> stream x353Q0P0R54S0P06WH1230!U`bjT052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQPbJa_o]!z2Qmu ~-ٲvL \ \alICendstream endobj 442 0 obj << /Filter /FlateDecode /Length 191 >> stream x3530U0P0bSCS C.=C a\B  Pad#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm T4 (k|?n]T+c?fdS! #Nendstream endobj 443 0 obj << /Filter /FlateDecode /Length 135 >> stream x5 @ :'a^fӥCɃxެO_SAIfQsϳeN Z~y~NYu9Xa]B> stream x433U0P0b SsC.=C a\B  Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(v}ڢ@z[ mάG`R8TmzJ [o`aprTihendstream endobj 445 0 obj << /Filter /FlateDecode /Length 185 >> stream x3737V0Pas#SsC.=C a\B3  Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy((ؿ7gg?eտŲ \1q \ \Z~[endstream endobj 446 0 obj << /Filter /FlateDecode /Length 227 >> stream x3737V0P0U5T03W0PH1230 !U`fhT02LX$sU()*M*w pVr\r;;66@\9y@-vv\. j bXd>!`ϡp^//G_H24m[]ҽmn{'l1h:,| L\ \6)Pendstream endobj 447 0 obj << /Filter /FlateDecode /Length 190 >> stream x333P0P0b3SsC.=C a\BS3 Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(*㓙cw_^}T0< Nap`rT~F}endstream endobj 448 0 obj << /Filter /FlateDecode /Length 200 >> stream x3530U0P0bS PH1230H*T017 UF`y 0243pU()*M*w pV0w˥{+esJsZ<]l?9x95~~_]zP!Gt`aprTMendstream endobj 449 0 obj << /Filter /FlateDecode /Length 192 >> stream x3131Q0P0aKcsC.=C a\BcS Pa ĺ@@`aij RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-ljT*nwkpoտk$ ?Osuwnp ё`hrT9endstream endobj 450 0 obj << /Filter /FlateDecode /Length 283 >> stream x]1n0 EwB7-R\%Cl4ٛ:-ː.l~pzGiIq_ӻvB@ .zљ:QߐE)P-)I#@)VH B֢53jH$8h'DTRFo}>zR/xSpIi>&=7bNQ$Y:Y,0?endstream endobj 451 0 obj << /Filter /FlateDecode /Length 218 >> stream x3135R0P0R5T01P05UH1230 !U`lnT052X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[$bp6q2r3?K{վ̾6?g[.[;3wiۅh6ń, \ \PpH}endstream endobj 452 0 obj << /Filter /FlateDecode /Length 184 >> stream x3134V0P0bSKC.=a\B# Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\0F M!{C]qM? |?<,ɧɓ7p04pz*r)]Pendstream endobj 453 0 obj << /Filter /FlateDecode /Length 158 >> stream x3135R0P0U52T06W03RH1230!U`lhT02L,ɥPRTʥTɥTƥDMwwvvrllt29y@-vv\. j g:(̾ ap`rTriHendstream endobj 454 0 obj << /Filter /FlateDecode /Length 443 >> stream x]=n0{B7X?ݸH$~(C.ř)Fy˶ˏ6vY﷏cX_׭C;ކ<}bA]N>O I?i}z km]WRϥ=R;}_x"GT$D<`x(⯯3oEh]G׃bvZ mendstream endobj 455 0 obj << /Filter /FlateDecode /Length 194 >> stream x3231S0P5R54W06W0TH1230 !U`laT073i`Y'O.}O_T.pR.}:.}gC.}h\nn@n7P;s~Nin^1PY՗4}]nۊ5k!oouf_QYr#"AS! Oendstream endobj 456 0 obj << /Filter /FlateDecode /Length 208 >> stream x3131Q0P0U5TL-R @c$r*[L- S 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]> stream x33R0P0U5T01R0PH1230 !U`lfT02LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[R'˿__j?Uy{,+oeG3~U_p'nW79W+iuVF.WO@.Pendstream endobj 458 0 obj << /Filter /FlateDecode /Length 169 >> stream x3232R0P0W5T02S0PH1230 !U`haT02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[)b}c#\?n5߰<\ L\ \'?dendstream endobj 459 0 obj << /Filter /FlateDecode /Length 207 >> stream x33R0PT54S01R06WH1230!U`ldT052,,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[峭 fGF_+tU3_ lkW[oڭ_UF$쩭}ߪʒ\=+zEendstream endobj 460 0 obj << /Filter /FlateDecode /Length 219 >> stream x3534W0P0W5T0P06WH1230 !U`j`T02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[4mÆf=,_2{]_k˯?XھWK_?6l}~j_݋ܲaD"3+#B N endstream endobj 461 0 obj << /Filter /FlateDecode /Length 179 >> stream x3ԳT0P04T06V01T0PH1230!U`diT025`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmw v UzgkǎOuGS! )4endstream endobj 462 0 obj << /Filter /FlateDecode /Length 179 >> stream x3ԳT0P04R06V01R0PH1230!U`diT025`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAm]o4Lj0 3SuɴIQ \ \f2endstream endobj 463 0 obj << /Filter /FlateDecode /Length 110 >> stream x337T0P0W04S0T02TH123 !U4 *is 643K9yr{*rq{(r;8+.@#c<]PS! 0$endstream endobj 464 0 obj << /Filter /FlateDecode /Length 198 >> stream x3731S0Pa cSsC.=C a\Bs3 P9H'BIQi*~8P=P1S!K4X.}7}gg7 7F[A(㜟SW bg颠mAח)&A/liݖcUCZIZ鿮Q_㑤XCB ,`endstream endobj 465 0 obj << /Filter /FlateDecode /Length 230 >> stream x313P0P0S5R05Q0TH1230 !U`bnT032̀X,ɥPRTʥTȥTť\r;;66 @ܼb;;.OS҄Y"v0ɯ/__[?5r?T'>ckvߠ{oP4ӂC 01(pz*rz'P~endstream endobj 466 0 obj << /Filter /FlateDecode /Length 196 >> stream x3337R0P04W5R07V05WH1230!U`jjT04F`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEA`YJ͈~K_nzҗA8,z_~`drTOendstream endobj 467 0 obj << /Filter /FlateDecode /Length 201 >> stream x33R0PT5T0P0PH1230 !U`daT02@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[>OYr~r?nׯGjU_49{]KwT7rq1(0qz*r>Eendstream endobj 468 0 obj << /Filter /FlateDecode /Length 297 >> stream x]r0 wo 5wt^ 9!C߾H:t||ؿ-,-y_iNcrQ 95q|~-[~tLW)?_{(.>JE&.$0=ֺ45;@:C рvmP{4EvȲ۠oeQsgGӖ nڹH6/Lh͕΢idGL|}ښNZb U;@"+^ҊȫyvgB,i.{ysa]VKP/endstream endobj 469 0 obj << /Filter /FlateDecode /Length 192 >> stream x]A E$B6vM8 E.zʨ]tH>3Ov.4g| qIV n=̻&DkM+6h ,uf_ ;ЄP5U5!TUf J,&&*O4x5}9,)a)%c.¾`endstream endobj 470 0 obj << /Filter /FlateDecode /Length 2653 >> stream xXK>x"! (QbIe :`I, ߞ~ ȵ gz{z~ǑoY<~IjzfEYn[\*X8jv#X`hMLbm[֧WhNd,7:)?s3*\*zRierH'ŋmQ9Rt"A0'Y,H,æ<SRKahʨfWl&e {}+m-\HD+lga4I8c'r^T2r?k27YF9ʡ'˷2սt$e`Q.mE )0" Iv7i*>,,NZ}1yT r<qhL-Ò4JaEPވʺa+e蓇E4 ri \Kw4t rn{)ZȨ*ZWr.# ە" KPtnaSAbV8 }{[RRce07t$;^t?)pTLȩеIUQfJԛ>bh0Pv:AJv OHCQ1:CM#|QaMI3r0X$jg0 tUo>`u9yuvAH>e0kwYm)WM GaCeæ,V"M볟 R`p96ij;l ViKWJ.D],|NO2):B"Ywt6 Mvm- Zu4RM@,0Ok$g)?PN#T܅#\A ̧+wouƕ;/- MED_t^qqǾ=I+h"<ehVz0}{Jpo[sΏgr~ 2p6N/´P}EazB~C!?p~[Sݯq bWU>TX4Ytt+`<YUo|!w4#󐧞 ,!^~Ov=^u<ɹ\PO}MFs"y5x9oz~KswNB%jiŵdI% V es 44wCAA CA :@Cf\L$4 u)?~Yendstream endobj 471 0 obj << /Filter /FlateDecode /Length 193 >> stream x313R0P0bS C.=C a\BS Pº@f&fF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pi~:UUW8|_2*e̺md08pz*r4Pendstream endobj 472 0 obj << /Filter /FlateDecode /Length 158 >> stream x3635Q0Pac cC.=C a\B#K Paĺ@ 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PB.V?' b?02pz*rHaendstream endobj 473 0 obj << /Filter /FlateDecode /Length 182 >> stream x353T0P0bS 2QH1230H*T013 U@ T&F %N\ %E\@\@\N \.@c݀}o]s~Nin^1PBCE_ب/~BurK륿~ r}_GT08pz*rzNCendstream endobj 474 0 obj << /Filter /FlateDecode /Length 190 >> stream x373P0P0Q5T07T05QH1230 !U`ffT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[Ŭ pBfMi-x^r7۾Ixo1ؑX$Mendstream endobj 475 0 obj << /Filter /FlateDecode /Length 266 >> stream x430T0P0W5TP0VH12!U`a`T02́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[YmC, k ȮQMd],e^SKy/U2˾Kl׏4z{]w.흫c6wKyTۂZ\X[-V\S! D`:endstream endobj 476 0 obj << /Filter /FlateDecode /Length 247 >> stream x437S0P0Q5TP0RH1230 !U`ilT1LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQj9¢('׊wחއ]k숱+ecQ?`‘}{jމ-&`AS! j9endstream endobj 477 0 obj << /Filter /FlateDecode /Length 225 >> stream x]n! w789hdЪj3C8D.C߾/C0?NS->pչԹmRuz.i}o}4çwەݚ2ń= ruWf8 .^AMSKuYG\Ճ@X ` kAp&fH=iA&\a<ӽw$&p_miܥ pendstream endobj 478 0 obj << /Filter /FlateDecode /Length 102 >> stream x3135R0B#C##cC.=C U`bh`QkapU()*MP0w pV]ry(!vendstream endobj 479 0 obj << /Filter /FlateDecode /Length 213 >> stream x33R0P0b3sSKC.=a\B3S Paĺ@@`h`i RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-\p G½M½C!Gѐs/_Zw}?@ḋ,7|ʜYE30rz*rpMaWendstream endobj 480 0 obj << /Filter /FlateDecode /Length 195 >> stream x3135R0PaS3C.=C a\Bcs Paĺ@F& %N\ %E\@\@\N \.@c݀}o]s~Nin^1P) oקK_}Y*n_q~=?~Us`hrT,Iendstream endobj 481 0 obj << /Filter /FlateDecode /Length 189 >> stream x3135R0P0U5R01T05SH1230 !U`ljT02@]#'BIQi*~8P!PS!K4X.}7}gg7 7F[A(㜟SW bg颠 >D_=dWSKu_Y L\ \>endstream endobj 482 0 obj << /Filter /FlateDecode /Length 234 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-x~ACŇZ>^O\z\6mى[>;M\e~_;yW[ڭKM;̙cuAS! [PMendstream endobj 483 0 obj << /Filter /FlateDecode /Length 153 >> stream x3ԳT0P0aKSsC.=C a\B#3 Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(<T[;xyd9F.WO@.>(endstream endobj 484 0 obj << /Filter /FlateDecode /Length 209 >> stream x333P0P0b3CSsC.=C a\BX0b] 0121)qU()*M*N \.@c݀}o]s~Nin^1P3?_7?S|Y?۷W8a/W_5 _Ww?Ͽe? K$04ppz*rSxendstream endobj 485 0 obj << /Filter /FlateDecode /Length 191 >> stream x3535T0P0bS#SsC.=ɹ\ &`A* u ɓKW4K?KK)YK%hv,`cﭠ q)+jtQPJl4H]oe՗ ;ZdG\=OFendstream endobj 486 0 obj << /Filter /FlateDecode /Length 216 >> stream x3334R0P0V5R03T05WH1230 !U4 *Z@kdsU()*M*w pV0w˥{+esJsZ<]2(2*xpo?\7/9+v4*>Po^k|׫nG.0XĠSendstream endobj 487 0 obj << /Filter /FlateDecode /Length 251 >> stream x036Q0P0R5R0V05WH1230 !U`a`T02XD<=}JJSÁ = ]r;;66 @ܼb;;.OcN\9`tG[v׻ɥggvߊ*/]_<%w}^#B gendstream endobj 488 0 obj << /Filter /FlateDecode /Length 195 >> stream x333P0P0b3CSsC.=a\BSK Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy((2r18^puw|tљۦڭ@~8ݪz}'\=Hendstream endobj 489 0 obj << /Filter /FlateDecode /Length 520 >> stream x]n0D e/%E%*!8}gFI=g{9árwm|]>uz]MI߆p|6ڼCW}hM}ƶ k;<}}zhOv'._OVNUJU H4H8]OD3WN\U+g2&$SA,U>?k y F#BfĄdHLH8W)E)E1 cD(Q*DSTNa9NҷJ6DxbBJa쪠6*م]a F%ʐȔÐȔX'SWr M!FL]0!p.غk9L|7b Fܠw#8ס8._<}I@qbW\]9 GOwz̜JEOP8[ G#7gu= eiK"@^ R{ux%yr7~l[[zb_%VNu/endstream endobj 490 0 obj << /Filter /FlateDecode /Length 205 >> stream x313T0P0bcSCC.=C a\BcK Pa ĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[`AT'F'N{;P}@j]e*IZH4e`rT˅E,endstream endobj 491 0 obj << /Filter /FlateDecode /Length 175 >> stream x313T0P0asSCC.=C a\Bcc PZX8yr{*rs{s;8+)hٱ\nn@n.P9?47ΎEAmႋ9_^\_S?MG'_S! >endstream endobj 492 0 obj << /Filter /FlateDecode /Length 233 >> stream x313T0P0R5T01V06WH1230!U`b`T052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[p[a2C6CܮgN5][x@mmsffs>>' U/_~a/{5M;̙#1"17`A.WO@.GLendstream endobj 493 0 obj << /Filter /FlateDecode /Length 184 >> stream x313T0P0bcSCC.=a\BC Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[Ϭu?_~D_ .i깂S! AHendstream endobj 494 0 obj << /Filter /FlateDecode /Length 180 >> stream x313T0P0Q5P06T05RH1230!U`dfT072L,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[@L~%do5-\pMBS! |N@endstream endobj 495 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0b#SCC.=C a\BcK Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[1ǘϬu_VeUX_k}ܿۿqh]sCB  1I{endstream endobj 496 0 obj << /Filter /FlateDecode /Length 176 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(X{˗'Wy__G> stream x313T0P0ac3C.=C a\BcS PH.PY8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j &4簵}por¯K?jVv_6={۴Ü9a$"[\=|;}endstream endobj 498 0 obj << /Filter /FlateDecode /Length 203 >> stream x313T0P0T5P01T06SH1230!U`liT052 ,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[ -h?NSe ~Wo[&hI}8X w4bP`rTdHendstream endobj 499 0 obj << /Filter /FlateDecode /Length 179 >> stream x313T0P0bCc3C.=C a\Bc  Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(x!rENP0" ߒ׿^ ~<m8endstream endobj 500 0 obj << /Filter /FlateDecode /Length 180 >> stream x313T0P0bc 3C.=C a\BcS Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-mOz) 6dmIGs08pz*rZ:4endstream endobj 501 0 obj << /Filter /FlateDecode /Length 172 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(Xɡ5_ߖ20rz*rAOendstream endobj 502 0 obj << /Filter /FlateDecode /Length 193 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(x6ySO>?}۽<5Խy;_VB 4@Hendstream endobj 503 0 obj << /Filter /FlateDecode /Length 198 >> stream x313T0P0b#c3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(Иoߔ8iKߖn7oGU᫿ܛ\uo{S_ [з:[vry L\ \C9endstream endobj 504 0 obj << /Filter /FlateDecode /Length 172 >> stream x313T0P0b ebeg`!U4 B@ TFfF %N\ %E\@e\`)YK%hv,`cﭠ q)+*tQPuf/{/bӄ.ޗK/,(ҁS! .97endstream endobj 505 0 obj << /Filter /FlateDecode /Length 161 >> stream x313T0P0S01T0P05TH1230 !U`lhT@-@l9yr{*rr{Uq;8+9.@Cc݀}o]s~Nin^1Pb ~Qَ-[һ:We5eMHt`aprT*endstream endobj 506 0 obj << /Filter /FlateDecode /Length 117 >> stream x313T0P0W04S06W02TH1230 !U`diT0@lhfrU()*MP0w pV0wPaS! H)endstream endobj 507 0 obj << /Filter /FlateDecode /Length 119 >> stream x313T0P04F )\z@>ɹ\@I ah$t*ɓKW4K?KL:8+)h\. ? \ \&pendstream endobj 508 0 obj << /Filter /FlateDecode /Length 162 >> stream x313T0P0U5W0T0PH1230 !U`llT032@X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-o BbGeeMap`rT@endstream endobj 509 0 obj << /Filter /FlateDecode /Length 210 >> stream x313T0P0aS#C.=C a\BcS PH.P)H'BIQi*~8PP5S!K4X.}7}gg7 7F[A(㜟SW bg颠,^GE/rǾ_r_}yUm}ҥ@`˖-U^8>9dB eO@endstream endobj 510 0 obj << /Filter /FlateDecode /Length 160 >> stream x313T0P04F f )\z@>ɹ\ `A* TFfF 5N\ %E\@ \@\N @K4X.}7}gg7 7F[A(㜟SW bg颠Ab?; 808pz*r-endstream endobj 511 0 obj << /Filter /FlateDecode /Length 203 >> stream x313T0P0ac3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-VlpgC.?lϱHčЋX?X>Co b;%pqCB Aendstream endobj 512 0 obj << /Filter /FlateDecode /Length 190 >> stream x313T0P0bc3C.=C a\Bcc Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-xba7 _MH,1Ug خ[#:08pz*r5;oendstream endobj 513 0 obj << /Filter /FlateDecode /Length 321 >> stream x]An@ EC'RMɢUd0"dtCz|3.N8yLּnt_Ƭ y7aLvΊk;̖ګnjkJSgMeDzckfc [ǥN7 5ݐ!*V(;J ͅM@;NQu ШeWTN"QTx!4R:P1: 1z/F'P^g%P\+SW> stream x335R0P0Q5T01Q06WH1230 !U`liT02LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[$cq;^K_*6ubU>TJUz8/v%(j`hrTDendstream endobj 515 0 obj << /Filter /FlateDecode /Length 218 >> stream x3136R0P0W54W01V06WH1230!U`ljT052́,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[4UYHƑK_6Yzm0볷 nu{MoY&tX`A.WO@.`Mrendstream endobj 516 0 obj << /Filter /FlateDecode /Length 232 >> stream x331R0P04R5R0P0TH1230!U`jjT034 (ɥPRTʥTɥTƥ\r;;66 @ܼb;;.O28'6MpC,1 cYf }eKkkG]ߖ__)u[_;6ozإۄn;LHh 9#B ՀNendstream endobj 517 0 obj << /Filter /FlateDecode /Length 218 >> stream x333T0P0b3SSsC.=C a\B3 Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-x!~DL۾~k{_=ׁު_MuVoq-^t@@#B {4Lendstream endobj 518 0 obj << /Filter /FlateDecode /Length 218 >> stream x3536V0P0b3#SsC.=C a\BS3 Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-ħ}vE^R.[_k콿[We񫁃S! /Obendstream endobj 519 0 obj << /Filter /FlateDecode /Length 237 >> stream x3332Q0P04R5R0P0TH1230!U`jjT034 (ɥPRTʥTɥTƥ\r;;66 @ܼb;;.O28'6MpC,1 cYf }eKkkG]ߖ__fW[?x Y(`hrT?Rendstream endobj 520 0 obj << /Filter /FlateDecode /Length 158 >> stream x3630R0P0a#SsC.=C a\Bcs Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-_qk-f520rz*rR=endstream endobj 521 0 obj << /Filter /FlateDecode /Length 231 >> stream x33ֳ0U0P0bs#SsC.=C a\B3s Paĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-xP7G⚮{/ttU˾]__p_Z`~׾}~__WkOg`rTmQendstream endobj 522 0 obj << /Filter /FlateDecode /Length 183 >> stream x353P0P0a#SsC.=C a\B3 Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-hؿ֡Kުᯗ~ӥցS! hTCendstream endobj 523 0 obj << /Filter /FlateDecode /Length 216 >> stream x3337R0P0b \!Ő@B#9P,Td.P8yr{*rs{s;8+rD͎wwvvrllt29y@-vv\. j w¢ڭ_זuu_nWֽ^&zp:p~}S! #]endstream endobj 524 0 obj << /Filter /FlateDecode /Length 306 >> stream x]1n0 EwB7XR\%Cd5ЎfR'E4C9*z5G`IR [JIDw=)-T-BI*"dkh%B 2G \GE DNu ɏeccg2O3vendstream endobj 525 0 obj << /Filter /FlateDecode /Length 200 >> stream x3137U0P0Q5T01Q05QH1230 !U`liT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pu=ǽj_f_W'W][ou۴[<#S =8\=LGendstream endobj 526 0 obj << /Filter /FlateDecode /Length 161 >> stream x3137U0P0bCSC.=C a\Bcc Paĺ@@`b`d RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-saALzMY)\=|V=qendstream endobj 527 0 obj << /Filter /FlateDecode /Length 208 >> stream x3137U0PacSC.=C a\Bcs Pa ĺ@@`b`d RɥPRTʥTϥT̥`ȥ 4;KM V8qy(-@Pendstream endobj 528 0 obj << /Filter /FlateDecode /Length 177 >> stream x]1 E{N @hИ"L , X)>3o/6RN RcQX f*T^HOp@w{-j)aRA891꿯fLp6əUwE$DQ6c-veۙˋsųU[Qzzww>hYZendstream endobj 529 0 obj << /Filter /FlateDecode /Length 203 >> stream x] w7hK#Ĥ.a(%p«[| _ GX#fٍN3Ȫt_]#]5[_QL:Ⱥ9`ߓ+ `]Ț<!l* E@E!s$"NxiYS°h2[ScI gendstream endobj 530 0 obj << /Filter /FlateDecode /Length 222 >> stream x3135R0P0V5R0T05UH1230 !U`ljT052X,ɥPRTʥTȥTť`ȥ 44KM V8qy(-hK/~w>:nˮ V<$ec~h?*n{'eݐcͣ#%Kendstream endobj 531 0 obj << /Filter /FlateDecode /Length 201 >> stream x3331V0PaS SsC.=C a\BS Pa ĺ@@`bdbRɥPRTʥTϥT̥`ȥ 4;KM V8qy((%.4v8~HK/}٫}(N2FWSSCB )Nendstream endobj 532 0 obj << /Filter /FlateDecode /Length 183 >> stream x333P0P0V5R0T05WH1230 !U`jj*2X,ɥPRTʥTȥTť`ȥ 44KM V8qy(h1OXTaw}m~v9ۦfpD`:#B 7Nendstream endobj 533 0 obj << /Filter /FlateDecode /Length 460 >> stream x]n0{=$=q#H:2TX'"o9Eiw<=(K~zנ:}1noy,)_\#.~Rp<仂<ć\ء'ιʇ@,ʇ*"p@0,8d x&Y.KCNDTbhY^h iTf4GtaGQ@'$(1sIQb$4SLu.aIcw1uXĪ} &VU#.`bՈ &&#SfK1ִ_R ۳}ÌMs60 Ӻ5L f\(uQȎr*$h( QF) t t⿏6?i(MwMwWhʿ_wFPNendstream endobj 534 0 obj << /Filter /FlateDecode /Length 275 >> stream x3337W0P0Q52U03Q05QH1230!U`jiT01L,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-3GHBF`@ yK:rA{c݊1hVƱGl?!3>{~s/*ґrGF-_eGb-Ė ;"30rz*rcendstream endobj 535 0 obj << /Filter /FlateDecode /Length 216 >> stream x3433R0P0bCsSC.=Cɹ\@`Q2 u*ɓKW4K?KK)Yq˥{+esJsAz<]rfy8Oل= 9[>;5z5ܓUo_]]_?8!pB L \ \ `bendstream endobj 536 0 obj << /Filter /FlateDecode /Length 222 >> stream x331V0P0b3sScC.=C a\B3 Paĺ@@`naiRɥPRTʥTϥT̥`ȥ 4;KM V8qy(1H":Gw˾mn{]uen]m}}/{~{2RKj_9 /S! M>endstream endobj 537 0 obj << /Filter /FlateDecode /Length 233 >> stream x036T0P0b #J123!U`nn2LXɓKW4K?KK)YK%hx,`cﭠ q)+jtQ_mṅS4?O87g7} ')@UK~b>R[8@fendstream endobj 538 0 obj << /Filter /FlateDecode /Length 197 >> stream x34030W0P0Q5T4W0RH1230 !U`idT02LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQPe^Cvڭw.-t;e7wEibbk37.WO@. anendstream endobj 539 0 obj << /Filter /FlateDecode /Length 238 >> stream x]1n0 EwB7R\%Cd/iWyY ҄zL2wkendstream endobj 540 0 obj << /Filter /FlateDecode /Length 208 >> stream x313T0P0R5P01R06SH1230!U`liT052,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[TtצǞ{]]w_uUlQx['+&ڵkX\=Ivendstream endobj 541 0 obj << /Filter /FlateDecode /Length 189 >> stream x313T0P04QеP06W0PH1230!U`ddT033`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmӡҵKAk__}OO}o6|"AS! HCendstream endobj 542 0 obj << /Filter /FlateDecode /Length 188 >> stream x313T0P0WеP06P0PH1230 !U`ddT032́X,ɥPRTʥTȥTť`ȥ 44KM V8qy(8 x|0vuq[/Р.WO@.lD:endstream endobj 543 0 obj << /Filter /FlateDecode /Length 184 >> stream x313T0P0bCSCC.=C a\Bc  Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[jʎ@Ol/Az>59S! fA[endstream endobj 544 0 obj << /Filter /FlateDecode /Length 166 >> stream x313T0P0b#SCC.=C a\BcK Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[?:.iU Pe> stream x]An0E7 )MɢU`E "d@!=oxrMe_aL"DqƔc\wosg 2l%h-^seiMSQi8[{ =FpCըl@I5КM͆M %ȲgY؀jmY-6| PIv/"PKVsYF6T{6< P6Q@ TO&XGA(2Ww։sY$6VNkL7y5@ endstream endobj 546 0 obj << /Filter /FlateDecode /Length 177 >> stream x3634R0P0b#KsC.=C a\B# P% 'O.}O_T.pz.}b.}gC.}hٱ\nn@n.P9?47ΎEAm 'o]`TVRpT7qCB Bendstream endobj 547 0 obj << /Filter /FlateDecode /Length 157 >> stream x3634R0P0bc3KC.=C a\B#S Paĺ@FF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P")OYGm\=HB{endstream endobj 548 0 obj << /Filter /FlateDecode /Length 182 >> stream x3332Q0Pa3 ebeg`!U`jj2LXɓKW4K?KK)YK%hx,`cﭠ q)+jtQP[$ٮzFዜ*OY!~4gIFendstream endobj 549 0 obj << /Filter /FlateDecode /Length 207 >> stream x3530T0P0V5T05V01SH12!U`biT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8g4 LJBlrU/m_r_~_v鿯Ggo8"v4u¹.WO@.8GPendstream endobj 550 0 obj << /Filter /FlateDecode /Length 212 >> stream x313T0P0Q5T0f )\z@A 1s M &@ <=}JJSÁ = ]r;;66@\9y@-vv\. j XYx [/.kPVmMY9nQ͟|Hg.qg $<`bPrTlCendstream endobj 551 0 obj << /Filter /FlateDecode /Length 186 >> stream x3135S0P0R5T0P03VH1230 !U`ljT032X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[؜׿-ڢ)LO~o[]ML`+#B =Fendstream endobj 552 0 obj << /Filter /FlateDecode /Length 200 >> stream x3332Q0P0bSKsC.=C a\BS3 Paĺ@@`lihRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-D {S\#ۇ&%&}}Y7om[>> stream x0г4T0P0S5T07U0TH123 !U`faT072̀X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[pŃw&Ϧ MhpI(ے6DK[%_7{_WTjOHk_w˶Kcl1&a0DĮmb:r+,8\=Vendstream endobj 554 0 obj << /Filter /FlateDecode /Length 224 >> stream x3531S0P0V5T05QrR @c$r*Ĺ c 549yr{*rr{Uq;8+rD wwvvrllsJsZ<]69hLXd|߭{:N"zEsP_Gauv] w|cR(poPEn Θ20rz*rzFbendstream endobj 555 0 obj << /Filter /FlateDecode /Length 204 >> stream x33T0P0Q5T01W01SH1230 !U`bd*2LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[`#(#Pb߇{50[]ak 6:!Bendstream endobj 556 0 obj << /Filter /FlateDecode /Length 212 >> stream x]A EjҰэ Q/@a0,L 'f^d0s^"kw_j&jw4N l=5NX&ށ u5Zbgc5IRn4I/(MKGRs[M*4J*D$!e5pGL3ęNB1iZx_kendstream endobj 557 0 obj << /Filter /FlateDecode /Length 209 >> stream x313T0P0bSCC.=C a\Bcs Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[OoQn~W֥__5o\~ݭu7j6Փou`aprT#D4endstream endobj 558 0 obj << /Filter /FlateDecode /Length 193 >> stream x313T0P0bcc3C.=C a\BcS Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-i1!/{Y~{~5WEYKw}ͣwevvbbk3+#B 9zendstream endobj 559 0 obj << /Filter /FlateDecode /Length 183 >> stream x313T0P0aSSCC.=C a\B P)ZX8yr{*rUp{s;8+)hٱ\nn@n.P9?47ΎEAmᴌ-_//v 羺~4UO `drTD> stream x313T0P0T5T0P06WH1230!U`bfT01 ,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[[q^C!uϵ398o]~m٥7 c3gDq/αYÖ}b E_7uͬeB[:ͣӮĠ@1Lendstream endobj 561 0 obj << /Filter /FlateDecode /Length 198 >> stream x313T0P0bcSCC.=a\BC Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[$v[__dZ[I?~ׯ___> stream x313T0P0bcKS#C.=C a\BcC Paĺ@憦 5N\ %E\@ \@\N @K4X.}7}gg7 7F[A(㜟SW bg颠pMN>V! \=S> stream x313T0P0b3SCC.=C a\Bc Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[$XUᬯ2կa I_{GWʜyeu`aprTIendstream endobj 564 0 obj << /Filter /FlateDecode /Length 166 >> stream x313T0P0b ebeg`!U`lb2LXɓKW4K?KK)YHD͎wwvvrllt29y@-vv\. jD/qF zCB q=Aendstream endobj 565 0 obj << /Filter /FlateDecode /Length 197 >> stream x313T0CSc3C.=CU`bbQhlfɓKW4K?KK)YK%hr,`cﭠ q)+jtQP[b󊳩&v\:ZWjZ HA12[]2ԁS! Gendstream endobj 566 0 obj << /Filter /FlateDecode /Length 187 >> stream x313T0P0bcc3C.=a\BC PH'BIQi*~8P=P1S 4;KM V8qy(-֐E>Nׯ/o0_PQԷj`hrT @endstream endobj 567 0 obj << /Filter /FlateDecode /Length 194 >> stream x313T0P0bcc3C.=C a\BcS Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-عCCCU&}i_ve۲;)Ztö 20rz*r];endstream endobj 568 0 obj << /Filter /FlateDecode /Length 214 >> stream x313T0P5R5P01Q06SH1230 !U`bjT051i`Y'O.}O_T.pR.}:.}gC.}h\nn@n7P;s~Nin^1PB.3N}$3>/_~;eyEܱaǿ_, \ \>J`endstream endobj 569 0 obj << /Filter /FlateDecode /Length 184 >> stream x313T0P0b3c3C.=C a\Bc Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-ba]-n>.zҿzU_\=8endstream endobj 570 0 obj << /Filter /FlateDecode /Length 207 >> stream x313T0P0b#c3C.=C a\BcS Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-lr|`?uznmrO8.+ͰC1q+8zjwlj`hrT)@endstream endobj 571 0 obj << /Filter /FlateDecode /Length 185 >> stream x313T0Pb#3C.=C a\Bcc Paĺ@@`ajfRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-<,}YAY;tׇ9s£#8\= ~> stream x313T0P0bcc3C.=C a\BcS Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(XU);ڬ-C_;QvxQ.WO@.ɬ?endstream endobj 573 0 obj << /Filter /FlateDecode /Length 176 >> stream x313T0Pb c3C.=C a\BcK Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(xUm?Ἵ/w7B Л=endstream endobj 574 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0b c3C.=C a\B Paĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(xkf IپU/OVQzL׿:5p04pz*r8Dendstream endobj 575 0 obj << /Filter /FlateDecode /Length 199 >> stream x313T0P0b3c3C.=C a\B# Pa ĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-)5{5ךn{_e]{UW^_fz&.WO@.X@*endstream endobj 576 0 obj << /Filter /FlateDecode /Length 202 >> stream x313T0P0T5P0P06SH1230!U`bfT052 ,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[45*OM7e[`]G_[7eg-[^.Л*GS! /Dendstream endobj 577 0 obj << /Filter /FlateDecode /Length 166 >> stream x313T0P04V01T01S05TH1230!U`ldT040&@&HɓKW4K?KK)YK%hj,`cﭠ q)+jtQP[4=qo" >&̈eap`rT? (Cendstream endobj 578 0 obj << /Filter /FlateDecode /Length 168 >> stream x313T0P04S02W01V05RH1230!U`dfT025F`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAmぇ_^d/?ST.WO@._2endstream endobj 579 0 obj << /Filter /FlateDecode /Length 200 >> stream x313T0P0bsSCC.=C a\B Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[ذoVU_[}Bj  _?~+ʷt!W5VGjendstream endobj 580 0 obj << /Filter /FlateDecode /Length 189 >> stream x313T0P0PеP01S0PH1230!U`dnT033 (ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-XyХ QQ eˮko u߾}}} \ \A4endstream endobj 581 0 obj << /Filter /FlateDecode /Length 192 >> stream x313T0P0SеP06U0PH1230 !U`daT032@X$sU()*M*w pV0w˥{+esJsZ<]0?|{۷ow߮µUזl : 6L њ"NCendstream endobj 582 0 obj << /Filter /FlateDecode /Length 167 >> stream x313T0P04V54R06T04TH1230 !U`hnT026i@m`Y'O.}O_T.pR.}:.}gC.}h\nn@n7P;s~Nin^1Pڢ/_NunɆi!, \ \!,endstream endobj 583 0 obj << /Filter /FlateDecode /Length 116 >> stream x313T0P0"3#CC.=C(ɹ\ F`ASafsU()*M*P0w pV0wPaS! G(*endstream endobj 584 0 obj << /Filter /FlateDecode /Length 119 >> stream x313T0P04F )\z@>ɹ\@I ah$t*ɓKW4K?KL:8+)h\. ? vB z&Bendstream endobj 585 0 obj << /Filter /FlateDecode /Length 167 >> stream x313T0P0Q5W0P0PH1230 !U`blT032LX,ɥPRTʥTȥTť`ȥ 44KM V8qy(-\o/3M aLz bL ʚ,@qendstream endobj 586 0 obj << /Filter /FlateDecode /Length 204 >> stream x313T0PP5T01U05RH1230 !U`lfT052,X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8CB[*//;]/d/Ai޹[Ixwݺ E(endstream endobj 587 0 obj << /Filter /FlateDecode /Length 182 >> stream x313T0P04 F )\z 8#9P,Te$t* - MA<=}JJSÁ:=ʹ ]r;;66 @ܼb;;.O /zݮEV[/:}f#A;Z e@endstream endobj 588 0 obj << /Filter /FlateDecode /Length 215 >> stream x313T0P0S5T01U05RH1230 !U`laT052̀X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[0!{˗/ /f+~i˖M҂z<~=?uzve5sHMl&#}D> stream x313T0P04T5T0P05RH1230!U`lfT056 (ɥPRTʥTɥTƥ`ȥ 45KM w)+jtQP۹!Ĥv>87{Fﵺ.]븭 u__vCB D@aendstream endobj 590 0 obj << /Filter /FlateDecode /Length 169 >> stream x313T0P04 f )\z@>ɹ\ `A* TFfF 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PڢCqmͣS@_C_h04ppz*rA0endstream endobj 591 0 obj << /Filter /FlateDecode /Length 189 >> stream x313T0PT0Q01C.=Cɹ\ f`A# M RN\ %E\@u\@E\N \.@3c݀}o]s~Nin^1Pڂkb-b"3tT["YAQ\EY>\͟|÷ N5?, \ \<7sendstream endobj 592 0 obj << /Filter /FlateDecode /Length 151 >> stream x313T0P0S04S01S06QH1230 !U`liT02̀D<=}JJSÁ = ]r;;66 @ܼb;;.OM]Ϭ \ \B'endstream endobj 593 0 obj << /Filter /FlateDecode /Length 194 >> stream x313T0P0S0Q01V01SH1230!U`lfT012@'BIQi*~8PPS!K4X.}7}gg7 7F[A(㜟SW bg颠ha߾}ccۇ{W97<|͡B7– M[DV:h04ppz*r*;-endstream endobj 594 0 obj << /Filter /FlateDecode /Length 193 >> stream x313T0P0bKSCC.=C a\B3 Paĺ@@@%N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[k^ᏳJZ?Fq>> \ \2%@endstream endobj 595 0 obj << /Filter /FlateDecode /Length 211 >> stream x313T0P0W5T01S05RH1230 !U`laT052́X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8L6TAslƅ/U/MQ?^"~/ [am7m8ƠAS! 3Eendstream endobj 596 0 obj << /Filter /FlateDecode /Length 217 >> stream x313T0P0bS 2TH1230H*T017 UF@ T```ha`b RɥPRTʥTϥT̥\fr;;66 @ܼb;;.OE"L&Mj8/[Wh߮z}K^{ll[rUmB \RMendstream endobj 597 0 obj << /Filter /FlateDecode /Length 174 >> stream x313T0PaS 2TH1230H*T010 U@ T```ha`b RɥPRTʥTϥT̥\fr;;66 @ܼb;;.O]?o'dz5?Mv}__&-`bPrT?[endstream endobj 598 0 obj << /Filter /FlateDecode /Length 163 >> stream x313T0P04S5W05P0PH1230!U`llT035`I'O.}O_T.pJ.}2.}gC.}h\nn@n.P9?47ΎEAma__/\POS/&.WO@.@endstream endobj 599 0 obj << /Filter /FlateDecode /Length 168 >> stream x313T0P0R5W06S0PH1230 !U`llT032X,ɥPRTʥTȥTť`ȥ 44KM V8qy(- }__o/',`bPrT8AYendstream endobj 600 0 obj << /Filter /FlateDecode /Length 202 >> stream x313T0P0bc3C.=C a\Bcs Pº@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-H–}#?߾;' O?Ĩ^R+B.mؔzcʫy8L\=T@endstream endobj 601 0 obj << /Filter /FlateDecode /Length 210 >> stream x313T0PbSCC.=C a\BcS Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP`>׷U__C ~0?T7ү}׵U~ſ\Pæ@! :08pz*rJ:endstream endobj 602 0 obj << /Filter /FlateDecode /Length 188 >> stream x313T0Pac3C.=C a\Bc Pa ĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-zcZ5ql{rm{[o$v:̝pЁS! g7endstream endobj 603 0 obj << /Filter /FlateDecode /Length 428 >> stream x]n0E{}231L4)6Xld TDdؿϽ$8!O//rKy~^i}/?e펡r"-~[1΍_Ǐz#ۤruKv`l]]>f篡!X5`2Z4Lēhb-Z4b8[Pd xB| y88]#Q#B!FFBtD$X p 9'hgjdl}#Wx + U`3 ($J[')> stream xKoKn=@$ %y,[ )tnVʁhH)$ί̓d E3|9M m*o+vmW_(LlnSfЄ2%P9e6Y7+*8g5lCgCy}ڗC}hÉUpk!]>8S.e A?Y7X]C Rr e;' hs*xj:$_ l4T 'ͩӌUA񰠔4v9tGJi/I7Ϋ CI{n8 H>TW ZIGaLXJ2$ZgU`RNK6-9..vմ^x+ꙧ܃ϯ</jrƍ"䱰E,bfM/ؘzxd>-. \S~)\EPpOhf't\+ݡH<9x4^4SP=IHHn *cG? 1xd"lqB*2~ J}:>| r(}TIŘ7՛HC jhyҬ|_}n7,7&ϥ7pQǀՂ`Eq:p7)F/Ꜽ9 + JrF0}@ %ڳ|BCD;Bt^3Jc=us^(GK 엃q UV[LiU#QTx<:)%/+a9'A^SHǦ!Yi[.t`yr/4'9p$&flHhXNV?ȄRF4G.\191aDr!O,-*$$5)Jh0͂iMwf%&ݹ7?ጡv-*gN0u B_`zdho]S`,K D(dP.b"t \8`M=2HDf4 %LB }_atrS&μ2Ns"2jb?mݖCk{< IhCm>G` cΌR7Dz=̾)*;@*.AkC{ 0 GB1j2L ?1SkLƴ(_8H|r!]kx >yY|%2G %e2á@C*bpO0 H&"^VN+Y .d&097{k4s J1"Ș{$cy]F8H+mpax"]wI׭ vU60<Îvz*q+Æ*ȫ[S&gވڐTN2w9WxwI*Men!\G3%wvېHe~)4fW x̩oVp>endstream endobj 605 0 obj << /Filter /FlateDecode /Length 255 >> stream x333P0P0U54S02,R @c$r*M 2K:yr{*rUr{q;8+rDMwwvvrllڹsJsZ<]ܙ#}\C*߇jr|_\u_@:ohG[љfӗ]tjѶwbGБaT}z}K7vL \ \=a=endstream endobj 606 0 obj << /Filter /FlateDecode /Length 459 >> stream x]N@s?`L"&{Y{{@pAYVZn^>X꡼-kՆzZ79[uomƁ2ԿӋŤW4^cTɗyUY>1G[Rp> stream x313T0P0b3c3C.=C a\B# Pa ĺ@@`dfaRɥPRTʥTϥT̥`ȥ 4;KM V8qy(-Zkއlٲ]%{^/}7}R, \ \Z9endstream endobj 608 0 obj << /Filter /FlateDecode /Length 196 >> stream x313T0P0W5T01U05RH1230 !U`lnT052@]C'BIQi*~8P!PS!K4X.}7}gg7 7FK9?47ΎEAmas#󡪪}M˗fg=\2H,Wkf-zhۮl\ L\ \HFendstream endobj 609 0 obj << /Filter /FlateDecode /Length 418 >> stream x];N@Ds7X|AB@BB1r2Knnsy~^iϽTߖ;~ZYǭ;>V{ sE:I<Տm,u׷ ̳uu}J8?CC jh-2d╵h֢h<'kZ4Fl-0Br#,  hLBtD 55x" r %31ToƪW(w\Jp79X/~̫d NyFVBgY+tT@ «T@ ǁAitȂ | qVkr *%k"%E!.9p# od<\ 0x_6 [}^g/kiY=}f۾endstream endobj 610 0 obj << /Filter /FlateDecode /Length 213 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[xBCyGk&wQ/6ErM4s۷?_k[3kuEnؐpЁS! G3F$endstream endobj 611 0 obj << /Filter /FlateDecode /Length 192 >> stream x313T0P0b#S#C.=C a\BcK Pº@憦 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P ?^*Wӗ_ĉ-R s.WO@.*EGendstream endobj 612 0 obj << /Filter /FlateDecode /Length 200 >> stream x313T0P0Q5T01P05TH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[`& M/U^?/zUKoEgߊf &pЁS! Ebendstream endobj 613 0 obj << /Filter /FlateDecode /Length 217 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[8cÇy—/ZpU7(>)xEN{Al/wս^{}jĖmI۶m8tAS! 5I>endstream endobj 614 0 obj << /Filter /FlateDecode /Length 228 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[0C!~U_3Mp("Ehbgpl_\k7|]ݲ#L;iۆCٸ\=LTendstream endobj 615 0 obj << /Filter /FlateDecode /Length 217 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[0!H_w7˝߫~6wma֍7qmu-/}[řc0]tö 20rz*r-Fpendstream endobj 616 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0b#S#C.=C a\BcK Pº@憦 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pڂb/_iܗ7/WZYeoF|ĠLendstream endobj 617 0 obj << /Filter /FlateDecode /Length 317 >> stream x]1n@E{N ڒ5ӸH%^€0.r)R|2-N8yLּnt_lnHLvΊk;̖7~kV|4|ۊmn-mٱ,[ U\ǧa[bx-1B#OUS(A`tkeF`(/Q`rQEʭЀU k`Ea$jHhx+ %@(5PLS& Gzenql$rO#7ҹsNρ|Y,6!>aK4OWH ٤endstream endobj 618 0 obj << /Filter /FlateDecode /Length 206 >> stream x3534T0P0V5T0P01SH123 !U`bbT012X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[x,勇{|_/}u?n׿ߩWai'yۮn&pP0"1u9.WO@.|Aendstream endobj 619 0 obj << /Filter /FlateDecode /Length 248 >> stream x3530T0P0V52T05Q01UH12!U`j`T032,ɥPRTʥTɥTƥ`ȥ 45KM V8qy(-`.ap!ƹ,zkn] po[]0Ł~? ^)<~zNMȿ}۔[o{6l:,kX\=.Z_endstream endobj 620 0 obj << /Filter /FlateDecode /Length 180 >> stream x3137U0P0bcSC.=C a\BcK Pa ĺ@f 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P"ɮdy՗4Պ}}y\30rz*r:endstream endobj 621 0 obj << /Filter /FlateDecode /Length 135 >> stream x3636Q0P0T0P06T02WH1230 !U`diTц larU()*MPN \.@#c݀}o]s~Nin^1P.WO@.B endstream endobj 622 0 obj << /Filter /FlateDecode /Length 189 >> stream x03T0P0b 3 C.=C a\BsK Paĺ@@`djl RɥPRTʥTϥT̥`ȥ 4;KM V8qy(h1.}r@O3>YC,슎A߿Vlk`hrT:mUendstream endobj 623 0 obj << /Filter /FlateDecode /Length 227 >> stream x035S0P0V5T0Q0PH1230 !U`a`T02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQPh\rpEQH _ٷFaꃦG;',RA`?Po{_:]Ol٦͛Ҕu&.WO@. ]Rendstream endobj 624 0 obj << /Filter /FlateDecode /Length 225 >> stream x]n w71uKdHUy G3{ >xiW]2*ޗG(g,!i+;]tݷ&籺|E1=L1TuyTذ1=zC:j`FC:7і6I-0C`U}S UmSz @!5-?jżrbH "e|ZҺ$!dqendstream endobj 625 0 obj << /Filter /FlateDecode /Length 161 >> stream x]O10 -Pu)K>:vNIZt;ڳR=FIM-P8ZA qcy¤PMǣ\ HyyU8׀A󈢩!j@ڂ#WR4oJXB@in X3+`?Sendstream endobj 626 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 351 >> stream xcd`ab`dddw441H3a!3kc7s7g ~O,Ș__PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*@ܧs JKR|SRR 3s Yto=ww;3\t֜3+-yvГnlsflKk6|SN&ZVͼޥS6-I<< s@endstream endobj 627 0 obj << /Filter /FlateDecode /Length 2492 >> stream xYK۸\rɦJU{xpU7u6^68gDI!= 4JA$4 ̻9Ĝ_g|~3{7u6웟sy+|}= K\H9.9~._+# ˮm!i~b++. /\.o yGºe&7Qμ.f_ǏM y杴g˕z7JmbOȄAPPLRڪz׽<Ͷkƹ=R/:Oɖi\mqP{f.9a)b'cWwmEWj?2G xL^{(_V 麻-5slu%I91N[)+2],śl5b0!1`]ѥ29'λO-mO}״`Ȉ #N#Awi+H*P >}!P"a$ׄs&G<.7?lS>&L $/ֳW3b64nn8wga7{4 [wb̔_VuQ`+%)Èc/!2^1.R6-rqM*>deɔؓ|ACt\8=Ƞ+`` V *[ Ռ;K2aS>>J'danqkeL .BS9bC %ˠH9!ȋI 4j$iQ΄=X |pl,L7>5ĝdf n@8lؾo]"lE²J!In-$xE9΃L*0Drp/.\3t!B,''z7 *6BL"/g!ʋRb$wڇ40Q3`gN:Hx\ Է7PzO8đ ]*XMssd1=.x۔#k{@ !U}٦6W)%DƜzL<3h^ \LiL\BOŮܗBa+56k)b=|#n۩T!s3:@J͙m\F^N8֮1QPo0g=j|A>Dp}`k|%ly;Ff렠LgY=qR̺|ȵƐjMQ g -0 $èNUov-a91z%Oh@\X:d=;ox:s0c^'M3#ƥj_uvR+EVR1!ʐD!DBiȱQɦ܂ɇzdzc qhС}W宋YT 9@4 ` G,ojy}3ۖOǘxCbSPrKSUع@0DcD=8 Z( 0x$}H^zvQ̄G8nȨj*C+$> ;b DX XBhQ'#RYLXSx~t`c&aW:ZNC9. `8{K+%+kX0iy8.X^QK-I +Ԇp2}%$13P_(x5DeTVl]ƃ_USß"]^vJ'vH}6̣RHC؜=OX tIq5) 4Ӟ0R.}@Z' )z Ep5pq_u^(F}F rpmߖm,NXwa bCM0[4 T/= Zsa O dXӣe gAB]aSjE{UCIMO'aW Dž^y&"`ѫ@4NFE{S՗ tTSZ:!KIx.r!rS}E)udVϧn.( sNKdJ|ӄ )$ C. pj6(*> stream x313T0P0S5P01Q06SH1230!U`lnT052̀,ɥPRTʥTɥTƥ`ȥ 45KM jw)+jtQP[sjނYŲ;M~YkǯmڪnŶH,#1G_WquCB hEendstream endobj 629 0 obj << /Filter /FlateDecode /Length 201 >> stream x313T0P0bSS#C.=C a\BcK Pa ĺ@憦 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P)i׿^|zˤK/}٫$/q/mf-xdGendstream endobj 630 0 obj << /Filter /FlateDecode /Length 191 >> stream x313T0P04P5T0C.=C(ɹ\ &`AS#.'BIQi*~8P%PS!K4X.}7}gg7 7FK9?47ΎEAmE!*8l_Kf_w dǯ~+#B "Hvendstream endobj 631 0 obj << /Filter /FlateDecode /Length 382 >> stream x];n0D{B7 6N"A2E*, \Y)Rg;mN4nu3o0No}MqvǴ=H-Usz햯%׸o57b+ҥvwm<qX$}, 'bQ0bQ;b5!( P@""P=E@U_G_ OV}}DB e|C"< %LDW#适=+ f hfY*ee02`Ƣs޵D*/2"zn( ')S@V r-e ]T**ݞp }]^r)2/|UC/ endstream endobj 632 0 obj << /Filter /FlateDecode /Length 164 >> stream x313T0P04U54R0 R @c$r* @PXɓKW4K?KK)YK%hl,`c ΥSW bg颠ᅪ>z:C\ \ \-Cendstream endobj 633 0 obj << /Filter /FlateDecode /Length 191 >> stream x313T0P0U0Q0T01SH1230!U`llT012L,ɥPRTʥTǥTĥ`ȥ 43KM V8qy(- &PںFaôCQ: [6X'>\}{= 덍y< \ \6endstream endobj 634 0 obj << /Filter /FlateDecode /Length 152 >> stream x313T0P0V04S01T06QH1230 !U`lnT02,ɥPRTʥTȥTť`ȥ 44KM V8qy(t}rU)\=R&endstream endobj 635 0 obj << /Filter /FlateDecode /Length 203 >> stream x313T0P0bCSCC.=a\BcK Pº@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[1]U;9?o^ֿ~YY[z߿~އ~xkXiX AHaendstream endobj 636 0 obj << /Filter /FlateDecode /Length 221 >> stream x313T0P0Q5T01P05RH1230 !U`ljT052LX,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[ym^uMqo[V~cAʼnL SH\V(a~~;oYԪk  \=RHendstream endobj 637 0 obj << /Filter /FlateDecode /Length 174 >> stream x313T0P0R5T01R05TH1230 !U`liT052@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[&縷݂_oׁ+8\=WKendstream endobj 638 0 obj << /Filter /FlateDecode /Length 153 >> stream x313T0P04W5W01T0PH1230!U`dlT035 (ɥPRTʥTɥTƥ`ȥ 45KM V8qy(t}U!|ⵙAS! .1endstream endobj 639 0 obj << /Filter /FlateDecode /Length 154 >> stream x313T0P0V5W02W0PH1230 !U`dlT032@]s'BIQi*~8P!PS!K4X.}7}gg7 7F[A(㜟SW bg颠1'W58\=:Mendstream endobj 640 0 obj << /Filter /FlateDecode /Length 389 >> stream x]n0{=$kq#H:2TX'"o"Cy[oq-_m>(uk}mڻiw=ԥVOl8kiluT1m{,Vv| wÜC%q$ιc 1#\)`"Y1d Ę%ѳ,DtUdWEuH G$ š/$ }&/HD$:+KJ0I2 h01%2Zv,e hdno|ICtS|\")8ߘ̴Bl 8.߁T8Ó\qB/QXc\o[=}$ɯendstream endobj 641 0 obj << /Filter /FlateDecode /Length 205 >> stream x3535T0P0bSSsC.=ɹ\ `A* u ɓKW4K?KK)Yq˥{+esJsZ<]O8y=Cpݿc ? _/'\ĠPQYendstream endobj 642 0 obj << /Filter /FlateDecode /Length 508 >> stream x]n0{=$q H  gfdH1|v8'e[q~{|1vIކ<}⁺}xԟCm0c^ksr]m_ĸ|>Q*׾/RzNSq.R!C9L|,rDi69Fr*2BF„X$1 H""El F0 0\ SL21dB!"$HG$ c$BdPF2RfZ\Mƾƾƃ L3q4ӊ9lb}V]\8utlѵI8Qεɞ[tm:ڤsu8:6Aw5]l[C##oVț2fexPF^*$oF^ tӾ/mm]w\wWw꿟sxendstream endobj 643 0 obj << /Filter /FlateDecode /Length 198 >> stream x373P0P0bsC cC.=C a\B33 Paĺ@ 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1PB.ƐOY1'{C |~ ~GE[#EcP`rT6ZGendstream endobj 644 0 obj << /Filter /FlateDecode /Length 204 >> stream x313R0P5W52Q06T0QH1230 !U`lnT040F&`i'O.}O_T.pZ.}B.}gC.}h\nn@n.P9?47ΎEAmᔊ˗5Y 5yk_-iGtD02pz*rBSdendstream endobj 645 0 obj << /Filter /FlateDecode /Length 256 >> stream x3P0P0W5T4R0VH1230 !U`ab0́X,ɥPRTʥN \.@Cc݀}on.}ܼbb;;.OJx-Z%yQචC_Cy@KU/͗۾k7? S&ow{.-_ewmn{5H1Hhat /ap`rTgcendstream endobj 646 0 obj << /Filter /FlateDecode /Length 227 >> stream x373P0P0V5T0T0VH1230 !U`fjT02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[P)+?W , r*޺.ջGf i/8BBq s#B ׆`endstream endobj 647 0 obj << /Filter /FlateDecode /Length 249 >> stream x]n y %J/ݥUӶ `*%laxz?-Wr o˽T3^rbd W_ϣL/w5lMax>`Ak8h9=K F &KjHgVi`}45VR a݁@:A0nЬ:X5`bTi^gv41^"x\_1po *Ki.?uܥ壟endstream endobj 648 0 obj << /Filter /FlateDecode /Length 199 >> stream x3337T0C3CS#C.=U`f`Qhjf - MA*<=}JJSÁʹ=j ]Fr;;66 @ܼb;;.Os~X~tgPxtٟq">y$ڇֆ7qBWm\ݓj8\=Z&endstream endobj 649 0 obj << /Filter /FlateDecode /Length 233 >> stream x3337T0PP5T05Q05VH123 !U`bj*2,X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[$S{EiiMB'2n:AE'794{ cίեmB,WMlmeH"S! yJendstream endobj 650 0 obj << /Filter /FlateDecode /Length 177 >> stream x3337T0P0V5T0P05TH123 !U`jbT052X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[JTnoPGu|WgpS! Iendstream endobj 651 0 obj << /Filter /FlateDecode /Length 172 >> stream x]1 EwN ""tЪj{&bA }I:tlo=zϔ=R0/y $t#i佫L:t|"nzͩ-d9jI\u)hVb nwJ\J\ㇱ\*L5KJW~K"_\Vendstream endobj 652 0 obj << /Filter /FlateDecode /Length 182 >> stream x3530U0P0bS#S C.=C a\B  Pal#C3C 'O.}O_T.pr.}Z.}gC.}hѱ\nn@n.P9?47ΎEAm'^ uu}_?oԈCB PHoendstream endobj 653 0 obj << /Filter /FlateDecode /Length 224 >> stream x37R0P0R5T4W05WH1230 !U`ibT02X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQddr;}ozow6+zhPrO ~^~_7/Ȩj`hrT\Keendstream endobj 654 0 obj << /Filter /FlateDecode /Length 227 >> stream x]n w7H RЪj8'# }]҇mt~=n wTmQxIYOAM |:3ʕ9ୄ5 maZWP%hw40#A[Rg@~YKRjt:ҞMAgE swb%1IHB-[)M_qendstream endobj 655 0 obj << /Filter /FlateDecode /Length 3536 >> stream xZKoY9|ZssOa5:v8`5CI\C&9+gQ{Xӏz|U~^_/ޝ볟8}]ֻś?_aWga _p W-M_~d_[U5U(Ҋ_/sOXNtRZ X| J#,Rw x笿,cmp>LNUq ۪AqJ/W(=k8XÎ4Zs@{;،I>Z:v\ hV+:H-++je yKTQ)\R,xiN~ZBáiP3^]8lMJNTVz+<֨ / mffF=ڨjIy}C$9T}.?KA!%~6'.iIUTt)]RxlV;*Z>臭CӰ/qq! Z#fv1e)},;_M}UG^Р}ʋeoF<;Ӧ;S⮬{I}dKXVӿMeNnMޠ}xC`=22;삐+8ZaV02l\m6 zGk G/5֪ǺɀF0l0@z! J8njMMfvBOL#<5o$1CO!^ I)EG<)lP)"B j>պ>{Zh9뻂'yrG\FxF-C*x0dqrZ'ďuy ozӬQ].WBAV\JL"sD(\ǀVhpcәuݸ N1x㌮|p]g?jJxdo:H`t. i< i~pVE +M+VYD'NrB ^ʤbz\fL=uCۮUNz҈Hv1|McqV: dJ^A$ǷB\ e6o1n)quHNqvI_=t|q,7\dL>ݯmm}f`#0hnpBJ"=on &/<X5lٱ 0 86ߜdz80o> oA0Ѱ#sï襗1?@'Rw@ r lbƷiK_d7f]}㪷IG 8$2(]߁gQmWݓf<9d:]),L .V:/$BkW.| {_6{ `d)ض~}(c1PpU_;^ '!K AzdEW&iYFOX$ތ !mqr7vT 35x>&7ONH8(\v >wMܐWssRM~k2YMo6b~ Q4=Rmztr4l(u*hIW{J8 O[3U}k~?qшч-Vf .-E)iOƦX%ְ1yrbю݋'JJ+2= ̴ &.,rXQ=SҩV16"&AH)Jxmsz\Bc5ɇ~=cJG#leݮ%Hh ]"| "BbAN:2K0 }ƢzP f=qNlvP 19 }"o6t:[4࡭?zKYu:cNH;&zϙvvnC,5.6g?ލSg9-UN*9r:\4L !a `zHhK)b,aTaGq;=M(,!N :? s\LXe !lDab_I_go?x:4݄š5CcM(9Z'Q:L8z8p.ҜY3ыlwq49:Wjڙe|>Z(1T=mƦb9aXo3?^|}nK1$jV!3X?(?) Q," t A=r6簥="!3 O8m@pb Z 1P~[bmk|@)kxb /z'm0gDC^0>˂S@n:ID -| z.FS;ӱq\d\敌"M@g.)4 j7] LC=tN%X܏{ێCvEb-fmV<ɞt>\<<Ԅݤ̃UY} ) j8bԫR&9Pyŝxz,'IocW%58@U}7Qz?H0kAhwlHcLZlVc !!Z/r9e0)$GZ<>#;Z}<&ٜo!cAU0颁~-mЧ:jT/xO.&M.bt_oC4(촦Zendstream endobj 656 0 obj << /Filter /FlateDecode /Length 227 >> stream x]n w71uKdH} G3{>piݹ.WSˣz3^SJː2^O< J:q/wb[jkK{qWS#_I[_GF[ZŤlAR7`}ܔ*ch M%/2)F`H ?jżrbH "e ,uIBrSendstream endobj 657 0 obj << /Filter /FlateDecode /Length 435 >> stream x]N0D$i \8,B?8ʁL=UқLWi[rmuy:rinMyiޜ{iT~?պS_e.1n9w]:/Kj6Z1-$sX.TLOU"md59U*S@d*,p"Ibg䢏D$=u^y2{f"0qG(29;$ 5 #MEߴVldjV$h8: N8:nL;'`:#bNYkSܠ|Lgda3S-&AU$ ڈ㢀7*sDqty2wlr^"R^z)6Gٮz/z|V~~YB7V-@endstream endobj 658 0 obj << /Filter /FlateDecode /Length 185 >> stream x313T0P0b#SCC.=C a\BcK Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[!rՓmuA ?z O5p04pz*rDendstream endobj 659 0 obj << /Filter /FlateDecode /Length 202 >> stream x313T0P0b#SCC.=C a\BcK Paĺ@& %N\ %E\@\@\N @%hv,`cﭠ q)+jtQP[1G"0ےMυݮ\]5 8> stream x]=n0 FwB7,R\%Clrӕt&8+7Tn$ (S!-E^ډ6@h vH9ZR\P4^Su#*KYf'DѾ+IiE ^O1D T& (&-d("~=<,/9st˺EYޜ.2rendstream endobj 661 0 obj << /Filter /FlateDecode /Length 234 >> stream x373P0P0Q5T07P0VH1230 !U`fjT02@X,ɥPRTʥTȥTť`ȥ 44KM w)+jtQP[&@ma?mvқ_p|AK@oߪQgzbK=YnpAS! Uc#endstream endobj 662 0 obj << /Filter /FlateDecode /Length 207 >> stream x033S0P0bs  #C.=C a\Bsc Paĺ@F& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1Pz5@'۳[[[#\?0ȭ B Zendstream endobj 663 0 obj << /Filter /FlateDecode /Length 241 >> stream x340ҳ4S0P0bK  #C.=C a\BKc Paĺ@F& 5N\ %E\@ \@\N \.@c݀}o]s~Nin^1P?MYyٸ/}e/{ه/}Я_U3~}~ A /|86Ġ!hendstream endobj 664 0 obj << /Filter /FlateDecode /Length 215 >> stream x34237W0P0bC#C #C.=Cɹ\ f`Q2 u* -,L@<=}JJSA:=ʹ ]r;;66 @ܼb;;.O5uW?"@ϣG݊wfmaXR )C967wHpzICo\=xAendstream endobj 665 0 obj << /Filter /FlateDecode /Length 192 >> stream x431W0P0b 3 CC.=C a\B  Pa ĺ@@`f`l RɥPRTʥTϥT̥\fr;;66 @ܼb;;.O\j`|Bpm m;=!?vG.WO@.|dXendstream endobj 666 0 obj << /Filter /FlateDecode /Length 252 >> stream x]n y Pʗæi 0U%laXRMm_>ZD5u)6*-q{jןB|P\kBbw8 >1g@0~txYΑN P5: )ϺJnoFV  U=+dsREH-kԑz-C:/D+bTM—p9ӥԵ"_Vendstream endobj 667 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 PXҡUqP(/ СY:ߝ|reA>E0u- -m1,O)x@fw5|s^[+x$E b'Φ2?M%K17MR{;RB|ISendstream endobj 668 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1802 >> stream xTmPSg!$*_%;IvdVQTj[G -H8I$)D "E,VGeZL[(ιuvsg޹}G@9:P@o/ܛ-nibhHBpv< A;&7(@($5-[Qx(*(TJublL"4FThM""56QVxJhV.Y8Fq:=_Ef&AE_>SKM(6Ũ)p֐TUZFV))Eib *?>o0*:j!r$Qٔ3%iS`,kw_8"x8J|vN];'ͰJa#s}c,л^Lw'/8Ϸ'Ǎ˛_"#3cPCy;4<{}pOSCqY+J}Vh6;Z9^u#53;LЛGJfr0\48 ~o]MWF^,J>#rX Dgf0&~mpm[WqY<(Vi>&Ϸ̌+mfL mb|;§iۏ'o޼.J:ٻ7\9֚c$'筒޻;[-s/p~`,W/#puv_Y_ hq L *s3sA~kqK{i/?ѭmTIT 15d43Ÿ]@$ޱWPk]P؃lS63 NU頂mƃɴE_ur!`iIhG0B'44Tno2n| gXDvodfleBX:*\(r&n7\2ZV.oOGBQwi3%Q,V+Jyr589):bj˳1N%^].'s"}(l9d,-җCl[ Ifz`?̝b;Ԗ䌴4k!s߆0 'Q5T7/ % 넇UpzFܧx{nzp, 8}u.9fٕ2`X1R=![jpP:}W0]a#nQ^$:sfbğf0jd-$l柺hc^7YRzt&'Ipǟ%1񴲥wW/eW_(G\(h҈ `j;c˶%CNy|veWm dV z)hq+RUqta^ ={pq"Dcl΂|,l9O_S7}R &/f`cN#qGI. >Gx01GL%f'ġ6 q{a 0MG~4oEa΍B`JJtoʖ},z/yA$ x:pYeE7AtC!<‚}=x,D=BnLE wҁzh̄|$t cw|2^(1#@!.(bɼر.yb +҈)V1SGg8f;.7;ϲV;;](?)!endstream endobj 669 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 1002 >> stream xmLuhnkBn1Q k9I [lWnPڣ=(ԵAt8&;yyyPD(_'7T=O<~X3wc~v݈Eu>w1hZ Y*#*'=xm RGʕjW2BKWi(,}^0s&BnZ& &ORFE5zCSS6\vӷӝ e fʠSjiAfMA^E"2DXK}avL;M}U`Z?MüEh `ߏXyP|})C:ji]J$.( IV ӋԵ }uLgfrcS1" & : qIּm]j n>K@ ۀ<,zL7mp rW +7!uÏ>'^bjPʹaN3p] iY͡> ` 6^266ԑ{e&@ |A(fS\5Q\xqA/endstream endobj 670 0 obj << /Filter /FlateDecode /Length 171 >> stream x]10 E"7,( ]ZUm/eBzP:tlo=~ ቉[G&GZr }Raցo{3YeT! YWUV1${`QER֭b]HJ}*Ø/e#R*,8oVendstream endobj 671 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 485 >> stream xcd`ab`ddds 4T~H3a!O/nn?b ~/#ȘW79(3=DA#YS\GR17(391O7$#57QOL-Tа())///K-/JQ(,PJ-N-*KMQp+QKMU;NL:)槤%ٙ@2rK֤0000110v1v3032zݵ ~Hg>${E0sywS7^s;vKW464VMr--LqbG_S7Ge]MU)ߵ},j%+ڻ+8f̝=ewgտMYK5OڴpJʮrsZ.w.c-cYsOh%н'V{d~mKJu-#Ol%K_[~:={1/`endstream endobj 672 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 929 >> stream xumL[eK{/X ; dK\hB֖\n({.P>̀ɇRqa5ø邉$DN~9?99Os a\T{ 3d[yDbʺYz 赋L-* 8]Flk*bfmWX'[-K!dV)YkϪ({wjiiɩ78YbMǥ&InCV%qT7I:Iv XWMz2zYP G\/EK̄ }TO:Tƣ [Zg9|_ݰ(-tܭh)WX^VeI;'~͔: *o k!c5  1N:Td7&T)Ph-7y 8V < ~CZ!7b65cMM~ƿg޷UUU yicbqYN| 0 |h+|[͘ $Q0HC^%|ܦ {blڥ߳t~uv:]0a")8U;N_EO uGCj853<߼~UOw~n.>? =mޞr8]ֿׄ(FG'nYy_ ?^Q މ#xԐǍ80S4?Jeͤ o;𙩰/5R侟s'}q[ݪj(`< 4fΆUYeXm zW!O,_GSvϤ>1:cvVOo@_endstream endobj 673 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 924 >> stream xu]lEԾ&W}}@m! %R%AJsR݂]ۉ8J\;XAJ  <BH;;?iocX }ڴ}b6|D$۴6@m_=nCQl/aYx|fvm;9lv?n9=s6zn簘=Y nH?81ﳋKNId4F򉓼y/(7nWEzG]qX%0~aaFl6f:c`ϳs+m˪8ى$[e쨰 :h-b3iqr "LϦFibST"p3u<8238ׅ5prY61=\{d2PUbZ~]_s.EzK!vOJ]xtEȅ Vv\KiKjrH4v7wﷆާOendstream endobj 674 0 obj << /Filter /FlateDecode /Length 2690 >> stream x[ˎ ]gMl+~p8dd4^gzqar/g"YbfL!A}snLTk]O˳j VjLP9*-2Tgٷ &_]Կ^oWglaafxWͺFlsWmaX5߮7 {[o˹ T|҇jcc|΅5ݤ|{%~m}Z:[^)|#taVe u̹f/6휏5q4iWr >; ^ ՝eL LD99>x}4զ򺝢l3#.-m*cc%SNj#D&gy?Kz:BU8ŗ.' E? U ε`°ka$EM>Ւlz*svS `z׺@f4+p8XK=Ks>(Ҍ|Qy /\j:KXW)7&Ta7V8ȥ7&'-QGٜ0XO+Ny0XiRʹtNuW! =bh& $L`Cl _o2>vl-+DN순Nu4cN8]Zt֕ۘ<Ax'и$ъR?7A5]Ji^r ürwpAKك) Ap іN iREe3j$:PݖMtr,# x>r-+D*DDi?K~!h8ՊѶeisPϑ3{B(3PeQT]ŜX^I̎9(4F"R0s,"]qIZn8pii t.:KT)-Cw-H_2H1% :"3x[r7aVH9/Ff+K ޴8F7$$7Gxʧ68ya3}/dUI/i$Lj=$bKƱjjKjp :7 Wh3:CQG爛O :%l I(s7QLRX 4\ڠ7kPc %zpyl'M1 uH1^zY|YM=' A+ቹ%)7!ۋfFJ CjѥWkl`moPg'Z-OmwWx5I9[x<)FYyшwN k7wCPѴm#-e0o&&Ko Dz+bb2 :ձ)2ǞwwJgq{q7jrv+#NvғE^qೱ6 r#C{4W9>sQc^LzOɡ*D}!A=SPt#Q0{wũ/˻R66VV6HC߻\h_?iu3NsŴN+Jڗ'v=>l/f!.Tj5~1'>#жsU;^ .[ԢtR_4tKx5vfk["Ƞw n.W.2w&F^8K=(v  X~SnSΔ=330|e0CyObJe:__+mQ`O~7!+&^b|mRo;Re q%rJ0Eu=930^-tN(`P&1߷ `w %^g#Aendstream endobj 675 0 obj << /Filter /FlateDecode /Length 163 >> stream x]O10 @€XҡUqP(/ СY:ߝ|reA>E0u- -m1,O)x@fw5|Ou^[+x$E b'Φ2?M%K17MR{;RB|ISSendstream endobj 676 0 obj << /Filter /FlateDecode /Length 356 >> stream x]n0D|M$KrɡUCrwfIzax|->9|-Ʃ_}~!]SR${[$]bCv~oo1-0!tIĩ|"xS<.u=wߥe Ě қbM#&`KToL@T79(xú#Xݚg5lAPSn5@& ;X!HXIQΛ\!E$ rmFN&YŅQ@UT33+A59TT3*v+-os4<5N gh<.S)Eendstream endobj 677 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 416 >> stream xcd`ab`ddds 4H3a!Tnn?Ąg ~O"ȘW_PYQ`hii`d``ZXX('gT*hdX뗗%i(gd(((%*&s JKR|SRl  ] L,t,Y|﷯3Bw"S8,/i[LƉ}MݒՕ5S*=R~"L?tni.#QV[fffΝR]sw#IS%gϝpvԆ~A^|͜IL^ȱrVuS{Gk_ ~+Og?uB e`endstream endobj 678 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 394 >> stream xcd`ab`dddwu0415H3a!-C5e&ł 002时Lq/,L(QHT04Q020TpM-LNSM,HM,rr3SK*4l2JJ s4u3K2RSRSJsS .ԃP%E )Eyť R2 r+#Y~tɰ.z ݌2,l߯(+f-k,=ۏ?^N=Aeꟴ?v}~V;`[KǭXZVIl%]]] ?͐3.Ɇ)sϾkKe>I<<@endstream endobj 679 0 obj << /Filter /FlateDecode /Subtype /Type1C /Length 621 >> stream xoHqeڋv" - 90('iZfnng0Gj^Ƙԙ )EbH0J̤ A!Bo]yl_=z5larߋUk.V{{`CK`zY 4FOSd c{'PDXH1Md,TP)0DU>}#QJw7&Y[01&o Nendstream endobj 680 0 obj << /Type /XRef /Length 997 /Filter /FlateDecode /DecodeParms << /Columns 5 /Predictor 12 >> /W [ 1 3 1 ] /Info 3 0 R /Root 2 0 R /Size 681 /ID [<4ee63248cf701ccb331fee44e31f7e35>] >> stream xoUUݯ} Z|F J&$8#b€1`c8Rl-m) Gos޹:H/:)ʅ Ϝ/ߜz뎋iR:-> ?6V^xB87 w µnN/T\7Xy>aŜp@؂k6ܫ0; 0|u w<n<Ǣꮉz ͊p5zyg5<ùUWݗIpJ c= lFת17=<هs>x]8 j|*~Yp&X ӈU&칃 'XGmGǾ,eٕŹ!ZpA׾kh=/-g8{}XBYSp .-~z!ҝEw PN«/CS_d ё RwqjN@95M _ᙳ3g ܚJSq g݂jj=f yҟq9<_vHOΖtߣ O^Zޏt6 Qg<vM+K"TL?٧lFO) ?_EfOQS:*]w_+6kݕۯNh|@~6 f u%_qW֎OJl۶ES|o04kW3iM endstream endobj startxref 206925 %%EOF e1071/inst/doc/svmdoc.R0000644000175100001440000001052014533657006014174 0ustar hornikusers### R code from vignette source 'svmdoc.Rnw' ################################################### ### code chunk number 1: svmdoc.Rnw:140-150 ################################################### library(e1071) library(randomForest) data(Glass, package="mlbench") ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- Glass[testindex,] trainset <- Glass[-testindex,] ################################################### ### code chunk number 2: svmdoc.Rnw:155-158 ################################################### ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) ################################################### ### code chunk number 3: svmdoc.Rnw:163-166 ################################################### ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) ################################################### ### code chunk number 4: svmdoc.Rnw:169-174 ################################################### ## compute svm confusion matrix table(pred = svm.pred, true = testset[,10]) ## compute randomForest confusion matrix table(pred = rf.pred, true = testset[,10]) ################################################### ### code chunk number 5: svmdoc.Rnw:179-215 ################################################### library(xtable) rf.acc <- c() sv.acc <- c() rf.kap <- c() sv.kap <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Glass[testindex,]) trainset <- na.omit(Glass[-testindex,]) ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) tab <- classAgreement(table(svm.pred, testset[,10])) sv.acc[i] <- tab$diag sv.kap[i] <- tab$kappa ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) tab <- classAgreement(table(rf.pred, testset[,10])) rf.acc[i] <- tab$diag rf.kap[i] <- tab$kappa } x <- rbind(summary(sv.acc), summary(sv.kap), summary(rf.acc), summary(rf.kap)) rownames <- c() tab <- cbind(rep(c("svm","randomForest"),2), round(x,2)) colnames(tab)[1] <- "method" rownames(tab) <- c("Accuracy","","Kappa"," ") xtable(tab, label = "tab:class", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for classification (10 replications)") ################################################### ### code chunk number 6: svmdoc.Rnw:228-248 ################################################### library(e1071) library(randomForest) data(Ozone, package="mlbench") ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sqrt(crossprod(svm.pred - testset[,3]) / N) ## random Forest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) sqrt(crossprod(rf.pred - testset[,3]) / N) ################################################### ### code chunk number 7: svmdoc.Rnw:251-275 ################################################### rf.res <- c() sv.res <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sv.res[i] <- sqrt(crossprod(svm.pred - testset[,3]) / N) ## randomForest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) rf.res[i] <- sqrt(crossprod(rf.pred - testset[,3]) / N) } xtable(rbind(svm = summary(sv.res), randomForest = summary(rf.res)), label = "tab:reg", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for regression (Root Mean Squared Error, 10 replications)") e1071/inst/doc/svminternals.Rnw0000755000175100001440000001611314173734135016001 0ustar hornikusers\documentclass[a4paper]{article} \usepackage{hyperref, graphicx, color, alltt,a4wide} \usepackage{Sweave} \newcommand{\pkg}[1]{\texttt{#1}} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \begin{document} %\VignetteIndexEntry{svm() internals} %\VignetteDepends{xtable} %\VignetteKeywords{classification, regression, machine learning, benchmarking, support vector machines} %\VignettePackage{e1071} \SweaveOpts{engine=R,eps=FALSE} \setkeys{Gin}{width=0.8\textwidth} \title{\texttt{svm()} internals\\ \large Some technical notes about the \texttt{svm()} in package \pkg{e1071}} \author{by David Meyer\\ FH Technikum Wien, Austria\\ \url{David.Meyer@R-Project.org} } \maketitle \sloppy This document explains how to use the parameters in an object returned by \texttt{svm()} for own prediction functions. \section{Binary Classifier} For class prediction in the binary case, the class of a new data vector $n$ is usually given by \emph{the sign} of \begin{equation} \sum_i{a_i y_i K(x_i, n)} + \rho \end{equation} \noindent where $x_i$ is the $i$-th support vector, $y_i$ the corresponding label, $a_i$ the corresponding coefficiant, and $K$ is the kernel (for example the linear one, i.e. $K(u,v) = u ^{\top} v$). Now, the \texttt{libsvm} library interfaced by the \texttt{svm()} function actually returns $a_i y_i$ as $i$-th coefficiant and the \emph{negative} $\rho$, so in fact uses the formula: \[ \sum_i{\mathrm{coef}_i K(x_i, n)} - \rho \] \noindent where the training examples (=training data) are labeled \{1,-1\} (!). A simplified \textsf{R} function for prediction with linear kernel would be: \begin{smallexample} svmpred <- function (m, newdata, K=crossprod) \{ ## this guy does the computation: pred.one <- function (x) sign(sum(sapply(1:m$tot.nSV, function (j) K(m$SV[j,], x) * m$coefs[j] ) ) - m$rho ) ## this is just for convenience: if (is.vector(newdata)) newdata <- t(as.matrix(x)) sapply (1:nrow(newdata), function (i) pred.one(newdata[i,])) \} \end{smallexample} \noindent where \texttt{pred.one()} does the actual prediction for one new data vector, the remainder is just a convenience for prediction of multiple new examples. It is easy to extend this to other kernels, just replace \texttt{K()} with the appropriate function (see the help page for the formulas used) and supply the additional constants. As we will see in the next section, the multi-class prediction is more complicated, because the coefficiants of the diverse binary SVMs are stored in a compressed format. \section{Multiclass-classifier} To handle $k$ classes, $k>2$, \texttt{svm()} trains all binary subclassifiers (one-against-one-method) and then uses a voting mechanism to determine the actual class. Now, this means $k(k-1)/2$ classifiers, hence in principle $k(k-1)/2$ sets of SVs, coefficiants and rhos. These are stored in a compressed format: \begin{enumerate} \item Only one SV is stored in case it were used by several classifiers. The \texttt{model\$SV-matrix} is ordered by classes, and you find the starting indices by using \texttt{nSV} (number of SVs): \begin{smallexample} start <- c(1, cumsum(model$nSV)) start <- start[-length(start)] \end{smallexample} \texttt{sum(nSV)} equals the total number of (distinct) SVs. \item The coefficients of the SVs are stored in the \texttt{model\$coefs}-matrix, grouped by classes. Because the separating hyperplanes found by the SVM algorithm has SVs on both sides, you will have two sets of coefficients per binary classifier, and e.g., for 3 classes, you could build a \emph{block}-matrix like this for the classifiers $(i, j)$ ($i$,$j$=class numbers): \begin{table}[h] \center \begin{tabular}{|c|c|c|c|} \hline i $\backslash$ j & 0 & 1 & 2 \\\hline 0 & X & set (0, 1)& set (0, 2)\\\hline 1 & set (1, 0) & X & set (1, 2)\\\hline 2 & set (2, 0) & set (2, 1) & X\\\hline \end{tabular} \end{table} \noindent where set(i, j) are the coefficients for the classifier (i,j), lying on the side of class j. Because there are no entries for (i, i), we can save the diagonal and shift up the lower triangular matrix to get \begin{table}[h] \center \begin{tabular}{|c|c|c|c|} \hline i $\backslash$ j & 0 & 1 & 2 \\\hline 0 & set (1,0) & set (0,1) & set (0,2) \\\hline 1 & set (2,0) & set (2,1) & set (1,2) \\\hline \end{tabular} \end{table} \noindent Each set (., j) has length \texttt{nSV[j]}, so of course, there will be some filling 0s in some sets. \texttt{model\$coefs} is the \emph{transposed} of such a matrix, therefore for a data set with, say, 6 classes, you get 6-1=5 columns. The coefficients of (i, j) start at \texttt{model\$coefs[start[i],j]} and those of (j, i) at \texttt{model\$coefs[start[j],i-1]}. \item The $k(k-1)/2$ rhos are just linearly stored in the vector \texttt{model\$rho}. \end{enumerate} \newpage \noindent The following code shows how to use this for prediction: \begin{smallexample} ## Linear Kernel function K <- function(i,j) crossprod(i,j) predsvm <- function(object, newdata) \{ ## compute start-index start <- c(1, cumsum(object$nSV)+1) start <- start[-length(start)] ## compute kernel values kernel <- sapply (1:object$tot.nSV, function (x) K(object$SV[x,], newdata)) ## compute raw prediction for classifier (i,j) predone <- function (i,j) \{ ## ranges for class i and j: ri <- start[i] : (start[i] + object$nSV[i] - 1) rj <- start[j] : (start[j] + object$nSV[j] - 1) ## coefs for (i,j): coef1 <- object$coefs[ri, j-1] coef2 <- object$coefs[rj, i] ## return raw values: crossprod(coef1, kernel[ri]) + crossprod(coef2, kernel[rj]) \} ## compute votes for all classifiers votes <- rep(0,object$nclasses) c <- 0 # rho counter for (i in 1 : (object$nclasses - 1)) for (j in (i + 1) : object$nclasses) if (predone(i,j) > object$rho[c <- c + 1]) votes[i] <- votes[i] + 1 else votes[j] <- votes[j] + 1 ## return winner (index with max. votes) object$levels[which(votes %in% max(votes))[1]] \} \end{smallexample} In case data were scaled prior fitting the model (note that this is the default for \texttt{svm()}, the new data needs to be scaled as well before applying the predition functions, for example using the following code snipped (object is an object returned by \texttt{svm()}, \texttt{newdata} a data frame): \begin{smallexample} if (any(object$scaled)) newdata[,object$scaled] <- scale(newdata[,object$scaled, drop = FALSE], center = object$x.scale$"scaled:center", scale = object$x.scale$"scaled:scale" ) \end{smallexample} \noindent For regression, the response needs to be scaled as well before training, and the predictions need to be scaled back accordingly. \end{document} e1071/inst/doc/svmdoc.Rnw0000644000175100001440000004346314325200144014537 0ustar hornikusers\documentclass[a4paper]{article} \usepackage{hyperref, graphicx, color, alltt} \usepackage{Sweave} \usepackage[round]{natbib} \definecolor{Red}{rgb}{0.7,0,0} \definecolor{Blue}{rgb}{0,0,0.8} \definecolor{hellgrau}{rgb}{0.55,0.55,0.55} \newcommand{\pkg}[1]{\texttt{#1}} \newenvironment{smallexample}{\begin{alltt}\small}{\end{alltt}} \begin{document} %\VignetteIndexEntry{Support Vector Machines---the Interface to libsvm in package e1071} %\VignetteDepends{e1071,randomForest,xtable} %\VignetteKeywords{classification, regression, machine learning, benchmarking, support vector machines} %\VignettePackage{e1071} \SweaveOpts{engine=R,eps=FALSE} \setkeys{Gin}{width=0.8\textwidth} \title{Support Vector Machines \footnote{A smaller version of this article appeared in R-News, Vol.1/3, 9.2001}\\ \large The Interface to \texttt{libsvm} in package \pkg{e1071}} \author{by David Meyer\\ FH Technikum Wien, Austria\\ \url{David.Meyer@R-Project.org} } \maketitle \sloppy ``Hype or Hallelujah?'' is the provocative title used by \cite{svm:bennett+campbell:2000} in an overview of Support Vector Machines (SVM). SVMs are currently a hot topic in the machine learning community, creating a similar enthusiasm at the moment as Artificial Neural Networks used to do before. Far from being a panacea, SVMs yet represent a powerful technique for general (nonlinear) classification, regression and outlier detection with an intuitive model representation. The package \pkg{e1071} offers an interface to the award-winning\footnote{The library won the IJCNN 2001 Challenge by solving two of three problems: the Generalization Ability Challenge (GAC) and the Text Decoding Challenge (TDC). For more information, see: \url{http://www.csie.ntu.edu.tw/~cjlin/papers/ijcnn.ps.gz}.} C++-implementation by Chih-Chung Chang and Chih-Jen Lin, \texttt{libsvm} (current version: 2.6), featuring: \begin{itemize} \item $C$- and $\nu$-classification \item one-class-classification (novelty detection) \item $\epsilon$- and $\nu$-regression \end{itemize} and includes: \begin{itemize} \item linear, polynomial, radial basis function, and sigmoidal kernels \item formula interface \item $k$-fold cross validation \end{itemize} For further implementation details on \texttt{libsvm}, see \cite{svm:chang+lin:2001}. \section*{Basic concept} SVMs were developed by \cite{svm:cortes+vapnik:1995} for binary classification. Their approach may be roughly sketched as follows: \begin{description} \item[Class separation:] basically, we are looking for the optimal separating hyperplane between the two classes by maximizing the \textit{margin} between the classes' closest points (see Figure \ref{fig:svm1})---the points lying on the boundaries are called \textit{support vectors}, and the middle of the margin is our optimal separating hyperplane; \item[Overlapping classes:] data points on the ``wrong'' side of the discriminant margin are weighted down to reduce their influence (\textit{``soft margin''}); \item[Nonlinearity:] when we cannot find a \textit{linear} separator, data points are projected into an (usually) higher-dimensional space where the data points effectively become linearly separable (this projection is realised via \textit{kernel techniques}); \item[Problem solution:] the whole task can be formulated as a quadratic optimization problem which can be solved by known techniques. \end{description} \noindent A program able to perform all these tasks is called a \textit{Support Vector Machine}. \begin{figure}[htbp] \begin{center} \includegraphics[width=8cm]{svm} \caption{Classification (linear separable case)} \label{fig:svm1} \end{center} \end{figure} Several extensions have been developed; the ones currently included in \texttt{libsvm} are: \begin{description} \item[$\nu$-classification:] this model allows for more control over the number of support vectors \cite[see][]{svm:scholkopf+smola+williamson:2000} by specifying an additional parameter $\nu$ which approximates the fraction of support vectors; \item[One-class-classification:] this model tries to find the support of a distribution and thus allows for outlier/novelty detection; \item[Multi-class classification:] basically, SVMs can only solve binary classification problems. To allow for multi-class classification, \texttt{libsvm} uses the \textit{one-against-one} technique by fitting all binary subclassifiers and finding the correct class by a voting mechanism; \item[$\epsilon$-regression:] here, the data points lie \textit{in between} the two borders of the margin which is maximized under suitable conditions to avoid outlier inclusion; \item[$\nu$-regression:] with analogue modifications of the regression model as in the classification case. \end{description} \section*{Usage in R} The R interface to \texttt{libsvm} in package \pkg{e1071}, \texttt{svm()}, was designed to be as intuitive as possible. Models are fitted and new data are predicted as usual, and both the vector/matrix and the formula interface are implemented. As expected for R's statistical functions, the engine tries to be smart about the mode to be chosen, using the dependent variable's type ($y$): if $y$ is a factor, the engine switches to classification mode, otherwise, it behaves as a regression machine; if $y$ is omitted, the engine assumes a novelty detection task. \section*{Examples} In the following two examples, we demonstrate the practical use of \texttt{svm()} along with a comparison to classification and regression forests as implemented in \texttt{randomForest()}. \subsection*{Classification} In this example, we use the glass data from the \href{http://www.ics.uci.edu/mlearn/MLRepository.html}{UCI Repository of Machine Learning Databases} for classification. The task is to predict the type of a glass on basis of its chemical analysis. We start by splitting the data into a train and test set: <<>>= library(e1071) library(randomForest) data(Glass, package="mlbench") ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- Glass[testindex,] trainset <- Glass[-testindex,] @ Both for SVM and randomForest (via \texttt{randomForest()}), we fit the model and predict the test set values: <<>>= ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) @ (The dependent variable, \texttt{Type}, has column number 10. \texttt{cost} is a general penalizing parameter for $C$-classification and \texttt{gamma} is the radial basis function-specific kernel parameter.) <<>>= ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) @ A cross-tabulation of the true versus the predicted values yields: <<>>= ## compute svm confusion matrix table(pred = svm.pred, true = testset[,10]) ## compute randomForest confusion matrix table(pred = rf.pred, true = testset[,10]) @ %% results table <>= library(xtable) rf.acc <- c() sv.acc <- c() rf.kap <- c() sv.kap <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Glass) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Glass[testindex,]) trainset <- na.omit(Glass[-testindex,]) ## svm svm.model <- svm(Type ~ ., data = trainset, cost = 100, gamma = 1) svm.pred <- predict(svm.model, testset[,-10]) tab <- classAgreement(table(svm.pred, testset[,10])) sv.acc[i] <- tab$diag sv.kap[i] <- tab$kappa ## randomForest rf.model <- randomForest(Type ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-10]) tab <- classAgreement(table(rf.pred, testset[,10])) rf.acc[i] <- tab$diag rf.kap[i] <- tab$kappa } x <- rbind(summary(sv.acc), summary(sv.kap), summary(rf.acc), summary(rf.kap)) rownames <- c() tab <- cbind(rep(c("svm","randomForest"),2), round(x,2)) colnames(tab)[1] <- "method" rownames(tab) <- c("Accuracy","","Kappa"," ") xtable(tab, label = "tab:class", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for classification (10 replications)") @ \noindent Finally, we compare the performance of the two methods by computing the respective accuracy rates and the kappa indices (as computed by \texttt{classAgreement()} also contained in package \pkg{e1071}). In Table \ref{tab:class}, we summarize the results of \Sexpr{reps} replications---Support Vector Machines show better results. \subsection*{Non-linear $\epsilon$-Regression} The regression capabilities of SVMs are demonstrated on the ozone data. Again, we split the data into a train and test set. <<>>= library(e1071) library(randomForest) data(Ozone, package="mlbench") ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sqrt(crossprod(svm.pred - testset[,3]) / N) ## random Forest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) sqrt(crossprod(rf.pred - testset[,3]) / N) @ <>= rf.res <- c() sv.res <- c() reps <- 10 for (i in 1:reps) { ## split data into a train and test set index <- 1:nrow(Ozone) N <- trunc(length(index)/3) testindex <- sample(index, N) testset <- na.omit(Ozone[testindex,-3]) trainset <- na.omit(Ozone[-testindex,-3]) ## svm svm.model <- svm(V4 ~ ., data = trainset, cost = 1000, gamma = 0.0001) svm.pred <- predict(svm.model, testset[,-3]) sv.res[i] <- sqrt(crossprod(svm.pred - testset[,3]) / N) ## randomForest rf.model <- randomForest(V4 ~ ., data = trainset) rf.pred <- predict(rf.model, testset[,-3]) rf.res[i] <- sqrt(crossprod(rf.pred - testset[,3]) / N) } xtable(rbind(svm = summary(sv.res), randomForest = summary(rf.res)), label = "tab:reg", caption = "Performance of \\texttt{svm()} and\ \\texttt{randomForest()} for regression (Root Mean Squared Error, 10 replications)") @ \noindent We compare the two methods by the root mean squared error (RMSE)---see Table \ref{tab:reg} for a summary of \Sexpr{reps} replications. Again, as for classification, \texttt{svm()} does a better job than \texttt{randomForest()}. \section*{Elements of the \texttt{svm} object} The function \texttt{svm()} returns an object of class ``\texttt{svm}'', which partly includes the following components: \begin{description} \item[\textbf{\texttt{SV}:}] matrix of support vectors found; \item[\textbf{\texttt{labels}:}] their labels in classification mode; \item[\textbf{\texttt{index}:}] index of the support vectors in the input data (could be used e.g., for their visualization as part of the data set). \end{description} If the cross-classification feature is enabled, the \texttt{svm} object will contain some additional information described below. \section*{Other main features} \begin{description} \item[Class Weighting:] if one wishes to weight the classes differently (e.g., in case of asymmetric class sizes to avoid possibly overproportional influence of bigger classes on the margin), weights may be specified in a vector with named components. In case of two classes A and B, we could use something like: \texttt{m <- svm(x, y, class.weights = c(A = 0.3, B = 0.7))} \item[Cross-classification:] to assess the quality of the training result, we can perform a $k$-fold cross-classification on the training data by setting the parameter \texttt{cross} to $k$ (default: 0). The \texttt{svm} object will then contain some additional values, depending on whether classification or regression is performed. Values for classification: \begin{description} \item[\texttt{accuracies}:] vector of accuracy values for each of the $k$ predictions \item[\texttt{tot.accuracy}:] total accuracy \end{description} Values for regression: \begin{description} \item[\texttt{MSE}:] vector of mean squared errors for each of the $k$ predictions \item[\texttt{tot.MSE}:] total mean squared error \item[\texttt{scorrcoef}:] Squared correlation coefficient (of the predicted and the true values of the dependent variable) \end{description} \end{description} \section*{Tips on practical use} \begin{itemize} \item Note that SVMs may be very sensitive to the proper choice of parameters, so allways check a range of parameter combinations, at least on a reasonable subset of your data. \item For classification tasks, you will most likely use $C$-classification with the RBF kernel (default), because of its good general performance and the few number of parameters (only two: $C$ and $\gamma$). The authors of \pkg{libsvm} suggest to try small and large values for $C$---like 1 to 1000---first, then to decide which are better for the data by cross validation, and finally to try several $\gamma$'s for the better $C$'s. \item However, better results are obtained by using a grid search over all parameters. For this, we recommend to use the \texttt{tune.svm()} function in \pkg{e1071}. \item Be careful with large datasets as training times may increase rather fast. \item Scaling of the data usually drastically improves the results. Therefore, \texttt{svm()} scales the data by default. \end{itemize} \section*{Model Formulations and Kernels} Dual representation of models implemented: \begin{itemize} \item $C$-classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha-\mathbf{e}^\top\alpha \nonumber\\ \mbox{s.t.} &&0\le\alpha_i\le C,~i=1,\ldots,l,\\ &&\mathbf{y}^\top\alpha=0~, \nonumber \end{eqnarray} where $\mathbf{e}$ is the unity vector, $C$ is the upper bound, $\mathbf{Q}$ is an $l$ by $l$ positive semidefinite matrix, $Q_{ij} \equiv y_i y_j K(x_i, x_j)$, and $K(x_i, x_j) \equiv \phi(x_i)^\top\phi(x_j)$ is the kernel. \item $\nu$-classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha \nonumber\\ \mbox{s.t.}&&0\le\alpha_i\le 1/l,~i=1,\ldots,l,\\ &&\mathbf{e}^\top \alpha \ge \nu, \nonumber\\ &&\mathbf{y}^\top\alpha=0~. \nonumber \end{eqnarray} where $\nu \in (0,1]$. \item one-class classification:\\ \begin{eqnarray} \min_\alpha&&\frac{1}{2}\alpha^\top \mathbf{Q} \alpha \nonumber\\ \mbox{s.t.} &&0\le\alpha_i\le 1/(\nu l),~i=1,\ldots,l,\\ &&\mathbf{e}^\top\alpha=1~,\nonumber \end{eqnarray} \item $\epsilon$-regression:\\ \begin{eqnarray} \min_{\alpha, \alpha^*}&&\frac{1}{2}(\alpha-\alpha^*)^\top \mathbf{Q} (\alpha-\alpha^*) + \nonumber\\ &&\epsilon\sum_{i=1}^{l}(\alpha_i+\alpha_i^*) + \sum_{i=1}^{l}y_i(\alpha_i-\alpha_i^*) \nonumber\\ \mbox{s.t.} &&0\le\alpha_i, \alpha_i^*\le C,~i=1,\ldots,l,\\ &&\sum_{i=1}^{l}(\alpha_i-\alpha_i^*)=0~.\nonumber \end{eqnarray} \item $\nu$-regression:\\ \begin{eqnarray} \min_{\alpha, \alpha^*}&&\frac{1}{2}(\alpha-\alpha^*)^\top \mathbf{Q} (\alpha-\alpha^*) + \mathbf{z}^\top(\alpha_i-\alpha_i^*) \nonumber\\ \mbox{s.t.} &&0\le\alpha_i, \alpha_i^*\le C,~i=1,\ldots,l,\\ &&\mathbf{e}^\top(\alpha-\alpha^*)=0\nonumber\\ &&\mathbf{e}^\top(\alpha+\alpha^*)=C\nu~.\nonumber \end{eqnarray} \end{itemize} \noindent Available kernels:\\ \\ \noindent \begin{table}[h] \centering \begin{tabular}{|l|l|l|} \hline kernel & formula & parameters \\ \hline \hline linear & $\bf u^\top v$& (none) \\ polynomial & $(\gamma \mathbf{u^\top v}+c_0)^d$ & $\gamma, d, c_0$\\ radial basis fct. & $\exp\{-\gamma|\mathbf{u-v}|^2\}$&$\gamma$\\ sigmoid & $\tanh\{\gamma \mathbf{u^\top v}+c_0\}$ &$\gamma, c_0$\\ \hline \end{tabular} \end{table} \section*{Conclusion} We hope that \texttt{svm} provides an easy-to-use interface to the world of SVMs, which nowadays have become a popular technique in flexible modelling. There are some drawbacks, though: SVMs scale rather badly with the data size due to the quadratic optimization algorithm and the kernel transformation. Furthermore, the correct choice of kernel parameters is crucial for obtaining good results, which practically means that an extensive search must be conducted on the parameter space before results can be trusted, and this often complicates the task (the authors of \texttt{libsvm} currently conduct some work on methods of efficient automatic parameter selection). Finally, the current implementation is optimized for the radial basis function kernel only, which clearly might be suboptimal for your data. \begin{thebibliography}{5} \bibitem[Bennett \& Campbell(2000)]{svm:bennett+campbell:2000} Bennett, K.~P. \& Campbell, C. (2000). \newblock Support vector machines: Hype or hallelujah? \newblock \emph{SIGKDD Explorations}, \textbf{2}(2). \newblock \url{http://www.acm.org/sigs/sigkdd/explorations/issue2-2/bennett.pdf}. \bibitem[Chang \& Lin(2001)]{svm:chang+lin:2001} Chang, C.-C. \& Lin, C.-J. (2001). \newblock {LIBSVM}: a library for support vector machines. \newblock Software available at \url{http://www.csie.ntu.edu.tw/~cjlin/libsvm}, detailed documentation (algorithms, formulae, \dots) can be found in \url{http://www.csie.ntu.edu.tw/~cjlin/papers/libsvm.ps.gz} \bibitem[Cortes \& Vapnik(1995)]{svm:cortes+vapnik:1995} Cortes, C. \& Vapnik, V. (1995). \newblock Support-vector network. \newblock \emph{Machine Learning}, \textbf{20}, 1--25. \bibitem[Sch\"olkopf et~al.(2000)Sch\"olkopf, Smola, Williamson, \& Bartlett]{svm:scholkopf+smola+williamson:2000} Sch\"olkopf, B., Smola, A., Williamson, R.~C., \& Bartlett, P. (2000). \newblock New support vector algorithms. \newblock \emph{Neural Computation}, \textbf{12}, 1207--1245. \bibitem[Vapnik(1998)]{svm:vapnik:1998} Vapnik, V. (1998). \newblock \emph{Statistical learning theory}. \newblock New York: Wiley. \end{thebibliography} \end{document} e1071/inst/NEWS.Rd0000644000175100001440000004302314533652463013062 0ustar hornikusers\name{NEWS} \title{News for Package \pkg{e1071}} \newcommand{\cpkg}{\href{https://CRAN.R-project.org/package=#1}{\pkg{#1}}} \section{Changes in version 1.7-14}{ \itemize{ \item fix incomplete arguments to avoid partial matches \item fix small bug in svm.cpp (\code{Rprintf()} wrongly called) \item fix \code{predict.gknn()} and \code{predict.svn()} to allow for \code{newdata} argument with character variables instead of factors (levels are taken from original data). } } \section{Changes in version 1.7-13}{ \itemize{\item add ORCID ids} } \section{Changes in version 1.7-12}{ \itemize{\item add \code{tune.gknn()} wrapper} } \section{Changes in version 1.7-11}{ \itemize{\item cosmetic changes} } \section{Changes in version 1.7-10}{ \itemize{ \item small fix in \code{coef.svm} for sparse data } } \section{Changes in version 1.7-9}{ \itemize{ \item Remove configure code testing for gcc 2.96. } } \section{Changes in version 1.7-8}{ \itemize{ \item Bugfixes in \code{gknn()}: wrong behavior in case of tied k-nearest neighbors (for \code{use_all=TRUE}), and also in case of an overall class tie. } } \section{Changes in version 1.7-7}{ \itemize{ \item Bugfix in examples of \code{cshell()} } } \section{Changes in version 1.7-6}{ \itemize{ \item Bugfix in \code{scale_data_frame()} - now calls \code{scale()} if x is not a data frame. } } \section{Changes in version 1.7-5}{ \itemize{ \item NaiveBayes: better handling od character and logical features \item Added: \code{gknn()} for generalized k-Nearest Neighbours (using arbitrary proximity measures) \item Added: \code{scale_data_frame()} for scaling the numeric columns of a data frame. } } \section{Changes in version 1.7-4}{ \itemize{ \item Bug fix: "inverse" argument for class.weights argument in \code{svm.default()} did not work } } \section{Changes in version 1.7-2}{ \itemize{ \item Change license to GPL-2 OR GPL-3 \item add coef() method for SVMs with linear kernel } } \section{Changes in version 1.7-1}{ \itemize{ \item add warning in \code{predict.naiveBayes()} if the variable type (numeric/factor) does not match for training and new data. \item Fix bug in tune when parameter space is sampled \item Fix formula interface for NaiveBayes to account for variable removal } } \section{Changes in version 1.7-0}{ \itemize{ \item Bug fix in \code{lca()} \item The \code{class.weights} argument of \code{svm()} now accepts \code{"inverse"}, setting the weights inversely proportional to the class distribution \item \code{predict.naiveBayes} now fixes the factor levels of \code{newdata} to be identical with the training data. \item{libsvm updated to version 3.23} } } \section{Changes in version 1.6-8}{ \itemize{ \item add and use native symbols for C-code \item \code{naiveBayes()} now supports logical variables } } \section{Changes in version 1.6-7}{ \itemize{ \item fix some bug in handling weights in \code{svm.default()} } } \section{Changes in version 1.6-6}{ \itemize{ \item fix numeric issue in \code{classAgreement()} \item add functions from recommended packages to NAMESPACE \item fix bug in svm.default (incorrect handling of subset= argument) \item fix bug in predict.svm (new data with NA in response got removed) \item residuals are now correctly computed for regression in case of scaled data } } \section{Changes in version 1.6-5}{ \itemize{ \item \code{hamming.distance()} no longer converts input to binary \item \code{tune()} now uses \code{mean()} to aggregate error measures from cross-fold replications } } \section{Changes in version 1.6-4}{ \itemize{ \item remove library("SparseM") statements in code, use namespace semantics instead \item Fix memory leak and uninitialized read error in \code{write.svm()} \item add warning in \code{predict.svm()} if probabilities should be predicted, but the model was not trained with \code{probability = TRUE} \item add \code{eps} to laplace smoothing in \code{predict.naiveBayes()} to account for close-zero probabilities also. \item use R's random number generator for cross-validation and probability computation instead of the system one. } } \section{Changes in version 1.6-3}{ \itemize{ \item remove require() statements and dependency on stats } } \section{Changes in version 1.6-2}{ \itemize{ \item vignettes moved to \code{vignettes} folder. \item libsvm upgrade to version 3.17, getting rid of stdout and stderr } } \section{Changes in version 1.6-1}{ \itemize{ \item \code{write.matrix.csr()} now accepts a \code{fac} argument similar to \code{read.matrix.csr()}, writing factor levels instead of the numeric codes. \item \code{naiveBayes()} uses a numerically more stable formula for calculating the a-posterior probabilities. \item \code{predict.naiveBayes()} now accepts data with predictors in an order different from the training data, and also ignores variables not in the model (especially the response variable). \item \code{svm()} checks whether parameters which are passed to the C-code are set to NULL to avoid segfaults. } } \section{Changes in version 1.6}{ \itemize{ \item bug fix in tune with sparse matrices \item version bump of libsvm to 3.1 \item Fixed partial argument matching in several places \item NEWS file changed to .Rd format and moved to \file{inst/} } } \section{Changes in version 1.5-28}{ \itemize{ \item bug fix in svm cross validation } } \section{Changes in version 1.5-27}{ \itemize{ \item \code{svm()} now accepts to set the random seed for libsvm. } } \section{Changes in version 1.5-26}{ \itemize{ \item \code{tune()} now allows user-specified error functionals. } } \section{Changes in version 1.5-25}{ \itemize{ \item add auto-coercion from Matrix and simple_triplet_matrix objects to \code{predict.svm()} \item Bug fix in \code{tune.svm()}: when a data frame was provided as validation sample, the response variable was not correctly extracted } } \section{Changes in version 1.5-24}{ \itemize{ \item Cosmetics: use \code{sQuote()} instead of hard-coded quotes in warnings and error messages in several places \item Bug fix in labeling of decision values \item add \code{decision.values} of fitted values to a svm object } } \section{Changes in version 1.5-23}{ \itemize{ \item Bug fix in \code{svm()}: Error messages returned by the C function have not been correctly handled, causing segfaults. } } \section{Changes in version 1.5-22}{ \itemize{ \item minor fix } } \section{Changes in version 1.5-21}{ \itemize{ \item Allow sparse_triplet_matrix objects for \code{svm()} } } \section{Changes in version 1.5-20}{ \itemize{ \item More flexible interface to \code{naiveBayes()} \item Fix bugs in docs for \code{kurtosis()} } } \section{Changes in version 1.5-19}{ \itemize{ \item Fix bugs in \code{read.matrix.csr()} and \code{write.matrix.csr()} \item Allow Matrix objects for \code{svm()} \item Version bump of libsvm to 2.88 } } \section{Changes in version 1.5-18}{ \itemize{ \item Improve \file{DESCRIPTION} install metadata } } \section{Changes in version 1.5-17}{ \itemize{ \item \code{tune()} now also returns a dispersion measure of all training samples. \item Bootstrap is done \emph{with} replacement. \item \code{tune.svm()} now also accepts the \code{epsilon} parameter. } } \section{Changes in version 1.5-16}{ \itemize{ \item \code{write.svm()} now also stores the scaling information for the dependent variable. \item data sets Glass, HouseVotes84, and Ozone removed (are in package \cpkg{mlbench}) \item merged help pages for \code{naiveBayes()} and \code{predict.naiveBayes()} } } \section{Changes in version 1.5-15}{ \itemize{ \item Bug in \file{NAMESPACE} file fixed (conditional import from \pkg{utils} failed in R 2.3.1) } } \section{Changes in version 1.5-14}{ \itemize{ \item \code{predict.naiveBayes()} sped up \item Bug fix in \code{plot.svm()} (error in case of training categories without predictions) \item \pkg{methods} now added to \samp{Suggests}, and \pkg{grDevices} to \samp{Imports} } } \section{Changes in version 1.5-13}{ \itemize{ \item Bug fix: sparse handling was broken since 1.5-9 } } \section{Changes in version 1.5-12}{ \itemize{ \item update to libsvm 2.81 \item laplace smoothing added to \code{naiveBayes()} } } \section{Changes in version 1.5-11}{ \itemize{ \item \code{tune()}: allow list of vectors as tune parameter range so that class.weights in svm-models can be tuned \item better default color palette for \code{plot.tune()} \item New function \code{probplot()} for probability plots } } \section{Changes in version 1.5-10}{ \itemize{ \item Bug fix: class probability prediction was broken since 1.5-9 } } \section{Changes in version 1.5-9}{ \itemize{ \item \code{tune()} now returns the split indices into training/validation set. Information added about cross validation \item \code{plot.svm()}: wrong labeling order in levels fixed \item \code{predict.svm()} now adds row numbers to predictions, and correctly handles the \code{na.action} argument using \code{napredict()}. } } \section{Changes in version 1.5-8}{ \itemize{ \item Update to libsvm 2.8 (uses a faster optimization algorithm) } } \section{Changes in version 1.5-7}{ \itemize{ \item \code{read.matrix.csr()} did not work correctly with matrix-only objects. \item \code{svm()}: Fixed wrong labeling for predicted decision values and probabilities in case of a Class factor created from a non-ordered character vector } } \section{Changes in version 1.5-6}{ \itemize{ \item \code{cmeans()} is substantially enhanced, with a complete rewrite of the underlying C code. It is now possible to specify case weights and the relative convergence tolerance. For Manhattan distances, centers are correctly computed as suitably weighted medians (rather than means) of the observations. The print method for fclust objects is now more in parallel with related methods, and registered in the name space. } } \section{Changes in version 1.5-5}{ \itemize{ \item \code{read.octave()} is now deprecated in favor of a substantially enhanced version in package \pkg{foreign} for reading in files in Octave text data format. } } \section{Changes in version 1.5-4}{ \itemize{ \item Use lazy loading } } \section{Changes in version 1.5-3}{ \itemize{ \item New arguments in \code{plot.svm()} for customizing plot symbols and colors \item Fix of broken code in \code{plot.svm()} for the \code{fill = FALSE} (non-default) case } } \section{Changes in version 1.5-2}{ \itemize{ \item Fixed memory leak in \code{svm()} } } \section{Changes in version 1.5-1}{ \itemize{ \item Fixed C++ style comments } } \section{Changes in version 1.5-0}{ \itemize{ \item Example for weighting added in \code{svm()} help page \item upgrade to libsvm 2.6: support for probabilities added } } \section{Changes in version 1.4-1}{ \itemize{ \item \code{NaiveBayes()} is more accurate for small probabilities \item call is more sensible in \code{tune()}, \code{tune.foo()}, and \code{best.foo()} objects. \item \code{control} parameter of \code{tune()} changed to \code{tunecontrol} to solve name space conflict with training methods using \code{control} themselves \item new function \code{matchControls()} \item fixed a bug in \code{bclust()} triggered when a cluster had only one center } } \section{Changes in version 1.4-0}{ \itemize{ \item adjusted to restructering of R base packages \item added a \file{NAMESPACE} file \item Function \code{write.svm()} now also creates a file with scaling information } } \section{Changes in version 1.3.16}{ \itemize{ \item Small bug fixes in \code{predict.svm()} and \code{plot.svm()} \item Function \code{write.svm()} added which saves models created with \code{svm()} in the format libsvm can read. } } \section{Changes in version 1.3.15}{ \itemize{ \item Bug fix in \code{plot.svm()}: non-SVs had wrong colors \item data sets Ozone and Glass added } } \section{Changes in version 1.3.14}{ \itemize{ \item Several Docu bug fixes (for functions \code{plot.bclust()}, \code{impute()}, \code{stft()}, \code{svm.formula()}, \code{svm.default()}) \item upgrade to libsvm 2.5. New feature: \code{predict.svm()} optionally returns decision values for multi-class classification \item svm-vignette gave warnings due to rank deficiency in Ozone data \item \code{naiveBayes()} now also supports metric predictors, and the standard interface. } } \section{Changes in version 1.3.13}{ \itemize{ \item Bug fixes in svm: \itemize{ \item Prediction of 1 single observation gave an error \item Only \eqn{k} instead of \eqn{k*(k-1)/2} \eqn{\rho} coefficients have been returned by svm (\eqn{k} number of classes), having caused nonsensical results for \eqn{k > 3}. } \item The \file{svmdoc} file in \file{inst/doc} now is a vignette. } } \section{Changes in version 1.3-12}{ \itemize{ \item The \code{x} argument of \code{cmeans()} and \code{bclust()} is now automatically coerced to a matrix. \item Started \file{tests} directory \item New method: \code{naiveBayes()} classifier for categorical predictors \item optimization of \code{read.matrix.csr()} which used to be rather slow \item Bug fixes for the \code{svm()} interface: when the data included categorical predictors, the scaling procedure did not only affect the metric variables, but also the binary variables in the model matrix. \item Function \code{scaclust()} removed. Bug has to be fixed. } } \section{Changes in version 1.3-10}{ \itemize{ \item Now supports libsvm 2.4 } } \section{Changes in version 1.3-9}{ \itemize{ \item \code{rdiscrete()} is now simply a wrapper for \code{sample()} and provided for backwards compatibility only. \item Minor bug fixes in \code{svm()} and \code{tune()} (mostly interface issues). New plot function for objects of class \code{svm} working for the 2d-classification case. } } \section{Changes in version 1.3-7}{ \itemize{ \item \code{svm()} now supports the matrix.csr format, as handled by the \cpkg{SparseM} package. Predictors and response variable (if numeric) are scaled per default. \item A new \code{plot()} function for \code{svm()} objects visualizes classification models by plotting data and support vectors in the data input space, along with the class borders. \item A new generic \code{tune()} function allows parameter tuning of arbitrary functions using, e.g., boot strapping, or cross validation. Several convenience wrappers (e.g., for \code{svm()}, \code{nnet()}, and \code{rpart()}) do exist. } } \section{Changes in version 1.3-3}{ \itemize{ \item Bug fixes in various bclust routines: \code{stop()} if required packages are not found \item \code{svm()} now interfaces LIBSVM 2.35 which is a bug fix release. A call with invalid parameters now no longer causes R to be terminated, and the C(++) code became completely silent. \item Bugs fixed in \code{fclustIndex()} function and \code{print.fclust()}. } } \section{Changes in version 1.3-1}{ \itemize{ \item Functions \code{rmvnorm()} and \code{dmvnorm()} for multivariate normal distributions have been moved to package \cpkg{mvtnorm}. \item Bug fixes in \code{print.fclust()} and \code{fclustIndex()}. \item fixed \file{floyd.c} (ANSI C pedantic warnings) } } \section{Changes in version 1.2-1}{ \itemize{ \item Bug fixes in \file{cmeans.c}, \file{cshell.c} and \file{scaclust.c} (R header files included and unused variables removed) \item Bug fixes in \file{Rsvm.c} and \file{svm.R} (incomplete list of returned Support Vectors). \item Encapsulate kmeans call in \code{bclust()} in a \code{try()} construct, because kmeans gives an error when a cluster becomes empty (which can happen for almost every data set from time to time). } } \section{Changes in version 1.2-0}{ \itemize{ \item Added functions for bagged clustering, see help(bclust). \item \code{read.pnm()} and \code{write.pgm()} have been removed from \cpkg{e1071}, much improved versions can now be found in the new packagepixmap. \item Lots of documentation updates and bugfixes. \item Support Vector Machine interface now upgraded to libsvm V. 2.31 featuring: \itemize{ \item Multi-Class Classification \item weighting of classes for C-classification (for asymmetric sample sizes) \item \eqn{\nu}-regression \item Formula Interface \item \eqn{k}-fold cross-validation } In addition, an introductory article is provided in directory \file{docs/} (\file{svmdoc.pdf}). \item \code{classAgreement()} now features an option to match factor levels \item updated API design for the fuzzy clustering functions (\code{cmeans()}, \code{cshell()}, \code{scaclust()}). Documentation updates and function name changes (\code{cmeanscl()} to \code{cmeans()}, \code{validity.measures()} to \code{fclustIndex()}) } }