শীর্ষ ফ্রিকোয়েন্সিগুলির একটি সেট থেকে জিপফের আইন সহগকে কীভাবে গণনা করা যায়?


25

আমার বেশ কয়েকটি ক্যোয়ারী ফ্রিকোয়েন্সি রয়েছে এবং আমার জিপফের আইনটির সহগের অনুমান করতে হবে। এগুলি শীর্ষ ফ্রিকোয়েন্সি:

26486
12053
5052
3033
2536
2391
1444
1220
1152
1039

উইকিপিডিয়া পৃষ্ঠা অনুসারে জিপফের আইনের দুটি পরামিতি রয়েছে। উপাদানসমূহের সংখ্যা N এবং s এর যোগফল। আপনার ক্ষেত্রে কী N, 10? এবং সরবরাহিত সমস্ত মানগুলির যোগফলের মাধ্যমে আপনার সরবরাহিত মানগুলি ভাগ করে ফ্রিকোয়েন্সিগুলি গণনা করা যায়?
এমপিটকাস

এটি দশটি হোক এবং সমস্ত সরবরাহিত মানের যোগফলের মাধ্যমে আপনার সরবরাহিত মানগুলি ভাগ করে ফ্রিকোয়েন্সি গণনা করা যেতে পারে .. আমি কীভাবে অনুমান করতে পারি?
দিয়াগোলো

উত্তর:


22

আপডেট @ স্বেচ্ছাসেবীর পরামর্শ অনুযায়ী সর্বাধিক সম্ভাবনা অনুমানের সাথে কোডটি আপডেট করেছি। লগ তাত্ত্বিক সম্ভাব্যতা এবং লগ ফ্রিকোয়েন্সিগুলির মধ্যে পার্থক্যগুলির স্কোয়ারের পরিমাণ হ্রাস করা যদিও একটি উত্তর দেয় তবে এটি কোনও প্রকারের এম-অনুমানক হিসাবে দেখানো যেতে পারে তবে একটি পরিসংখ্যানিক প্রক্রিয়া হবে। দুর্ভাগ্যক্রমে আমি কোনও ফলাফলই দিতে পারি না যা একই ফলাফল দিতে পারে।

আমার চেষ্টা এখানে। আমি ফ্রিকোয়েন্সিগুলির লোগারিদম গণনা করি এবং এই সূত্রের দ্বারা প্রদত্ত তাত্ত্বিক সম্ভাবনার লগারিদমে তাদের ফিট করার চেষ্টা করি । চূড়ান্ত ফলাফলটি যুক্তিসঙ্গত বলে মনে হয়। এখানে আমার কোডটি আর।

fr <- c(26486, 12053, 5052, 3033, 2536, 2391, 1444, 1220, 1152, 1039)

p <- fr/sum(fr)

lzipf <- function(s,N) -s*log(1:N)-log(sum(1/(1:N)^s))

opt.f <- function(s) sum((log(p)-lzipf(s,length(p)))^2)

opt <- optimize(opt.f,c(0.5,10))

> opt
$minimum
[1] 1.463946

$objective
[1] 0.1346248

এরপরে সেরা চতুর্ভুজ ফিট s=1.47

আর এর সর্বাধিক সম্ভাবনা mleফাংশন ( stats4প্যাকেজ থেকে ) দিয়ে সম্পাদন করা যেতে পারে , যা সহায়কভাবে স্ট্যান্ডার্ড ত্রুটিগুলি গণনা করে (যদি সঠিক নেতিবাচক সর্বাধিক সম্ভাবনা ফাংশন সরবরাহ করা হয়):

ll <- function(s) sum(fr*(s*log(1:10)+log(sum(1/(1:10)^s))))

fit <- mle(ll,start=list(s=1))

> summary(fit)
Maximum likelihood estimation

Call:
mle(minuslogl = ll, start = list(s = 1))

Coefficients:
  Estimate  Std. Error
s 1.451385 0.005715046

-2 log L: 188093.4 

