สมมติว่าฉันมีค่าซึ่งบางครั้งก็ทำซ้ำ ฉันต้องการประเมินจำนวนรวมของค่าที่ไม่ซ้ำกันในชุดใหญ่
หากฉันสุ่มตัวอย่างค่าและพิจารณาว่ามีค่าที่ไม่ซ้ำกันของฉันสามารถใช้สิ่งนี้เพื่อประเมินจำนวนค่าที่ไม่ซ้ำในชุดขนาดใหญ่ได้หรือไม่T u
สมมติว่าฉันมีค่าซึ่งบางครั้งก็ทำซ้ำ ฉันต้องการประเมินจำนวนรวมของค่าที่ไม่ซ้ำกันในชุดใหญ่
หากฉันสุ่มตัวอย่างค่าและพิจารณาว่ามีค่าที่ไม่ซ้ำกันของฉันสามารถใช้สิ่งนี้เพื่อประเมินจำนวนค่าที่ไม่ซ้ำในชุดขนาดใหญ่ได้หรือไม่T u
คำตอบ:
นี่คือบทความทั้งหมดเกี่ยวกับปัญหาโดยสรุปวิธีการต่าง ๆ มันเรียกว่าการประมาณค่าที่แตกต่างในวรรณคดี
ถ้าฉันต้องทำสิ่งนี้ด้วยตัวเองโดยไม่ต้องอ่านเอกสารแฟนซีฉันจะทำสิ่งนี้ ในการสร้างแบบจำลองภาษาเรามักจะต้องประเมินความน่าจะเป็นในการสังเกตคำที่ไม่รู้จักก่อนหน้านี้โดยให้ข้อความเป็นจำนวนมาก แนวทางที่ดีในการแก้ปัญหานี้สำหรับแบบจำลองภาษาโดยเฉพาะคือการใช้จำนวนคำที่เกิดขึ้นเพียงครั้งเดียวหารด้วยจำนวนโทเค็นทั้งหมด มันเรียกว่าการคาดการณ์ที่ดี
ให้ u1 เป็นจำนวนค่าที่เกิดขึ้นหนึ่งครั้งในตัวอย่างของรายการ m
P[new item next] ~= u1 / m.
ให้คุณเป็นจำนวนรายการที่ไม่ซ้ำกันในตัวอย่างขนาด m
หากคุณเข้าใจผิดว่าอัตรา 'รายการใหม่ถัดไป' ไม่ลดลงเมื่อคุณได้รับข้อมูลเพิ่มเติมจากนั้นใช้ Good Turing คุณจะมี
total uniq set of size s ~= u + u1 / m * (s - m)
สิ่งนี้มีพฤติกรรมที่น่ารังเกียจเนื่องจาก u1 มีขนาดเล็กมาก แต่นั่นอาจไม่เป็นปัญหาสำหรับคุณในทางปฏิบัติ
s
ในกรณีนี้หรือไม่? จำนวนทั้งหมดของ 'คำ'?
s
เกิดขึ้นสองครั้งในเรื่องนี้ทั้งขนาดซ้ายและขวาใช่ไหม
กลยุทธ์การจำลอง
เก็บmสุ่มตัวอย่างขนาดnจากชุดS สำหรับตัวอย่างmแต่ละตัวให้คำนวณจำนวนuของค่าที่ไม่ซ้ำกันและหารด้วยnเพื่อทำให้เป็นมาตรฐาน จากการแจกแจงแบบจำลองของ normalized u , คำนวณสถิติสรุปความสนใจ (เช่นค่าเฉลี่ย, ค่าความแปรปรวน, ช่วง interquartile) คูณค่าเฉลี่ยของการจำลองของu ที่ทำให้เป็นมาตรฐานโดย cardinality ของSเพื่อประมาณจำนวนค่าที่ไม่ซ้ำกัน
ยิ่งค่ายิ่งใหญ่คือmและnยิ่งค่าเฉลี่ยที่จำลองขึ้นของคุณนั้นตรงกับจำนวนที่แท้จริงของค่าที่ไม่ซ้ำกันมากขึ้น
นี่คือการดำเนินการสำหรับหมีแพนด้า:
import math
import numpy as np
from collections import Counter
def estimate_uniqueness(df, col, r=10000, n=None):
""" Draws a sample of size r from column col from dataframe df and
returns an estimate for the number of unique values given a
population size of n """
n = n or df.shape[0]
sample = df[col][np.random.randint(0, n, r)]
counts = sample.value_counts()
fis = Counter(counts)
estimate = math.sqrt(n / r) * fis[1] + sum([fis[x] for x in fis if x > 1])
return estimate
อาศัยส่วนที่ 2 และ 4 ของบทความนี้: http://ftp.cse.buffalo.edu/users/azhang/disc/disc01/cd1/out/papers/pods/towardsestimatimosur.pdf