วิธีแสดงตัวแปรที่ไม่ได้ จำกัด เป็นตัวเลขระหว่าง 0 ถึง 1


28

ฉันต้องการที่จะเป็นตัวแทนของตัวแปรเป็นตัวเลขระหว่าง 0 และ 1 ตัวแปรที่เป็นจำนวนเต็มไม่เป็นลบที่ไม่มีข้อผูกมัดโดยธรรมชาติ ฉันแมป 0 ถึง 0 แต่ฉันสามารถแมปอะไรกับ 1 หรือตัวเลขระหว่าง 0 ถึง 1 ได้บ้าง

ฉันสามารถใช้ประวัติของตัวแปรนั้นเพื่อกำหนดขีด จำกัด นี่หมายความว่าฉันต้องย้ำสถิติเก่าถ้าการเพิ่มสูงสุด ฉันต้องทำสิ่งนี้หรือมีกลอุบายอื่น ๆ ที่ฉันควรรู้หรือไม่?


6
เนื่องจากฟังก์ชั่นที่ไม่ลบใด ๆ จากจะทำให้เคล็ดลับคุณมีความยืดหยุ่นมาก แต่วิธีการบางอย่างจะดีกว่าวิธีอื่น ๆ ขึ้นอยู่กับแอพพลิเคชั่น จุดประสงค์ของคุณคืออะไรในการแสวงหาการแสดงออกเช่นนี้? [0,)[0,1]
whuber

1
ฉันกำลังวัดเนื้อหาในหลาย ๆ มิติและฉันต้องการที่จะทำการเปรียบเทียบในแง่ของความเกี่ยวข้องของเนื้อหาที่กำหนด นอกจากนี้ฉันต้องการแสดงค่าในมิติข้อมูลเหล่านี้ที่สามารถอธิบายและเข้าใจได้ง่าย
สเปนเซอร์

1
@Spencer แน่นอนว่าคุณวัดเนื้อหาและ "ความเกี่ยวข้อง" อย่างไร เช่นในสัดส่วนตามอำเภอใจนับจำนวนสัดส่วนความถี่ของการดูความสัมพันธ์กับเนื้อหาอื่น ๆ ฯลฯ การวัดประเภทต่าง ๆ จะได้ประโยชน์จากการแสดงออกในรูปแบบต่างๆ
whuber

1
ฉันกำลังวัดพวกมันด้วยเครื่องชั่งตามอำเภอใจ เนื้อหามีอายุเท่าไหร่ ได้รับ "คะแนน" เนื้อหาเท่าไหร่ "ความสนใจ" ที่รายงานด้วยตนเองในโดเมนของเนื้อหา
สเปนเซอร์

2
หนึ่งในการแปลงที่ง่ายที่สุดที่คุณสามารถใช้คือการแปลงข้อมูลของคุณเป็นคะแนนควอไทล์
charles.y.zheng

คำตอบ:


34

เคล็ดลับที่ใช้กันทั่วไปมากในการทำเช่น (ในการสร้างแบบจำลองการเชื่อมต่อ) คือการใช้ไฮเพอร์โบลิกแทนแทนห์เป็น 'ฟังก์ชั่นการบีบ "มันเหมาะกับตัวเลขทั้งหมดโดยอัตโนมัติในช่วงระหว่าง -1 ถึง 1 ซึ่งในกรณีของคุณ 0 ถึง 1 ในrและคุณได้รับมันผ่านmatlabtanh()

f(x)=1/(1+ex)

นี่คือรหัส R แบบง่าย ๆ ที่จะแปลงทั้งสองฟังก์ชั่น (tanh เป็นสีแดง, โลจิสติกสีน้ำเงิน) เพื่อให้คุณเห็นว่าสควอชทั้งสอง:

x <- seq(0,20,0.001)
plot(x,tanh(x),pch=".", col="red", ylab="y")
points(x,(1 / (1 + exp(-x)))*2-1, pch=".",col="blue")