এখানে লগ-লগ স্কেলের ফিটগুলির গ্রাফটি দেওয়া হয়েছে (আবার @ শুভ্রের পরামর্শ অনুসারে):

s.sq <- opt$minimum
s.ll <- coef(fit)

plot(1:10,p,log="xy")
lines(1:10,exp(lzipf(s.sq,10)),col=2)
lines(1:10,exp(lzipf(s.ll,10)),col=3)

লাল রেখাটি বর্গক্ষেত্রের সমষ্টি, সবুজ রেখাটি সর্বাধিক সম্ভাবনার ফিট।

ফিট লগ-লগ গ্রাফ


1
একটি আর প্যাকেজ জিপফআর cran.r-project.org/web/packages/zipfR/index.html আমি চেষ্টা করেও দেখিনি
onestop

ইউনেস্টপ, লিঙ্কটির জন্য ধন্যবাদ। এই প্যাকেজটি ব্যবহার করে কেউ যদি এই প্রশ্নের উত্তর দেয় তবে ভাল লাগবে। আমার সমাধানটিতে অবশ্যই গভীরতার অভাব রয়েছে, যদিও এটি একরকম উত্তর দেয়।
এমপিটকাস

(+1) আপনি সত্যিই চিত্তাকর্ষক। বিভিন্ন বিভিন্ন পরিসংখ্যান ক্ষেত্রে এত ভাল অবদান!
chl

@ সিএল, ধন্যবাদ! আমি অবশ্যই অনুভব করি যে এই সাইটের মধ্যে এই জাতীয় বৈশিষ্ট্যগুলি সহ আমি একমাত্র নই;)
এমপিটকাস

25

যে কোনও অনুমানের সমস্যায় আমাদের সামনে বেশ কয়েকটি সমস্যা রয়েছে:

  1. প্যারামিটারটি অনুমান করুন।

  2. সেই অনুমানের গুণমানটি মূল্যায়ন করুন।

  3. ডেটা অন্বেষণ করুন।

  4. ফিট মূল্যায়ন।

যারা বোঝার জন্য এবং যোগাযোগের জন্য পরিসংখ্যানগত পদ্ধতি ব্যবহার করবেন তাদের ক্ষেত্রে প্রথমটি অন্যদের ছাড়া কখনই করা উচিত নয়।

জন্য প্রাক্কলন এটি ব্যবহার করতে সুবিধাজনক maximimum সম্ভাবনা (এমএল)। ফ্রিকোয়েন্সিগুলি এত বড় যে আমরা সুপরিচিত অ্যাসিপটোটিক বৈশিষ্ট্যগুলি ধরে রাখতে আশা করতে পারি। এমএল ডেটা অনুমানের সম্ভাবনা বিতরণ ব্যবহার করে। Zipf ব্যবস্থা সম্ভাব্যতা supposes জন্য সমানুপাতিক হয় আমি - গুলি কিছু ধ্রুবক ক্ষমতার গুলি (সাধারণত গুলি > 0 )। যেহেতু এই সম্ভাবনাগুলি অবশ্যই unityক্যের সমষ্টি হতে পারে, আনুপাতিকতার ধ্রুবকটি যোগফলের পারস্পরিকi=1,2,,nisss>0

Hs(n)=11s+12s++1ns.

i1n

log(Pr(i))=লগ(আমি-গুলিএইচগুলি(এন))=-গুলিলগ(আমি)-লগ(এইচগুলি(এন))

আমি,আমি=1,2,...,এন

pr(1,2,...,এন)=pr(1)1pr(2)2pr(এন)এন

সুতরাং ডেটা জন্য লগ সম্ভাবনা হয়

Λ(গুলি)=-গুলিΣআমি=1এনআমিলগ(আমি)-(Σআমি=1এনআমি)লগ(এইচগুলি(এন))

গুলি

s^=1.45041Λ(s^)=94046.7s^ls=1.463946Λ(s^ls)=94049.5

গুলি[1,43922,1,46162]

