Cách biểu diễn một biến không giới hạn dưới dạng số từ 0 đến 1


28

Tôi muốn biểu diễn một biến là một số từ 0 đến 1. Biến là một số nguyên không âm không có ràng buộc cố hữu. Tôi ánh xạ 0 đến 0 nhưng tôi có thể ánh xạ tới 1 hoặc các số từ 0 đến 1?

Tôi có thể sử dụng lịch sử của biến đó để cung cấp các giới hạn. Điều này có nghĩa là tôi phải phục hồi số liệu thống kê cũ nếu tăng tối đa. Tôi có phải làm điều này hay có những thủ thuật khác mà tôi nên biết không?


6
Bởi vì bất kỳ chức năng nondecreasing từ sẽ làm các trick, bạn có rất nhiều tính linh hoạt. Nhưng một số phương pháp sẽ tốt hơn những phương pháp khác, tùy thuộc vào ứng dụng. Mục đích của bạn trong việc tìm kiếm một biểu hiện lại như vậy là gì? [0,)[0,1]
whuber

1
Tôi đang đo lường nội dung trên nhiều khía cạnh khác nhau và tôi muốn có thể so sánh về mức độ phù hợp của một nội dung nhất định. Ngoài ra, tôi muốn hiển thị các giá trị trên các kích thước này có thể giải thích và dễ hiểu.
Spencer

1
@Spencer Chính xác thì bạn đo nội dung và "mức độ liên quan" như thế nào? Ví dụ, trên các thang đo tùy ý, như số lượng, tỷ lệ, tần suất lượt xem, mối tương quan với nội dung khác, v.v ... Các loại phép đo khác nhau được hưởng lợi từ các loại biểu thức lại khác nhau.
whuber

1
Tôi đang đo chúng trên thang đo tùy ý. Nội dung bao nhiêu tuổi Có bao nhiêu "điểm" một phần nội dung được nhận. Tự báo cáo "quan tâm" trong lĩnh vực nội dung.
Spencer

2
Một trong những biến đổi đơn giản nhất bạn có thể sử dụng là chuyển đổi dữ liệu của mình thành điểm số lượng tử.
charles.y.zheng

Câu trả lời:


34

Một mẹo rất phổ biến để làm như vậy (ví dụ: trong mô hình kết nối) là sử dụng hàm tiếp tuyến hyperbolic làm 'hàm băm ". Nó tự động khớp tất cả các số vào khoảng giữa -1 và 1. Trong trường hợp của bạn, nó giới hạn phạm vi từ 0 đến 1. Trong rmatlabbạn có được nó thông qua tanh().

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

Dưới đây là một số mã R đơn giản, vẽ cả hai hàm (tanh màu đỏ, logistic màu xanh lam) để bạn có thể thấy cả hai squash:

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")

Cảm ơn câu trả lời của bạn. Điều đó giải quyết vấn đề ràng buộc. Đối với dữ liệu của tôi, dữ liệu của tôi tăng lên 1 rất nhanh vì vậy tôi đoán điều tiếp theo tôi cần làm là mở rộng thông tin này để tập trung vào phạm vi thú vị mà tôi có thể làm dựa trên lịch sử của dữ liệu mà không sợ bị ràng buộc, Chỉ cần đạt đến giới hạn.
Russell Gallop

25

Như thường lệ, câu hỏi đầu tiên của tôi là " tại sao bạn muốn làm điều này", sau đó tôi thấy bạn đã trả lời câu hỏi này trong các bình luận cho câu hỏi: " Tôi đang đo lường nội dung qua nhiều chiều khác nhau và tôi muốn có thể so sánh về mức độ phù hợp của một phần nội dung nhất định. Ngoài ra, tôi muốn hiển thị các giá trị trên các kích thước này có thể giải thích và dễ hiểu. "

zzz-scores, tốt nhất là mỗi biến có phân phối gần như bình thường hoặc ít nhất là có phân phối đối xứng gần đúng (nghĩa là không bị lệch nghiêm trọng) nhưng nếu cần bạn có thể áp dụng một số chuyển đổi dữ liệu phù hợp trước để đạt được điều này; có thể xác định chuyển đổi nào để sử dụng bằng cách tìm biến đổi Box Cox phù hợp nhất .


