আমার বেশ কয়েকটি ক্যোয়ারী ফ্রিকোয়েন্সি রয়েছে এবং আমার জিপফের আইনটির সহগের অনুমান করতে হবে। এগুলি শীর্ষ ফ্রিকোয়েন্সি:
26486
12053
5052
3033
2536
2391
1444
1220
1152
1039
আমার বেশ কয়েকটি ক্যোয়ারী ফ্রিকোয়েন্সি রয়েছে এবং আমার জিপফের আইনটির সহগের অনুমান করতে হবে। এগুলি শীর্ষ ফ্রিকোয়েন্সি:
26486
12053
5052
3033
2536
2391
1444
1220
1152
1039
উত্তর:
আপডেট @ স্বেচ্ছাসেবীর পরামর্শ অনুযায়ী সর্বাধিক সম্ভাবনা অনুমানের সাথে কোডটি আপডেট করেছি। লগ তাত্ত্বিক সম্ভাব্যতা এবং লগ ফ্রিকোয়েন্সিগুলির মধ্যে পার্থক্যগুলির স্কোয়ারের পরিমাণ হ্রাস করা যদিও একটি উত্তর দেয় তবে এটি কোনও প্রকারের এম-অনুমানক হিসাবে দেখানো যেতে পারে তবে একটি পরিসংখ্যানিক প্রক্রিয়া হবে। দুর্ভাগ্যক্রমে আমি কোনও ফলাফলই দিতে পারি না যা একই ফলাফল দিতে পারে।
আমার চেষ্টা এখানে। আমি ফ্রিকোয়েন্সিগুলির লোগারিদম গণনা করি এবং এই সূত্রের দ্বারা প্রদত্ত তাত্ত্বিক সম্ভাবনার লগারিদমে তাদের ফিট করার চেষ্টা করি । চূড়ান্ত ফলাফলটি যুক্তিসঙ্গত বলে মনে হয়। এখানে আমার কোডটি আর।
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
এরপরে সেরা চতুর্ভুজ ফিট ।
আর এর সর্বাধিক সম্ভাবনা 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)
লাল রেখাটি বর্গক্ষেত্রের সমষ্টি, সবুজ রেখাটি সর্বাধিক সম্ভাবনার ফিট।
যে কোনও অনুমানের সমস্যায় আমাদের সামনে বেশ কয়েকটি সমস্যা রয়েছে:
প্যারামিটারটি অনুমান করুন।
সেই অনুমানের গুণমানটি মূল্যায়ন করুন।
ডেটা অন্বেষণ করুন।
ফিট মূল্যায়ন।
যারা বোঝার জন্য এবং যোগাযোগের জন্য পরিসংখ্যানগত পদ্ধতি ব্যবহার করবেন তাদের ক্ষেত্রে প্রথমটি অন্যদের ছাড়া কখনই করা উচিত নয়।
জন্য প্রাক্কলন এটি ব্যবহার করতে সুবিধাজনক maximimum সম্ভাবনা (এমএল)। ফ্রিকোয়েন্সিগুলি এত বড় যে আমরা সুপরিচিত অ্যাসিপটোটিক বৈশিষ্ট্যগুলি ধরে রাখতে আশা করতে পারি। এমএল ডেটা অনুমানের সম্ভাবনা বিতরণ ব্যবহার করে। Zipf ব্যবস্থা সম্ভাব্যতা supposes জন্য সমানুপাতিক হয় আমি - গুলি কিছু ধ্রুবক ক্ষমতার গুলি (সাধারণত গুলি > 0 )। যেহেতু এই সম্ভাবনাগুলি অবশ্যই unityক্যের সমষ্টি হতে পারে, আনুপাতিকতার ধ্রুবকটি যোগফলের পারস্পরিক
সুতরাং ডেটা জন্য লগ সম্ভাবনা হয়
জিপফের আইনের প্রকৃতি প্রদত্ত, এই ফিটটি গ্রাফ করার সঠিক উপায়টি একটি লগ-লগ প্লটের উপর রয়েছে , যেখানে ফিটটি লিনিয়ার হবে (সংজ্ঞা অনুসারে):
ফিটের উপকারের মূল্যায়ন করতে এবং ডেটা অন্বেষণ করতে, অবশিষ্টাংশগুলি (ডেটা / ফিট, লগ-লগ অক্ষগুলি আবার) দেখুন:
কারণ অবশিষ্টাংশগুলি এলোমেলো প্রদর্শিত হয়, কিছু অ্যাপ্লিকেশনগুলিতে আমরা জিপ্ফের আইন (এবং প্যারামিটারের আমাদের অনুমান) ফ্রিকোয়েন্সিগুলির গ্রহণযোগ্য বর্ণনা হিসাবে গ্রহণযোগ্য হতে পারি । এই বিশ্লেষণটি দেখায়, যদিও এটি অনুমান করা ভুল হবে যে এই অনুমানটির এখানে পরীক্ষিত ডেটাসেটের জন্য কোনও ব্যাখ্যামূলক বা ভবিষ্যদ্বাণীমূলক মান রয়েছে।
সর্বাধিক সম্ভাবনা অনুমানগুলি প্যারামিটারের কেবলমাত্র পয়েন্ট অনুমান । অনুমানের আত্মবিশ্বাসের ব্যবধানও খুঁজে পেতে অতিরিক্ত প্রচেষ্টা করা দরকার। সমস্যাটি হ'ল এই ব্যবধানটি সম্ভাব্য নয়। কেউ "প্যারামিটার মান 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 প্যাকেজ ইনস্টল থাকা পাইথন লাগাতে হবে।
তার দুর্দান্ত উত্তর এবং মন্তব্যের জন্য @ ডাব্লু-হুবারকে ধন্যবাদ!
এখানে ভিজিএএম ব্যবহার করে ডেটা ফিট করার, মূল্যায়ন ও ফলাফলগুলি সন্ধানের জন্য আমার প্রয়াস:
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
আমাদের ক্ষেত্রে চি স্কোয়ারের নাল অনুমানগুলি হ'ল জিপফের আইন অনুসারে ডেটা বিতরণ করা হয়, সুতরাং বৃহত্তর পি-মানগুলি এই দাবিটিকে সমর্থন করে যে ডেটা এটি অনুসারে বিতরণ করা হয়েছে। মনে রাখবেন যে এমনকি খুব বড় পি-মানগুলি কোনও প্রমাণ নয়, কেবল একটি সূচক।
কেবল মজাদার জন্য, এটি অন্য একটি উদাহরণ যেখানে ইউডাব্লুএসই শুধুমাত্র শীর্ষের সবচেয়ে বেশি ফ্রিকোয়েন্সি ব্যবহার করে একটি বদ্ধ ফর্ম সমাধান সরবরাহ করতে পারে - যদিও নির্ভুলতার ব্যয়ে। সম্ভাবনা অনপ্যারামিটার মানগুলিতে অনন্য। যদি এর সাথে সম্পর্কিত আপেক্ষিক ফ্রিকোয়েন্সি বোঝায়,
এই ক্ষেত্রে, যেহেতু , আমরা পেতে:
আবার, ইউডাব্লুএসই কেবল একটি সামঞ্জস্যপূর্ণ অনুমান সরবরাহ করে - কোনও আত্মবিশ্বাসের অন্তর নয় এবং আমরা নির্ভুলভাবে কিছু বাণিজ্য বন্ধ দেখতে পাচ্ছি। উপরের এমপিক্টাসের সমাধানটি ইউডাব্লুএসই-র একটি অ্যাপ্লিকেশন - যদিও প্রোগ্রামিং প্রয়োজন। অনুমানকারকের সম্পূর্ণ ব্যাখ্যার জন্য দেখুন: https://paradsp.wordpress.com/ - পুরোপুরি নীচে।
আমার সমাধানটি এমপিক্টাস এবং পাইথনে একটি বাস্তবায়ন করে হুবার সরবরাহকারী উত্তরগুলির পরিপূরক হওয়ার চেষ্টা করুন। আমাদের ফ্রিকোয়েন্সি এবং ব্যাপ্তি এক্স হ'ল:
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াল দেয়।