ฉันหลงทางในการทำให้ปกติ
ฉันมีค่าต่ำสุดและค่าสูงสุดคือ -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
Denormalisation ใช้สูตรต่อไปนี้:
สิ่งหนึ่งที่ต้องจำไว้คือมัน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: squashing หมายเลข out-of-range และอ้างถึงหนังสือเตรียมข้อมูลของ "dorian pyle"
ลองสิ่งนี้ มันสอดคล้องกับระดับฟังก์ชั่น
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)
}