জিপফের আইনের প্রকৃতি প্রদত্ত, এই ফিটটি গ্রাফ করার সঠিক উপায়টি একটি লগ-লগ প্লটের উপর রয়েছে , যেখানে ফিটটি লিনিয়ার হবে (সংজ্ঞা অনুসারে):

এখানে চিত্র বর্ণনা লিখুন

ফিটের উপকারের মূল্যায়ন করতে এবং ডেটা অন্বেষণ করতে, অবশিষ্টাংশগুলি (ডেটা / ফিট, লগ-লগ অক্ষগুলি আবার) দেখুন:

এখানে চিত্র বর্ণনা লিখুন

χ2=656,476


কারণ অবশিষ্টাংশগুলি এলোমেলো প্রদর্শিত হয়, কিছু অ্যাপ্লিকেশনগুলিতে আমরা জিপ্ফের আইন (এবং প্যারামিটারের আমাদের অনুমান) ফ্রিকোয়েন্সিগুলির গ্রহণযোগ্য বর্ণনা হিসাবে গ্রহণযোগ্য হতে পারি । এই বিশ্লেষণটি দেখায়, যদিও এটি অনুমান করা ভুল হবে যে এই অনুমানটির এখানে পরীক্ষিত ডেটাসেটের জন্য কোনও ব্যাখ্যামূলক বা ভবিষ্যদ্বাণীমূলক মান রয়েছে।


1
@ হুবুহু, আমি উপরে বর্ণিত সূত্রটি দিয়ে বিনীতভাবে একটু সাবধানতার পরামর্শ দিতে পারি। জিপফের আইন সাধারণত আপেক্ষিক-ফ্রিকোয়েন্সি ফলাফল হিসাবে বলা হয়। কোনও আইডির নমুনা আঁকলে তা বিতরণ করা হয় না (সাধারণত বিবেচিত)। একটি আইড কাঠামো এই ডেটাগুলির জন্য সম্ভবত সেরা ধারণা নয়। সম্ভবত আমি এই পরে আরও পোস্ট করব।
কার্ডিনাল

3
@ কার্ডিনাল আমি আপনাকে যা বলতে চাই তার অপেক্ষায় রয়েছি। যদি আপনার কাছে পুরোপুরি প্রতিক্রিয়ার জন্য সময় না থাকে তবে আপনি কী মনে করেন যে "এই ডেটাগুলির জন্য সেরা ধারণা" হতে পারে তার একটি স্কেচও সবচেয়ে স্বাগত। আপনি অনুগ্রহ করে কোথায় যাচ্ছেন তা অনুমান করতে পারি: ডেটা র‌্যাঙ্ক করা হয়েছে, এমন একটি প্রক্রিয়া যা নির্ভরতা তৈরি করে এবং র‌্যাঙ্কিংয়ের সম্ভাব্য প্রভাবগুলি চিহ্নিত না করে আমার প্রাপ্ত সম্ভাবনাটি রক্ষা করা উচিত। সাউন্ডারের ন্যায়সঙ্গততার সাথে একটি অনুমানের পদ্ধতিটি দেখতে ভাল লাগবে। আমি আশাবাদী, যদিও আমার বিশ্লেষণটি ডেটাসেটের নিখরচায় আকারে উদ্ধার করা যেতে পারে।
whuber

1
@ কার্ডিনাল, আমাদের উপর ফর্ম্যাট করবেন না :) অন্যান্য উত্তরদাতাদের তুলনায় আপনার যদি কিছু আলাদা অন্তর্দৃষ্টি থাকে তবে পৃথক উত্তরে এটি নির্দ্বিধায় নির্দ্বিধায় অনুভব করা সত্ত্বেও, যদিও এটি প্রতি সেউতে একটি বৈধ উত্তর গঠন করবে না। ইন math.SE উদাহরণস্বরূপ ধরনের পরিস্থিতি খুব ঘন ঘন উঠা।
এমপিটকাস