ขอบคุณสำหรับคำตอบ. ที่แก้ปัญหาเรื่องขอบเขต สำหรับข้อมูลของฉันมันไปที่ 1 อย่างรวดเร็วสำหรับข้อมูลของฉันดังนั้นฉันเดาว่าสิ่งต่อไปที่ฉันต้องทำคือการปรับขนาดข้อมูลนี้เพื่อมุ่งเน้นไปที่ช่วงที่น่าสนใจซึ่งฉันสามารถทำได้ตามประวัติของมันโดยไม่ต้องกลัวว่าจะหลุด เพียงแค่กดขีด จำกัด
Russell Gallop

25

บ่อยครั้งที่คำถามแรกของฉันจะเป็น " ทำไมคุณถึงต้องการทำสิ่งนี้" จากนั้นฉันเห็นว่าคุณตอบคำถามนี้ไปแล้วในข้อคิดเห็นของคำถาม: " ฉันกำลังวัดเนื้อหาในหลาย ๆ มิติและฉันอยากเป็น สามารถทำการเปรียบเทียบในส่วนที่เกี่ยวข้องกับเนื้อหาที่กำหนดนอกจากนี้ฉันต้องการแสดงค่าในมิติข้อมูลเหล่านี้ซึ่งสามารถอธิบายและเข้าใจได้ง่าย "

zzz- คะแนนเป็นที่ดีกว่าว่าตัวแปรแต่ละตัวมีการแจกแจงแบบปกติคร่าวหรืออย่างน้อยก็มีการกระจายแบบสมมาตรอย่างคร่าว ๆ (นั่นคือไม่เบ้อย่างรุนแรง) แต่ถ้าจำเป็นคุณสามารถใช้การแปลงข้อมูลที่เหมาะสมก่อนเพื่อให้บรรลุ ซึ่งการเปลี่ยนแปลงกับการใช้งานอาจจะถูกกำหนดโดยการค้นหาที่ดีที่สุดเหมาะสมเปลี่ยนแปลง Box-Cox


[0,1]

1
mad()rank()ecdf()ecdf(x)ppx1/nx1
Karl Ove Hufthammer

10

ฟังก์ชัน sigmoid ใด ๆ จะทำงาน:


erf ไม่ใช่ฟังก์ชั่นที่ใช้งานง่ายมากหากคุณไม่ต้องการใช้มันเพื่อหาอนุพันธ์