[0,1]

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

10

Bất kỳ chức năng sigmoid sẽ làm việc:

  • Nửa trên của hàm logistic (nhân với 2, trừ 1)
  • Hàm lỗi
  • tanh, theo đề nghị của Henrik.

erf không phải là một chức năng rất tiện dụng, miễn là bạn không muốn sử dụng nó cho đạo hàm của nó.

Tôi đã kết thúc bằng cách sử dụng một hàm logistic đơn giản với một số điều chỉnh nhỏ: (1 / (1 + java.lang.Math.bao (-1 * (hệ số * i))) - 0,5) * 2. Tôi đã chọn hệ số 0,05 dường như hoạt động tốt cho tôi từ 0 đến vài trăm.
Jilles van Gurp

1.0 / (1.0 + exp (-1,69897 * (x-mean (x)) / sd (x))) là một xấp xỉ gần đúng với pnorm
Chris

3

Ngoài những gợi ý hay của Henrik và Simon Byrne, bạn có thể sử dụng f (x) = x / (x + 1). Bằng cách so sánh, hàm logistic sẽ phóng đại sự khác biệt khi x phát triển lớn hơn. Nghĩa là, sự khác biệt giữa f (x) và f (x + 1) sẽ lớn hơn với hàm logistic so với f (x) = x / (x + 1). Bạn có thể hoặc không muốn hiệu ứng đó.


1

Bài viết trước đây của tôi có một phương pháp để xếp hạng từ 0 đến 1. Tư vấn về tương quan đầu vào phân loại

Tuy nhiên, xếp hạng tôi đã sử dụng, Tmin / Tmax sử dụng mẫu tối thiểu / tối đa nhưng bạn có thể thấy dân số tối thiểu / tối đa phù hợp hơn. Cũng tìm kiếm điểm z


1

Để thêm vào các câu trả lời khác gợi ý pnorm ...

Đối với một phương pháp tối ưu tiềm năng để chọn tham số, tôi đề nghị xấp xỉ này cho pnorm.

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

nhạn

Đây thực chất là chuẩn hóa Softmax.

Tham chiếu Pnorm trong một nhúm


1

Có hai cách để thực hiện điều này mà tôi thường sử dụng. Tôi luôn làm việc với dữ liệu thời gian thực, vì vậy điều này giả định đầu vào liên tục. Đây là một số mã giả:

Sử dụng một minmax có thể huấn luyện:

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]

Hàm này yêu cầu bạn thực hiện giai đoạn huấn luyện ban đầu (bằng cách sử dụng calibrate()) hoặc bạn đào tạo lại theo các khoảng thời gian nhất định hoặc theo các điều kiện nhất định. Ví dụ, hãy tưởng tượng một chức năng như thế này:

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

đỉnh và máng thông thường không nhận được giá trị, nhưng nếu outBounds()nhận được giá trị lớn hơn 1,5 lần so với đỉnh hiện tại hoặc nhỏ hơn máng hiện tại chia cho 1,5, thì calibrate()được gọi là cho phép hàm tự động hiệu chỉnh lại.

Sử dụng một minmax lịch sử:

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

Tất cả điều này có thể được thực hiện trong Max / MSP / Jitter với các đối tượng [đỉnh] và [máng] cho ví dụ đầu tiên và với [jit.3m] cho ví dụ thứ hai.
sân thượng

0

Một tùy chọn rất đơn giản là chia mỗi số trong dữ liệu của bạn cho số lớn nhất trong dữ liệu của bạn. Nếu bạn có nhiều số nhỏ và một vài số rất lớn, điều này có thể không truyền tải thông tin tốt. Nhưng nó tương đối dễ dàng; nếu bạn nghĩ rằng thông tin có ý nghĩa bị mất khi bạn vẽ biểu đồ dữ liệu như thế này, bạn có thể thử một trong những kỹ thuật phức tạp hơn mà những người khác đã đề xuất.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.