1
@ কার্ডিনাল সহজেই উদাহরণস্বরূপ, আপনি ফ্রিকোয়েন্সি সংগ্রহ করেন এবং দশটিকে সর্বোচ্চ শনাক্ত করেন এবং র‌্যাঙ্ক করেন। আপনি জিপফের আইন অনুমান করেন ize আপনি ফ্রিকোয়েন্সিগুলির একটি নতুন সেট সংগ্রহ করেন এবং পূর্ববর্তী র‌্যাঙ্কিং অনুযায়ী তাদের প্রতিবেদন করুন । যে IID অবস্থা, যা আমার বিশ্লেষণ পুরোপুরি উপযুক্ত হয়, এর সাপেক্ষ পুরনো সঙ্গে সম্মত নতুন পদমর্যাদার ওপর।
whuber

1
@ শুভ, আপনার ধৈর্য জন্য ধন্যবাদ আপনার যুক্তির ধারায় আমি এখন সম্পূর্ণ পরিষ্কার clear স্যাম্পলিং মডেলের অধীনে আপনি এখন পুরোপুরি ফুসকুড়ি পেয়েছেন, আমি আপনার বিশ্লেষণের সাথে একমত। সম্ভবত আপনার শেষ বক্তব্যটি এখনও কিছু পিছলে। বাছাই করা যদি আপনার পদ্ধতি রক্ষণশীলতার চেয়ে দৃ strong় নির্ভরশীলতা প্ররোচিত করে না। উত্সাহিত নির্ভরতা যদি মাঝারিভাবে দৃ strong় হয় তবে এটি অ্যান্টিকনজারভেটিভ হয়ে উঠতে পারে। আমার পদযুগলের মুখে ধৈর্য্য আপনার জন্য।
কার্ডিনাল

2

সর্বাধিক সম্ভাবনা অনুমানগুলি প্যারামিটারের কেবলমাত্র পয়েন্ট অনুমান গুলি। অনুমানের আত্মবিশ্বাসের ব্যবধানও খুঁজে পেতে অতিরিক্ত প্রচেষ্টা করা দরকার। সমস্যাটি হ'ল এই ব্যবধানটি সম্ভাব্য নয়। কেউ "প্যারামিটার মান s = ... সীমার মধ্যে 95% সম্ভাব্যতার সাথে বলতে পারে না [...]"।

পাইএমসি 3 এর মতো একটি সম্ভাব্য প্রোগ্রামিং ল্যাঙ্গুয়েজ এই অনুমানটিকে তুলনামূলকভাবে সোজা করে তোলে । অন্যান্য ভাষাগুলিতে স্টান রয়েছে যার দুর্দান্ত বৈশিষ্ট্য এবং সহায়ক সম্প্রদায় রয়েছে।

এখানে মডেল (এছাড়াও Ops ডেটার উপর লাগানো আমার পাইথন বাস্তবায়ন গিটহাব ):

import theano.tensor as tt
import numpy as np
import pymc3 as pm
import matplotlib.pyplot as plt

data = np.array( [26486, 12053, 5052, 3033, 2536, 2391, 1444, 1220, 1152, 1039] )

N = len( data )

print( "Number of data points: %d" % N )

def build_model():
    with pm.Model() as model:
        # unsure about the prior...
        #s = pm.Normal( 's', mu=0.0, sd=100 )
        #s = pm.HalfNormal( 's', sd=10 )
        s = pm.Gamma('s', alpha=1, beta=10)

        def logp( f ):
            r = tt.arange( 1, N+1 )
            return -s * tt.sum( f * tt.log(r) ) - tt.sum( f ) * tt.log( tt.sum(tt.power(1.0/r,s)) )

        pm.DensityDist( 'obs', logp=logp, observed={'f': data} )

    return model


def run( n_samples=10000 ):
    model = build_model()
    with model:
        start = pm.find_MAP()
        step = pm.NUTS( scaling=start )
        trace = pm.sample( n_samples, step=step, start=start )

    pm.summary( trace )
    pm.traceplot( trace )
    pm.plot_posterior( trace, kde_plot=True )
    plt.show()