ฉันลงเอยด้วยการใช้ฟังก์ชั่นโลจิสติกอย่างง่ายพร้อมปรับแต่งเล็กน้อย: (1 / (1 + (1 + java.lang.Math.exp (-1 * (ตัวประกอบ * i))) - 0.5) * 2. ฉันเลือกตัวประกอบ 0.05 ซึ่ง ดูเหมือนว่าจะทำงานได้ดีสำหรับฉันระหว่าง 0 ถึงไม่กี่ร้อย
Jilles van Gurp

1.0 / (1.0 + exp (-1.69897 * (x-Mean (x)) / sd (x))) เป็นการปิด pnorm โดยประมาณ
Chris

3

นอกจากคำแนะนำที่ดีโดย Henrik และ Simon Byrne คุณสามารถใช้ f (x) = x / (x + 1) โดยการเปรียบเทียบฟังก์ชันลอจิสติกจะแตกต่างเกินจริงเมื่อ x โตขึ้น นั่นคือความแตกต่างระหว่าง f (x) และ f (x + 1) จะมีขนาดใหญ่กว่าด้วยฟังก์ชันโลจิสติกมากกว่า f (x) = x / (x + 1) คุณอาจจะหรืออาจไม่ต้องการผลกระทบนั้น


1

โพสต์ก่อนหน้าของฉันมีวิธีการจัดอันดับระหว่าง 0 และ 1 คำแนะนำเกี่ยวกับความสัมพันธ์อินพุตลักษณนาม

อย่างไรก็ตามการจัดอันดับที่ฉันใช้ Tmin / Tmax ใช้ตัวอย่างขั้นต่ำ / สูงสุด แต่คุณอาจพบว่าจำนวนประชากรต่ำสุด / สูงสุดเหมาะสมกว่า ยังค้นหาคะแนน z


1

หากต้องการเพิ่มคำตอบอื่น ๆ ที่แนะนำ pnorm ...

สำหรับวิธีที่เหมาะสมที่สุดสำหรับการเลือกพารามิเตอร์ฉันขอแนะนำการประมาณนี้สำหรับ pnorm

1.0/(1.0+exp(-1.69897*(x-mean(x))/sd(x)))

pnormish

นี่คือการทำให้เป็นมาตรฐาน Softmax เป็นหลัก

อ้างอิง Pnorm ในการบีบ


1

มีสองวิธีในการใช้สิ่งนี้ที่ฉันใช้เป็นปกติ ฉันมักจะทำงานกับข้อมูลเรียลไทม์ดังนั้นจึงถือว่าอินพุตต่อเนื่อง นี่คือบางส่วนของรหัสเทียม:

ใช้ minmax ที่ฝึกได้:

define function peak:
    // keeps the highest value it has received

define function trough:
    // keeps the lowest value it has received

define function calibrate:
    // toggles whether peak() and trough() are receiving values or not

define function scale:
    // maps input range [trough.value() to peak.value()] to [0.0 to 1.0]

ฟังก์ชั่นนี้ต้องการให้คุณดำเนินการขั้นตอนการฝึกอบรมครั้งแรก (โดยใช้calibrate()) หรือให้คุณฝึกซ้ำตามช่วงเวลาที่กำหนดหรือตามเงื่อนไขที่กำหนด ตัวอย่างเช่นลองจินตนาการถึงฟังก์ชั่นแบบนี้:

define function outBounds (val, thresh):
    if val > (thresh*peak.value()) || val < (trough.value() / thresh):
        calibrate()

peak และ trough ปกติไม่ได้รับค่า แต่ถ้าoutBounds()ได้รับค่าที่มากกว่า 1.5 เท่าของ peak ปัจจุบันหรือน้อยกว่า trough ปัจจุบันหารด้วย 1.5 calibrate()จะมีการเรียกซึ่งอนุญาตให้ฟังก์ชันปรับเทียบอัตโนมัติอีกครั้ง

ใช้ minmax ประวัติศาสตร์:

var arrayLength = 1000
var histArray[arrayLength]

define historyArray(f):
    histArray.pushFront(f) //adds f to the beginning of the array

define max(array):
    // finds maximum element in histArray[]
    return max

define min(array):
    // finds minimum element in histArray[]
    return min

define function scale:
    // maps input range [min(histArray) to max(histArray)] to [0.0 to 1.0]

main()
historyArray(histArray)
scale(min(histArray), max(histArray), histArray[0])
// histArray[0] is the current element

ทั้งหมดนี้สามารถนำมาใช้ใน Max / MSP / Jitter ด้วยวัตถุ [peak] และ [trough] สำหรับตัวอย่างแรกและกับ [jit.3m] สำหรับตัวอย่างที่สอง
ระเบียง

0

ตัวเลือกที่ง่ายมากคือการหารแต่ละตัวเลขในข้อมูลของคุณด้วยจำนวนที่มากที่สุดในข้อมูลของคุณ หากคุณมีตัวเลขขนาดเล็กจำนวนมากและจำนวนน้อยมากสิ่งนี้อาจไม่สามารถถ่ายทอดข้อมูลได้ดี แต่มันค่อนข้างง่าย หากคุณคิดว่าข้อมูลที่มีความหมายหายไปเมื่อคุณวาดกราฟข้อมูลเช่นนี้คุณสามารถลองเทคนิคที่มีความซับซ้อนมากกว่าที่ผู้อื่นแนะนำ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.