Jestem zagubiony w normalizacji, czy ktoś mógłby mnie poprowadzić, proszę.
Mam wartości minimalne i maksymalne, powiedzmy odpowiednio -23,89 i 7,54990767.
Jeśli otrzymam wartość 5,6878, jak mogę skalować tę wartość w skali od 0 do 1.
Jestem zagubiony w normalizacji, czy ktoś mógłby mnie poprowadzić, proszę.
Mam wartości minimalne i maksymalne, powiedzmy odpowiednio -23,89 i 7,54990767.
Jeśli otrzymam wartość 5,6878, jak mogę skalować tę wartość w skali od 0 do 1.
Odpowiedzi:
Jeśli chcesz znormalizować swoje dane, możesz to zrobić, sugerując i po prostu obliczyć:
gdzie i to teraz twoje znormalizowane dane. Jako dowód koncepcji (choć o to nie prosiłeś), oto kod i towarzyszący mu wykres ilustrujący ten punkt: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
(poprawnej) odpowiedzi?
Ogólny wzór jednej linii liniowo przeskalowania wartości danych Obserwując min i max do nowego dowolnego zakresu min' do max” jest
newvalue= (max'-min')/(max-min)*(value-max)+max'
or
newvalue= (max'-min')/(max-min)*(value-min)+min'.
a
i b
stałych, a następnie po prostu zastosowałeś newvalue = a * value + b
. a = (max'-min')/(max-min)
ib = max - a * max
b = max' - a * max
Lubb = min' - (a * min)
u = -1 + 2.*(u - min(u))./(max(u) - min(u));
.
Oto moja implementacja PHP do normalizacji:
function normalize($value, $min, $max) {
$normalized = ($value - $min) / ($max - $min);
return $normalized;
}
Ale kiedy budowałem własne sztuczne sieci neuronowe, musiałem przekształcić znormalizowane dane wyjściowe z powrotem do oryginalnych danych, aby uzyskać dobry odczyt na wykresie.
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
W normalizacji wykorzystuje się następującą formułę:
Należy pamiętać, że max - min
może to być zero. W takim przypadku nie chcesz wykonywać tego podziału.
Tak się dzieje, gdy wszystkie wartości na liście, które próbujesz znormalizować, są takie same. Aby znormalizować taką listę, każdy element byłby 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])
wyjścia [0.2, 1.0, 0.0]
, czyli takie same, jakie można uzyskać (val - min) / (max - min)
.
odpowiedź jest prawidłowa, ale mam sugestię, co jeśli dane treningowe napotkają pewną liczbę poza zakresem? możesz użyć techniki zgniatania. nigdy nie wyjdzie poza zasięg. raczej niż to
polecam użyć tego
z takim zgniataniem w min i maks. zasięgu
a wielkość oczekiwanej luki poza zakresem jest wprost proporcjonalna do stopnia pewności, że wartości będą poza zakresem.
Aby uzyskać więcej informacji, możesz google: wyciskanie numerów spoza zakresu i zajrzyj do książki przygotowywania danych „Dorian Pyle”
Spróbuj tego. Jest to zgodne ze skalą funkcji
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)
}