if __name__ == '__main__':
    run()

এখানে প্যারামিটারের অনুমান গুলিবিতরণ আকারে। লক্ষ্য করুন কতটা কমপ্যাক্ট অনুমান! প্যারামিটারের প্রকৃত মান 95% হওয়ার সম্ভাবনা সহগুলিসীমার মধ্যে [1.439,1.461]; গড়টি প্রায় 1.45, যা এমএলই অনুমানের খুব কাছাকাছি।

এখানে চিত্র বর্ণনা লিখুন

কিছু মৌলিক নমুনা নির্ণয়ের জন্য, আমরা দেখতে পাচ্ছি যে নমুনাটি "ভালভাবে মিশ্রিত" হয়েছিল কারণ আমরা ট্রেসটিতে কোনও কাঠামো দেখতে পাই না:

এখানে চিত্র বর্ণনা লিখুন

কোডটি চালনার জন্য, থিয়ানো এবং পাইএমসি 3 প্যাকেজ ইনস্টল থাকা পাইথন লাগাতে হবে।

তার দুর্দান্ত উত্তর এবং মন্তব্যের জন্য @ ডাব্লু-হুবারকে ধন্যবাদ!


1

এখানে ভিজিএএম ব্যবহার করে ডেটা ফিট করার, মূল্যায়ন ও ফলাফলগুলি সন্ধানের জন্য আমার প্রয়াস:

require("VGAM")

freq <- dzipf(1:100, N = 100, s = 1)*1000 #randomizing values
freq <- freq  + abs(rnorm(n=1,m=0, sd=100)) #adding noize

zdata <- data.frame(y = rank(-freq, ties.method = "first") , ofreq = freq)
fit = vglm(y ~ 1, zipf, zdata, trace = TRUE,weight = ofreq,crit = "coef")
summary(fit)

s <- (shat <- Coef(fit)) # the coefficient we've found
probs <- dzipf(zdata$y, N = length(freq), s = s) # expected values
chisq.test(zdata$ofreq, p = probs) 
plot(zdata$y,(zdata$ofreq),log="xy") #log log graph
lines(zdata$y, (probs)*sum(zdata$ofreq),  col="red") # red line, num of predicted frequency

এখানে চিত্র বর্ণনা লিখুন

    Chi-squared test for given probabilities

data:  zdata$ofreq
X-squared = 99.756, df = 99, p-value = 0.4598

আমাদের ক্ষেত্রে চি স্কোয়ারের নাল অনুমানগুলি হ'ল জিপফের আইন অনুসারে ডেটা বিতরণ করা হয়, সুতরাং বৃহত্তর পি-মানগুলি এই দাবিটিকে সমর্থন করে যে ডেটা এটি অনুসারে বিতরণ করা হয়েছে। মনে রাখবেন যে এমনকি খুব বড় পি-মানগুলি কোনও প্রমাণ নয়, কেবল একটি সূচক।


0

কেবল মজাদার জন্য, এটি অন্য একটি উদাহরণ যেখানে ইউডাব্লুএসই শুধুমাত্র শীর্ষের সবচেয়ে বেশি ফ্রিকোয়েন্সি ব্যবহার করে একটি বদ্ধ ফর্ম সমাধান সরবরাহ করতে পারে - যদিও নির্ভুলতার ব্যয়ে। সম্ভাবনা অনএক্স=1প্যারামিটার মানগুলিতে অনন্য। যদিWএক্স=1^ এর সাথে সম্পর্কিত আপেক্ষিক ফ্রিকোয়েন্সি বোঝায়,

গুলিইউওয়াটএস^=এইচ10-1(1Wএক্স=1^)

এই ক্ষেত্রে, যেহেতু Wএক্স=1^=0,4695599775, আমরা পেতে:

গুলিইউওয়াটএস^=1.4

