Как нормализовать данные в Python
Часто в статистике и машинном обучении мы нормализуем переменные таким образом, чтобы диапазон значений находился между 0 и 1.
Наиболее распространенной причиной нормализации переменных является проведение некоторого типа многомерного анализа (т. е. мы хотим понять взаимосвязь между несколькими переменными-предикторами и переменной-откликом) и хотим, чтобы каждая переменная вносила равный вклад в анализ.
Когда переменные измеряются в разных масштабах, они часто не вносят одинакового вклада в анализ. Например, если значения одной переменной находятся в диапазоне от 0 до 100 000, а значения другой переменной — в диапазоне от 0 до 100, переменной с большим диапазоном будет присвоен больший вес при анализе.
Нормируя переменные, мы можем быть уверены, что каждая переменная вносит одинаковый вклад в анализ.
Чтобы нормализовать значения между 0 и 1, мы можем использовать следующую формулу:
x норма = (x i – x мин ) / (x макс – x мин )
- x norm : i -е нормализованное значение в наборе данных
- x i : i -е значение в наборе данных
- x max : минимальное значение в наборе данных
- x min : максимальное значение в наборе данных
В следующих примерах показано, как нормализовать одну или несколько переменных в Python.
Пример 1. Нормализация массива NumPy
В следующем коде показано, как нормализовать все значения в массиве NumPy:
import numpy as np #create NumPy array data = np.array([[13, 16, 19, 22, 23, 38, 47, 56, 58, 63, 65, 70, 71]]) #normalize all values in array data_norm = (data - data. min ())/ (data. max () - data. min ()) #view normalized values data_norm array([[0. , 0.05172414, 0.10344828, 0.15517241, 0.17241379, 0.43103448, 0.5862069 , 0.74137931, 0.77586207, 0.86206897, 0.89655172, 0.98275862, 1. ]])
Каждое из значений в нормализованном массиве теперь находится между 0 и 1.
Пример 2: нормализовать все переменные в Pandas DataFrame
Следующий код показывает, как нормализовать все переменные в кадре данных pandas:
import pandas as pd #create DataFrame df = pd.DataFrame() #normalize values in every column df_norm = (df-df.min ())/ (df.max () - df.min ()) #view normalized DataFrame df_norm points assists rebounds 0 0.764706 0.125 0.857143 1 0.000000 0.375 0.428571 2 0.176471 0.375 0.714286 3 0.117647 0.625 0.142857 4 0.411765 1.000 0.142857 5 0.647059 0.625 0.000000 6 0.764706 0.625 0.571429 7 1.000000 0.000 1.000000
Каждое из значений в каждом столбце теперь находится в диапазоне от 0 до 1.
Пример 3: нормализовать определенные переменные в Pandas DataFrame
В следующем коде показано, как нормализовать определенные переменные в кадре данных pandas:
import pandas as pd #create DataFrame df = pd.DataFrame() define columns to normalize x = df.iloc [:,0:2] #normalize values in first two columns only df.iloc [:,0:2] = (x-x. min ())/ (x. max () - x. min ()) #view normalized DataFrame df points assists rebounds 0 0.764706 0.125 11 1 0.000000 0.375 8 2 0.176471 0.375 10 3 0.117647 0.625 6 4 0.411765 1.000 6 5 0.647059 0.625 5 6 0.764706 0.625 9 7 1.000000 0.000 12
Обратите внимание, что нормализуются только значения в первых двух столбцах.
Дополнительные ресурсы
В следующих руководствах представлена дополнительная информация о нормализации данных:
NumPy Unit Vector
- Get Unit Vector From NumPy Array With the numpy.linalg.norm() Function
- Get Unit Vector From NumPy Array With the Self-Defined Approach
This tutorial will discuss the method to normalize a NumPy array to a unit vector in Python.
Get Unit Vector From NumPy Array With the numpy.linalg.norm() Function
A vector is a quantity that has a magnitude as well as a direction. A unit vector is a vector whose magnitude is equal to one. We can normalize a vector to its corresponding unit vector with the help of the numpy.linalg.norm() function. The numpy.linalg library contains a lot of functions related to linear algebra. We can use the norm() function inside the numpy.linalg to calculate the norm of a vector. We can divide the vector by its norm to get the unit vector of the vector.
import numpy as np vector = np.array([1, 2, 3]) unit_vector = vector / np.linalg.norm(vector) print(unit_vector)
[0.26726124 0.53452248 0.80178373]
We first created the vector with the numpy.array() function. We then calculated the unit vector of the vector by dividing the vector with the norm of the vector and saved the result inside the unit_vector .
Get Unit Vector From NumPy Array With the Self-Defined Approach
We can also calculate the unit vector without using the norm() function inside the numpy.linalg library in Python. We can find the norm by calculating the square root of the sum of squares of each element inside the vector. We can then calculate the unit vector by dividing the vector by its norm. See the following code example.
import numpy as np vector = np.array([1, 2, 3]) unit_vector = vector / (vector ** 2).sum() ** 0.5 print(unit_vector)
[0.26726124 0.53452248 0.80178373]
We first created the vector with the numpy.array() function. We then calculated the unit vector of the vector by dividing the vector with the norm of the vector and saved the result inside the unit_vector .
Maisam is a highly skilled and motivated Data Scientist. He has over 4 years of experience with Python programming language. He loves solving complex problems and sharing his results on the internet.
Copyright © 2023. All right reserved
NumPy : векторы и операции над ними
В этом ноутбуке нам понадобятся библиотека NumPy . Для удобства импортируем ее под более коротким именем:
In [1]:import numpy as np1. Создание векторов
Самый простой способ создать вектор в NumPy — задать его явно с помощью numpy.array(list, dtype=None, . ) .
Параметр list задает итерируемый объект, из которого можно создать вектор. Например, в качестве этого параметра можно задать список чисел. Параметр dtype задает тип значений вектора, например, float — для вещественных значений и int — для целочисленных. Если этот параметр не задан, то тип данных будет определен из типа элементов первого аргумента.
In [2]:a = np.array([1, 2, 3, 4]) print 'Вектор:\n', aВектор: [1 2 3 4]In [3]:b = np.array([1, 2, 3, 4, 5], dtype=float) print 'Вещественный вектор:\n', bВещественный вектор: [ 1. 2. 3. 4. 5.]In [4]:c = np.array([True, False, True], dtype=bool) print 'Булевский вектор:\n', cБулевский вектор: [ True False True]Нормировка значений np.random.normal
Здравствуйте, уважаемые форумчане.
Столкнулся с проблемой, которую я не понимаю. Вроде все просто, но я в тупике. Помогите пожалуйста разобраться.
Создаю массив
Noise = np.random.normal(size=1000, scale=1)
или
Noise = np.random.rayleigh(size=1000, scale=1)
или
Noise = uniform.rvs(size=1000, loc=0, scale=1)
Получаются различные массивы со значениями
от -29 до 32
или
от 0 до 36
или
от 0 до 10
мне же необходимо, чтоб там были значения от 0 до 1. Как я понимаю, это можно сделать двумя способами, нормировкой, либо как то задавать границы от 0 до 1 при создании массива. Но вот ни первым, ни вторым способом я это не могу сделать, просто не могу найти информацию. Либо есть какой то третий способ. Знающие, подскажите пожалуйста.Лучшие ответы ( 1 )
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
Ответы с готовыми решениями:
Нормировка значений массива чисел с плавающей точкой
Помогите, пожалуйста, исправить программу. Было дано задание: Разработайте и реализуйте функцию.Нормировка значений обучающей выборки нейронной сети внутри окна (delay)
Итак, задача состоит в том, чтобы обучить нейронную сеть типа NARX по определенной выборке входных.Random значений в таблицу до определенного числа
в форме идет заполнение вагонов ( номера, тип вагона и количество) для определенного поля( первое.
Запись значений через random в dataGridView
Здравствуйте уважаемые пользователи форума, нуждаюсь в вашей помощи. Необходимо сделать несколько.4751 / 2643 / 547
Регистрация: 07.11.2019
Сообщений: 4,359Dart_pinokkio, у меня в последнем случае от 0 до 1 выдает. Проверяйте.
В пкрвых двух случаях границ нет, т.к. распределения имеют бесконечную верхнюю границу.
Но нормировать к диапазону уже сгенерированую последовательность можно.Регистрация: 17.12.2018
Сообщений: 50Мне как раз и надо, чтоб при любом виде распределения полученный массив Noise я мог нормировать и дальше с ним работать.
575 / 407 / 68
Регистрация: 09.01.2018
Сообщений: 1,352Давайте для начала вы приведете "в порядок" то, что тут вы выдаете за результаты, которые вы якобы получаете.
Потому что то, что вы пишете как вроде как "получаемые значения" никак не соответствуют примерам, что вы приводите.1 2 3 4import numpy as np Noise = np.random.normal(size=1000, scale=1) print (Noise.min(),Noise.max()) -3.0492069305230927 2.9301992444155576Вероятность появления в этом массиве чисел -29 или 32 равна
9.551694541948838e-184 и 1.746366256758777e-223Про равномерное распределение.
1 2 3 4import scipy.stats as ss Noise = ss.uniform.rvs(size=1000, loc=0, scale=1) print (Noise.min(),Noise.max()) 9.288738143686803e-05 0.9992055571054382Так что ну никак не можете вы получить указанные Вами значения.
Для начала разберитесь, как вы умудряетесь получить какие-то безумные числа. А уж потом попробуем заняться их нормировкой.Регистрация: 17.12.2018
Сообщений: 50
Вот мой код
Кликните здесь для просмотра всего текста1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20import numpy as np from scipy.stats import uniform #Равномерное распределение from scipy.stats import expon #Экспоненциальное распределение # "Нормальное": NoiseNorm = np.random.normal(size=1000, scale=1) # "Парето": NoisePareto = np.random.pareto(a=2, size=1000) # "Рэлея": NoiseRelay = np.random.rayleigh(size=1000, scale=1) # "Экспоненциальный": NoiseExp = expon.pdf(np.linspace(0.001, 10, 1000)) # "Равномерное": NoiseUni = uniform.rvs(size=1000, loc=0, scale=1) print ("Нормальное минимум", NoiseNorm.min(),"Нормальное максимум", NoiseNorm.max()) print ("Парето минимум", NoisePareto.min(),"Парето максимум", NoisePareto.max()) print ("Рэлея минимум", NoiseRelay.min(),"Рэлея максимум", NoiseRelay.max()) print ("Экспоненциальный минимум", NoiseExp.min(),"Экспоненциальный максимум", NoiseExp.max()) print ("Равномерное минимум", NoiseUni.min(),"Равномерное максимум", NoiseUni.max())Кликните здесь для просмотра всего текста
Нормальное минимум -2.972530305711369 Нормальное максимум 2.8569427618364016
Парето минимум 0.0006334198960544768 Парето максимум 46.114292205883416
Рэлея минимум 0.03459908521111335 Рэлея максимум 4.352265933581838
Экспоненциальный минимум 4.5399929762484854e-05 Экспоненциальный максимум 0.999000499833375
Равномерное минимум 0.0021885700029391497 Равномерное максимум 0.99840372034336как мы видим, единственное распределение, которое по умолчанию входит в диапазон от 0 до 1 это равномерное. Мне же необходимо, чтобы любое распределение я мог нормировать, а затем использовать уже нормированный массив для дальнейшей обработки.