<reponame>swxgithub/scratch-vm<filename>src/extensions/Multivariate_Regression/normalization.js
/**
 * @license
 * Copyright 2018 Google LLC. All Rights Reserved.
 * Licensed under the Apache License, Version 2.0 (the "License");
 * you may not use this file except in compliance with the License.
 * You may obtain a copy of the License at
 *
 * http://www.apache.org/licenses/LICENSE-2.0
 *
 * Unless required by applicable law or agreed to in writing, software
 * distributed under the License is distributed on an "AS IS" BASIS,
 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 * See the License for the specific language governing permissions and
 * limitations under the License.
 * =============================================================================
 */

/**
 * Calculates the mean and standard deviation of each column of a data array.
 *
 * @param {Tensor2d} data Dataset from which to calculate the mean and
 *                        std of each column independently.
 *
 * @returns {Object} Contains the mean and standard deviation of each vector
 *                   column as 1d tensors.
 */
export function determineMeanAndStddev(data) {
    const dataMean = data.mean(0);
    // TODO(bileschi): Simplify when and if tf.var / tf.std added to the API.
    const diffFromMean = data.sub(dataMean);
    const squaredDiffFromMean = diffFromMean.square();
    const variance = squaredDiffFromMean.mean(0);
    const dataStd = variance.sqrt();
    return {dataMean, dataStd};
  }
  
  /**
   * Given expected mean and standard deviation, normalizes a dataset by
   * subtracting the mean and dividing by the standard deviation.
   *
   * @param {Tensor2d} data: Data to normalize. Shape: [batch, numFeatures].
   * @param {Tensor1d} dataMean: Expected mean of the data. Shape [numFeatures].
   * @param {Tensor1d} dataStd: Expected std of the data. Shape [numFeatures]
   *
   * @returns {Tensor2d}: Tensor the same shape as data, but each column
   * normalized to have zero mean and unit standard deviation.
   */
  export function normalizeTensor(data, dataMean, dataStd) {
    return data.sub(dataMean).div(dataStd);
  }
  