Tìm nếu hai bộ dữ liệu gần nhau


7

Tôi có ba bộ dữ liệu sau đây.

data_a=[0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87,0.91,0.94,0.97]
data_b=[0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
data_c=[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]

data_a là dữ liệu thực và hai dữ liệu còn lại là dữ liệu mô phỏng. Ở đây tôi đang cố gắng kiểm tra xem cái nào (data_b hoặc data_c) gần nhất hoặc gần giống với data_a. Hiện tại tôi đang thực hiện nó một cách trực quan và với bài kiểm tra ks_2samp (python).

Trực quan

Tôi đã vẽ đồ thị của cdf dữ liệu thực so với cdf của dữ liệu mô phỏng và thử xem trực quan cái nào gần nhất.

cdf của data_a so với data_b

Trên đây là cdf của data_a so với cdf của data_b nhập mô tả hình ảnh ở đây

Trên đây là cdf của data_a so với cdf của data_c

Vì vậy, bằng cách nhìn trực quan, người ta có thể nói rằng data_c gần với data_a hơn data_b nhưng nó vẫn không chính xác.

Kiểm tra KS

Phương pháp thứ hai là kiểm tra KS nơi tôi đã kiểm tra data_a với data_b cũng như data_a với data_c.

>>> stats.ks_2samp(data_a,data_b)
Ks_2sampResult(statistic=0.5923076923076923, pvalue=0.02134674813035231)
>>> stats.ks_2samp(data_a,data_c)
Ks_2sampResult(statistic=0.4692307692307692, pvalue=0.11575018162481227)

Từ trên chúng ta có thể thấy rằng số liệu thống kê thấp hơn khi chúng tôi kiểm tra data_a với data_c vì vậy data_c nên gần data_a hơn data_b. Tôi đã không xem xét giá trị vì sẽ không phù hợp khi nghĩ về nó như một thử nghiệm giả thuyết và sử dụng giá trị p thu được vì thử nghiệm được thiết kế với giả thuyết null được xác định trước.

Vì vậy, câu hỏi của tôi ở đây là nếu tôi đang làm điều này một cách chính xác và cũng có cách nào khác tốt hơn để làm điều đó ??? Cảm ơn bạn


1
Bạn có chắc chắn đó là những lô CDF của dữ liệu? Các lô CDF theo kinh nghiệm của dữ liệu đó là những . Có vẻ như bạn đang vẽ các giá trị trên trục y trên một số trục x tiêu chuẩn. Là các giá trị trong các quan sát hoặc điểm thay đổi của bạn trên CDF?
Edmund

@FHRehhh Xin chào Tôi không vẽ hai ô này trong một tập duy nhất vì có hàng trăm bộ dữ liệu khác tôi cần so sánh với tập dữ liệu thực và tìm ra tập nào gần nhất với tập dữ liệu thực. Về cơ bản, tôi đang cố gắng xấp xỉ một tham số đang tạo ra các bộ dữ liệu mô phỏng khác nhau ở các giá trị khác nhau và khi tập dữ liệu mô phỏng gần nhất với tập dữ liệu thực thì có tham số đúng!
Kartikeya Sharma

@Edmund Tôi nghĩ bạn đúng, những giá trị đó là quan sát biến và tôi đang vẽ các giá trị trên trục y qua một số trục x tiêu chuẩn. x_points=np.asarray(list(range(0,len(data_a)))) >>> x_points=x_points/len(data_a) >>> plt.plot(x_points,data_a) >>> x_points=np.asarray(list(range(0,len(data_b)))) >>> x_points=np.asarray(list(range(0,len(data_c)))) >>> x_points=x_points/len(data_c) >>> plt.plot(x_points,data_c) Đây là mã. Nhưng câu hỏi của tôi là làm thế nào người ta có thể tìm thấy sự gần gũi giữa hai bộ dữ liệu
Kartikeya Sharma

2
Sẽ không tốt hơn nếu chỉ phù hợp với phân phối cho dữ liệu được quan sát? Có vẻ hơi phức tạp và tốn kém về mặt tính toán bằng cách đoán các tham số, mô phỏng kết quả và kiểm tra độ tương tự.
Edmund

1
Điều này cảm thấy rất giống như một vấn đề XY . Vui lòng chia sẻ vấn đề bạn đang cố gắng giải quyết thay vì phần này của giải pháp cho vấn đề.
Edmund

Câu trả lời:


5

Bạn có thể thực hiện một cách tiếp cận Lý thuyết thông tin bằng cách tìm ra sự phân kỳ Kibbackback Leibler thấp nhất giữa các bản phân phối. Có một tùy chọn phân kỳ KL trong hàm entropy của SciPy .

>>> from scipy.stats import entropy

>>> p = [0.21,0.24,0.36,0.56,0.67,0.72,0.74,0.83,0.84,0.87] # Data removed to make equal sizes: [0.91,0.94,0.97]
>>> q_1 = [0.13,0.21,0.27,0.34,0.36,0.45,0.49,0.65,0.66,0.90]
>>> print(entropy(p, q_1)) 
0.019822015024454846

>>> q_2 =[0.14,0.18,0.19,0.33,0.45,0.47,0.55,0.75,0.78,0.82]
>>> print(entropy(p, q_2))
0.01737229446663193

Phân phối mô phỏng thứ hai gần hơn phân phối mô phỏng thứ nhất so với phân phối thực.

Nếu bạn quan tâm đến suy luận, bạn có thể chạy nhiều mô phỏng và tính toán giá trị p. Quá trình đó là một biến thể của thử nghiệm hoán vị .


Cảm ơn bạn đã trả lời nhưng tại sao bạn lại xóa dữ liệu khỏi bản phân phối thực sự. Tôi hiểu rằng phương pháp scipy sẽ chỉ hoạt động với các bộ dữ liệu bằng nhau nhưng yếu tố nào của dữ liệu cần loại bỏ hoặc tại sao? Ở đây tôi thấy bạn đã loại bỏ những người cuối cùng. Cũng không có cách nào để làm cho nó hoạt động trên các bộ dữ liệu không đồng đều?
Kartikeya Sharma

3
Tôi tự ý loại bỏ dữ liệu để làm cho mẫu mã làm việc. Nếu đó là dự án của tôi, tôi sẽ không xóa dữ liệu thực. Tôi sẽ mô phỏng dữ liệu có cùng kích thước với dữ liệu thực. Việc xử lý các bộ dữ liệu không đồng đều sẽ không cần thiết vì tôi sẽ tạo dữ liệu có kích thước bằng nhau. Vì đây là dự án của bạn, bạn có thể chọn loại bỏ dữ liệu nếu bạn chọn sử dụng phương pháp phân kỳ KL của SciPy.
Brian Spiering

2

Xem xét sử dụng Khoảng cách của Earth Mover (tức là khoảng cách Wasserstein-1 ), có thể được sử dụng (tương tự như phân kỳ KL) để tính "khoảng cách" giữa các tập hợp điểm (hay đúng hơn là phân bố theo kinh nghiệm do chúng gây ra). Có một phương pháp trong scipy cho nó, cũng như thư viện này .

Một số lưu ý:

  • Bạn không cần phải có cùng số điểm trong mỗi bộ (EMD cho phép "tách" khối lượng).
  • Một lợi thế so với phân kỳ KL là KLD có thể không xác định hoặc vô hạn nếu các bản phân phối không có sự hỗ trợ giống hệt nhau (mặc dù sử dụng phân kỳ Jensen-Shannon làm giảm nhẹ điều này). Hơn nữa, ước tính entropies thường khó và không có tham số (thường yêu cầu binning hoặc KDE), trong khi người ta có thể giải quyết tối ưu hóa EMD trực tiếp trên các điểm dữ liệu đầu vào.
  • Một lợi thế so với thống kê đơn giản (ví dụ, so sánh các phương tiện và hiệp phương sai, hoặc định mức) là chúng có xu hướng mất thông tin. Ví dụ, khớp hai khoảnh khắc đầu tiên không bắt buộc khoảnh khắc thứ ba khớp với nhau; hoặc, hai bộ dữ liệu có thể có cùng định mức mặc dù rất khác nhau (đối vớin điểm, mọi điểm trên n-hyper-sphere có cùng bán kính có định mức giống hệt nhau). Ngược lại, EMD phải xem xét mối quan hệ của mọi điểm trong một tập hợp với mọi điểm ở điểm khác.
  • Tôi xem xét sử dụng thử nghiệm KS hoàn toàn hợp lý. Xem thêm bài này . Một cảnh báo là việc sử dụng supremum của nó là một chút cực đoan. Chẳng hạn, một bản phân phối có độ lệch CDF lớnδ tại một số thời điểm và rất gần với thời gian còn lại so với thời gian khác đi δϵ cho một số nhỏ ϵnhiều lần - thống kê của KS sẽ thích cái trước. Nó là tùy thuộc vào bạn cho dù điều đó có ý nghĩa.

1

Vì chúng ta không nên xóa bất kỳ dữ liệu nào ... chúng ta có thể sử dụng định mức vectơ từ gốc (định mức l2)

data_a, data_b, data_c là các mảng.

 import numpy as np    
 import pandas as pd
 from numpy.linalg import norm
 l2_a=norm(data_a)
 l2_b=norm(data_b)
 l2_c=norm(data_c)
 print(l2_a,l2_b,l2_c)

đầu ra : 2.619885493680974 1.5779100101083077 1.6631897065578538.

vì l2_a, các giá trị l2_c gần nhau hơn, data_a và data_c gần nhau.

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.