【发布时间】:2021-10-02 16:17:29
【问题描述】:
我有一堆来自网络的名字(名字,姓氏,来自不同国家的人)。一些国家/地区统计了每个姓氏有多少人,如here等一些地方所示。
嗯,那个日本姓氏列表只列出了前 100 名。我还有其他的名单,比如越南人列出了前 20 名,甚至在某些地方也列出了前 50 名或 1000 名。但我有 真实 的名单,最多可达 1000 多个。所以我可能有 2000 个日本姓氏,其中只有 100 个列出了该姓氏的实际人数。
我想做的是构建一个“伪造”类的库,它会根据这些统计数据生成真实的名称。我知道如何在 JavaScript 中pick a random element from a weighted array,所以一旦每个名字都包含“权重”(具有该名字的人数),只需将其插入该算法即可。
我的问题是,我如何才能在没有权重的名称上“完成曲线”?也就是说,假设我们有一个类似指数的曲线,来自 20 或 100 个具有权重的名称。然后我想从剩余的未加权列表中随机选择名称,并给它们一个值,使它们在曲线的剩余尾部有点现实。怎么可能?
例如,这里有一个带有权重的越南名字列表:
Nguyen,38
Tran,11
Le,9.5
Pham,7.1
Huynh,5.1
Phan,4.5
Vu,3.9
Đang,2.1
Bui,2
Do,1.4
Ho,1.3
Ngo,1.3
Duong,1
Ly,0.5
这是一个没有权重的列表:
An
Ân
Bạch
Bành
Bao
Biên
Biện
Cam
Cảnh
Cảnh
Cao
Cái
Cát
Chân
Châu
Chiêm
Chu
Chung
Chử
Cổ
Cù
Cung
Cung
Củng
Cừu
Dịch
Diệp
Doãn
Dũ
Dung
Dư
Dữu
Đái
Đàm
Đào
Đậu
Điền
Đinh
Đoàn
Đồ
Đồng
Đổng
Đường
Giả
Giải
Gia
Giản
Giang
Giáp
Hà
Hạ
Hậ
Hác
Hàn
Hầu
Hình
Hoa
Hoắc
Hoạn
Hồng
Hứa
Hướng
Hy
Kha
Khâu
Khổng
Khuất
Kiều
Kim
Kỳ
Kỷ
La
Lạc
Lai
Lam
Lăng
Lãnh
Lâm
Lận
Lệ
Liên
Liêu
Liễu
Long
Lôi
Lục
Lư
Lữ
Lương
Lưu
Mã
Mạc
Mạch
Mai
Mạnh
Mao
Mẫn
Miêu
Minh
Mông
Ngân
Nghê
Nghiêm
Ngư
Ngưu
Nhạc
Nhan
Nhâm
Nhiếp
Nhiều
Nhung
Ninh
Nông
Ôn
Ổn
Ông
Phí
Phó
Phong
Phòng
Phù
Phùng
Phương
Quách
Quan
Quản
Quang
Quảng
Quế
Quyền
Sài
Sầm
Sử
Tạ
Tào
Tăng
Tân
Tần
Tất
Tề
Thạch
Thai
Thái
Thang
Thành
Thảo
Thân
Thi
Thích
Thiện
Thiệu
Thôi
Thủy
Thư
Thường
Tiền
Tiết
Tiêu
Tiêu
Tô
Tôn
Tôn
Tông
Tống
Trác
Trạch
Trại
Trang
Trầm
Trâu
Trì
Triệu
Trịnh
Trương
Từ
Tư
Tưởng
Úc
Ứng
Vạn
Văn
Vân
Vi
Vĩnh
Vũ
Vũ
Vương
Vưu
Xà
Xầm
Xế
Yên
我想随机化没有权重的列表(很容易做到),然后为每个列表分配一个权重,以便它在某种程度上填充曲线的尾部,所以感觉有点现实。如何才能做到这一点?基本上,我们似乎需要获得初始加权曲线的“曲率”,然后以某种方式用新项目扩展它。它不需要是完美的,但任何可以做的近似都是很酷的。我不是统计/数学人,所以我真的不知道从哪里开始。
我没有想要的确切结果,我只是想要在某种程度上产生曲线尾部的东西。例如,列表的开头可能如下所示:
An,0.5
Ân,0.45
Bạch,0.42
Bành,0.40
Bao,0.39
...
为了尝试直观地展示我的目标,下面的黑框是提供的数据。虚线框会延伸很长一段时间,但在这里我展示了它的开始。虚线框是我们将在曲线中填充的内容,使其适合曲线起点的形状。
▐
▐
▐▐
▐▐
▐▐
▐▐▐
▐▐▐
▐▐▐▐
▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░░░░░░░░░░░░░░░░░░
▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐▐░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░░
所以基本上,曲线的左侧是少数几个最高值。当它向右移动时,它会根据“一些”模式变小。我们只需要大致将模式继续向右,所以它基本上延伸了曲线。
【问题讨论】:
-
你有想要的结果的例子吗?
-
@NinaScholz 我添加了一个视觉效果来展示我想要达到的效果。
标签: javascript statistics curve-fitting