Я загубився в нормалізації, чи не міг би хтось мене навести.
У мене мінімальні та максимальні значення, скажімо, -23,89 та 7,54990767 відповідно.
Якщо я отримаю значення 5.6878, як я можу масштабувати це значення за шкалою від 0 до 1.
Я загубився в нормалізації, чи не міг би хтось мене навести.
У мене мінімальні та максимальні значення, скажімо, -23,89 та 7,54990767 відповідно.
Якщо я отримаю значення 5.6878, як я можу масштабувати це значення за шкалою від 0 до 1.
Відповіді:
Якщо ви хочете нормалізувати свої дані, ви можете зробити так, як ви запропонуєте, і просто обчислити наступне:
де і тепер ваші нормалізовані дані. Як доказ концепції (хоча ви її не просили) ось деякий код та супровідний графік для ілюстрації цього пункту:R
# Example Data
x = sample(-100:100, 50)
#Normalized Data
normalized = (x-min(x))/(max(x)-min(x))
# Histogram of example data and normalized data
par(mfrow=c(1,2))
hist(x, breaks=10, xlab="Data", col="lightblue", main="")
hist(normalized, breaks=10, xlab="Normalized Data", col="lightblue", main="")
illustrate the point
відповідають на ваш (правильний) відповідь?
Загальна однолінійна формула для лінійного масштабування значень даних, що спостерігають min та max у новий довільний діапазон min ' до max' ,
newvalue= (max'-min')/(max-min)*(value-max)+max'
or
newvalue= (max'-min')/(max-min)*(value-min)+min'.
a
і b
константи, а потім просто застосувати newvalue = a * value + b
. a = (max'-min')/(max-min)
іb = max - a * max
b = max' - a * max
Абоb = min' - (a * min)
u = -1 + 2.*(u - min(u))./(max(u) - min(u));
.
Ось моя реалізація PHP для нормалізації:
function normalize($value, $min, $max) {
$normalized = ($value - $min) / ($max - $min);
return $normalized;
}
Але в той час як я будував власні штучні нейронні мережі, мені потрібно було перетворити нормалізований вихід назад до вихідних даних, щоб отримати гарний читабельний вихід для графіка.
function denormalize($normalized, $min, $max) {
$denormalized = ($normalized * ($max - $min) + $min);
return $denormalized;
}
$int = 12;
$max = 20;
$min = 10;
$normalized = normalize($int, $min, $max); // 0.2
$denormalized = denormalize($normalized, $min, $max); //12
Для денормалізації використовується наступна формула:
Слід пам’ятати, що це max - min
може дорівнювати нулю. У цьому випадку ви не хочете виконувати цей поділ.
У випадку, коли це станеться, коли всі значення в списку, який ви намагаєтесь нормалізувати, однакові. Для нормалізації такого списку кожен пункт був би 1 / length
.
// JavaScript
function normalize(list) {
var minMax = list.reduce((acc, value) => {
if (value < acc.min) {
acc.min = value;
}
if (value > acc.max) {
acc.max = value;
}
return acc;
}, {min: Number.POSITIVE_INFINITY, max: Number.NEGATIVE_INFINITY});
return list.map(value => {
// Verify that you're not about to divide by zero
if (minMax.max === minMax.min) {
return 1 / list.length
}
var diff = minMax.max - minMax.min;
return (value - minMax.min) / diff;
});
}
normalize([3, 3, 3, 3]); // output => [0.25, 0.25, 0.25, 0.25]
normalize([12, 20, 10])
Виходи [0.2, 1.0, 0.0]
, те саме, що ви отримали б (val - min) / (max - min)
.
відповідь правильна, але у мене є пропозиція, що робити, якщо ваші дані тренувань стикаються з деякою кількістю поза діапазоном? ви можете використовувати техніку сквош. це гарантовано ніколи не вийде за межі діапазону. а не це
я рекомендую використовувати це
при такому тиску в хв і макс
а розмір очікуваного розриву поза межами діапазону прямо пропорційний ступеня впевненості, що будуть значення поза межами діапазону.
для отримання додаткової інформації ви можете google: скоротити номери поза межами діапазону та звернутися до книги підготовки даних "доріанської палі"
Спробуйте це. Це відповідає шкалі функцій
normalize <- function(x) {
x <- as.matrix(x)
minAttr=apply(x, 2, min)
maxAttr=apply(x, 2, max)
x <- sweep(x, 2, minAttr, FUN="-")
x=sweep(x, 2, maxAttr-minAttr, "/")
attr(x, 'normalized:min') = minAttr
attr(x, 'normalized:max') = maxAttr
return (x)
}