আসুন এটিকে সাধারণ টুকরো টুকরো টুকরো টুকরো টুকরো করে ফেলুন। এটি করার মাধ্যমে, সমস্ত কাজ সহজেই পরীক্ষিত কোডের অর্ধ ডজন লাইনে সম্পন্ন হয়।
প্রথমত, আপনাকে দূরত্ব গণনা করতে হবে। যেহেতু ডেটা ভৌগলিক স্থানাঙ্কে রয়েছে, এখানে একটি গোলাকৃতির ডেটুমের (হ্যাভারসাইন সূত্র ব্যবহার করে) দূরত্ব গণনা করার জন্য এখানে একটি ফাংশন রয়েছে:
#
# Spherical distance.
# `x` and `y` are (long, lat) pairs *in radians*.
dist <- function(x, y, R=1) {
d <- y - x
a <- sin(d[2]/2)^2 + cos(x[2])*cos(y[2])*sin(d[1]/2)^2
return (R * 2*atan2(sqrt(a), sqrt(1-a)))
}
আপনি যদি চান (তবে উপবৃত্তাকার ডেটা ব্যবহার করে এমন) আপনার প্রিয় প্রয়োগের সাথে এটি প্রতিস্থাপন করুন।
এর পরে, আমাদের প্রতিটি "বেস পয়েন্ট" (স্তরেরাই জন্য পরীক্ষা করা হচ্ছে) এবং এর অস্থায়ী প্রতিবেশগুলির মধ্যে দূরত্ব গণনা করতে হবে। এটি কেবল dist
পাড়ার জন্য প্রয়োগ করার বিষয় :
#
# Compute the distances between an array of locations and a base location `x`.
dist.array <- function(a, x, ...) apply(a, 1, function(y) dist(x, y, ...))
তৃতীয় - এটি মূল ধারণা - স্থায়ী পয়েন্টগুলি 11 টি পয়েন্টের প্রতিবেশী সনাক্তকরণের মাধ্যমে পাওয়া যায় যার সারিতে কমপক্ষে পাঁচজন থাকে যার দূরত্বগুলি যথেষ্ট কম small আসুন আমরা বুুলিয়ান মানগুলির একটি লজিক্যাল অ্যারেতে সত্য মানের দীর্ঘতম অনুচ্ছেদের দৈর্ঘ্য নির্ধারণ করে আরও সাধারণভাবে এটি বাস্তবায়ন করি:
#
# Return the length of the longest sequence of true values in `x`.
max.subsequence <- function(x) max(diff(c(0, which(!x), length(x)+1)))
(আমরা ভ্রান্ত মূল্যবোধগুলির অবস্থানগুলি যথাযথভাবে সন্ধান করি এবং তাদের পার্থক্যগুলি গণনা করি: এটি অ-ভুয়া মানগুলির অনুচ্ছেদের দৈর্ঘ্য।
চতুর্থত, আমরা max.subsequence
স্টেশনারি পয়েন্টগুলি সনাক্ত করতে আবেদন করি ।
#
# Determine whether a point `x` is "stationary" relative to a sequence of its
# neighbors `a`. It is provided there is a sequence of at least `k`
# points in `a` within distance `radius` of `x`, where the earth's radius is
# set to `R`.
is.stationary <- function(x, a, k=floor(length(a)/2), radius=100, R=6378.137)
max.subsequence(dist.array(a, x, R) <= radius) >= k
সেগুলি আমাদের প্রয়োজনীয় সমস্ত সরঞ্জাম।
উদাহরণস্বরূপ, আসুন কিছু আকর্ষণীয় ডেটা তৈরি করুন যা স্টেশনারি পয়েন্টগুলির কয়েকটি ক্লাম্প রয়েছে। আমি নিরক্ষীয় অঞ্চলের কাছাকাছি এলোমেলো পদক্ষেপ নেব।
set.seed(17)
n <- 67
theta <- 0:(n-1) / 50 - 1 + rnorm(n, sd=1/2)
rho <- rgamma(n, 2, scale=1/2) * (1 + cos(1:n / n * 6 * pi))
lon <- cumsum(cos(theta) * rho); lat <- cumsum(sin(theta) * rho)
অ্যারেতে lon
এবং বিন্যাসে পয়েন্টের ধারাবাহিকতায় lat
ডিগ্রীতে স্থানাঙ্ক থাকে n
। প্রথম রেডিয়ানে রূপান্তরিত হওয়ার পরে আমাদের সরঞ্জাম প্রয়োগ করা সহজসাধ্য:
p <- cbind(lon, lat) * pi / 180 # Convert from degrees to radians
p.stationary <- sapply(1:n, function(i)
is.stationary(p[i,], p[max(1,i-5):min(n,i+5), ], k=5))
আর্গুমেন্টটি p[max(1,i-5):min(n,i+5), ]
বলছে যে বেস সময় থেকে 5 সময় পদক্ষেপ বা 5 পর্বতমালার চেয়ে অনেক দূরে এগিয়ে যেতে হবে p[i,]
। সহ k=5
বেসিক পয়েন্টের 100 কিলোমিটারের মধ্যে থাকা সারিতে 5 বা ততোধিক ক্রমের সন্ধান করতে বলে। (100 কিলোমিটারের মানটি ডিফল্ট হিসাবে সেট করা হয়েছিল is.stationary
তবে আপনি এটি এখানে ওভাররাইড করতে পারেন))
আউটপুট p.stationary
হ'ল যৌক্তিক ভেক্টর যা স্থিরতার ইঙ্গিত দেয়: আমাদের কাছে যা ছিল আমরা তা পেয়েছি। তবে পদ্ধতিটি যাচাই করার জন্য মানগুলির অ্যারেগুলি পরীক্ষা করার পরিবর্তে ডেটা এবং এই ফলাফলগুলি প্লট করা ভাল। নিম্নলিখিত প্লটটিতে আমি রুট এবং পয়েন্টগুলি দেখি। প্রতি দশম পয়েন্টকে লেবেলযুক্ত করা হয় যাতে আপনি অনুমান করতে পারবেন কতগুলি স্থির ক্লাম্পের মধ্যে ওভারল্যাপ হতে পারে। এগুলি হাইলাইট করার জন্য স্টেশনারি পয়েন্টগুলি শক্ত লালতে পুনরায় চিত্রিত করা হয় এবং তাদের 100 কিলোমিটার বাফার দ্বারা বেষ্টিত হয়।
plot(p, type="l", asp=1, col="Gray",
xlab="Longitude (radians)", ylab="Latitude (radians)")
points(p)
points(p[p.stationary, ], pch=19, col="Red", cex=0.75)
i <- seq(1, n, by=10)
#
# Because we're near the Equator in this example, buffers will be nearly
# circular: approximate them.
disk <- function(x, r, n=32) {
theta <- 1:n / n * 2 * pi
return (t(rbind(cos(theta), sin(theta))*r + x))
}
r <- 100 / 6378.137 # Buffer radius in radians
apply(p[p.stationary, ], 1, function(x)
invisible(polygon(disk(x, r), col="#ff000008", border="#00000040")))
text(p[i,], labels=paste(i), pos=3, offset=1.25, col="Gray")
ওয়ার্কিং কোড সহ ট্র্যাকড ডেটাগুলিতে স্থিতিশীল পয়েন্টগুলি সন্ধানের জন্য অন্যান্য (পরিসংখ্যান ভিত্তিক) পদ্ধতির জন্য দয়া করে /mathematica/2711/clustering-of-space-time-data দেখুন ।