text: # util.py
  # From Classic Computer Science Problems in Python Chapter 7
  # Copyright 2018 David Kopec
  #
  # 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.
  from typing import List
  from math import exp
  
  
  # 두 벡터의 내적
  def dot_product(xs: List[float], ys: List[float]) -> float:
      return sum(x * y for x, y in zip(xs, ys))
  
  
  # 시그모이드 함수
  def sigmoid(x: float) -> float:
      return 1.0 / (1.0 + exp(-x))
  
  
  def derivative_sigmoid(x: float) -> float:
      sig: float = sigmoid(x)
      return sig * (1 - sig)
  
  
  # 모든 행 길이가 같고 각 열의 범위(피쳐 스케일링)가 0 - 1이라 가정한다.
  def normalize_by_feature_scaling(dataset: List[List[float]]) -> None:
      for col_num in range(len(dataset[0])):
          column: List[float] = [row[col_num] for row in dataset]
          maximum = max(column)
          minimum = min(column)
          for row_num in range(len(dataset)):
              dataset[row_num][col_num] = (
                  dataset[row_num][col_num] - minimum) / (maximum - minimum)
  