Sha256: 4fa9f5f944812cbc66f1e6b8a2c3480aa2481ae6753b972a24ca37ce2922c6c4

Contents?: true

Size: 1.64 KB

Versions: 2

Compression:

Stored size: 1.64 KB

Contents

require 'svmkit/base/base_estimator'
require 'svmkit/base/transformer'

module SVMKit
  # This module consists of the classes that perform preprocessings.
  module Preprocessing
    # Normalize samples to unit L2-norm.
    #
    #   normalizer = SVMKit::Preprocessing::StandardScaler.new
    #   new_samples = normalizer.fit_transform(samples)
    class L2Normalizer
      include Base::BaseEstimator
      include Base::Transformer

      # The vector consists of norms of each sample.
      attr_reader :norm_vec # :nodoc:

      # Create a new normalizer for normaliing to unit L2-norm.
      #
      # :call-seq:
      #   new() -> L2Normalizer
      def initialize(_params = {})
        @norm_vec = nil
      end

      # Calculate L2 norms of each sample.
      #
      # :call-seq:
      #   fit(x) -> L2Normalizer
      #
      # * *Arguments* :
      #   - +x+ (NMatrix, shape: [n_samples, n_features]) -- The samples to calculate L2-norms.
      # * *Returns* :
      #   - L2Normalizer
      def fit(x, _y = nil)
        n_samples, = x.shape
        @norm_vec = NMatrix.new([1, n_samples],
                                Array.new(n_samples) { |n| x.row(n).norm2 })
        self
      end

      # Calculate L2 norms of each sample, and then normalize samples to unit L2-norm.
      #
      # :call-seq:
      #   fit_transform(x) -> NMatrix
      #
      # * *Arguments* :
      #   - +x+ (NMatrix, shape: [n_samples, n_features]) -- The samples to calculate L2-norms.
      # * *Returns* :
      #   - The normalized samples (NMatrix)
      def fit_transform(x, _y = nil)
        fit(x)
        x / @norm_vec.transpose.repeat(x.shape[1], 1)
      end
    end
  end
end

Version data entries

2 entries across 2 versions & 1 rubygems

Version Path
svmkit-0.1.1 lib/svmkit/preprocessing/l2_normalizer.rb
svmkit-0.1.0 lib/svmkit/preprocessing/l2_normalizer.rb