আবার, ইউডাব্লুএসই কেবল একটি সামঞ্জস্যপূর্ণ অনুমান সরবরাহ করে - কোনও আত্মবিশ্বাসের অন্তর নয় এবং আমরা নির্ভুলভাবে কিছু বাণিজ্য বন্ধ দেখতে পাচ্ছি। উপরের এমপিক্টাসের সমাধানটি ইউডাব্লুএসই-র একটি অ্যাপ্লিকেশন - যদিও প্রোগ্রামিং প্রয়োজন। অনুমানকারকের সম্পূর্ণ ব্যাখ্যার জন্য দেখুন: https://paradsp.wordpress.com/ - পুরোপুরি নীচে।


জিডফের আইনের সাথে ইউডাব্লুএসই কীভাবে সম্পর্কিত?
মাইকেল আর চেরনিক

ইউডাব্লুএসই (ইউনিক ওয়েট স্পেস এস্টিমেশন) সত্যটি ব্যবহার করে যে সর্বাধিক সর্বাধিক সম্ভাবনা / ফ্রিকোয়েন্সি প্যারামিটারের বিভিন্ন মানগুলিতে অনন্য, কোনও প্রদত্ত এন এর জন্য সন্ধান করতে পারে। জিপফের আইনের প্রতি শ্রদ্ধা রেখে, এটি আমাদের জানিয়েছে যে রেঙ্ক, এন এবং শীর্ষতম ফ্রিকোয়েন্সিতে প্রচুর আইটেম দেওয়া হয়েছে, বাকি আইটেমগুলিতে (2, ..., এন) কেবলমাত্র একটি উপায় ফ্রিকোয়েন্সি নির্ধারণ করতে পারে যা আমরা পারি বলুন "নবম আইটেমটি 1 / n ^ s সর্বাধিক ঘন ঘন আইটেমের চেয়ে বড়, কিছু কিছু ক্ষেত্রে"। অন্য কথায়, এই তথ্যটি প্রদত্ত, জিপফের আইন ধরে রাখার কেবল একটি উপায় আছে - অবশ্যই ধরে নেওয়া যে জিপফের আইন বাস্তবে ধারণ করে।
CYP450

0

আমার সমাধানটি এমপিক্টাস এবং পাইথনে একটি বাস্তবায়ন করে হুবার সরবরাহকারী উত্তরগুলির পরিপূরক হওয়ার চেষ্টা করুন। আমাদের ফ্রিকোয়েন্সি এবং ব্যাপ্তি এক্স হ'ল:

freqs = np.asarray([26486, 12053, 5052, 3033, 2536, 2391, 1444, 1220, 1152, 1039])
x = np.asarray([1, 2, 3, 4, 5 ,6 ,7 ,8 ,9, 10])

যেহেতু আমাদের ফাংশনটি সমস্ত ব্যাপ্তিতে সংজ্ঞায়িত করা হয়নি, ততবার আমাদের এটি পরীক্ষা করা উচিত যে আমরা প্রতিবার এটি গণনা করছি। বিচ্ছিন্ন ক্ষেত্রে, একটি সরল অনুমান হ'ল সমস্ত y (x) এর যোগফল দ্বারা ভাগ করা। এইভাবে আমরা বিভিন্ন পরামিতিগুলি তুলনা করতে পারি।

f,ax = plt.subplots()
ax.plot(x, f1, 'o')
ax.set_xscale("log")
ax.set_yscale("log")

def loglik(b):  
    # Power law function
    Probabilities = x**(-b)

    # Normalized
    Probabilities = Probabilities/Probabilities.sum()

    # Log Likelihoood
    Lvector = np.log(Probabilities)

    # Multiply the vector by frequencies
    Lvector = np.log(Probabilities) * freqs

    # LL is the sum
    L = Lvector.sum()

    # We want to maximize LogLikelihood or minimize (-1)*LogLikelihood
    return(-L)

s_best = minimize(loglik, [2])
print(s_best)
ax.plot(x, freqs[0]*x**-s_best.x)

এখানে চিত্র বর্ণনা লিখুন

পূর্ববর্তী উত্তরগুলির মতো ফলাফল আমাদের 1.450408 এর slাল দেয়।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.