ক্লাস্টারিং অপরিবর্তিত লাইন


16

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

এখানে চিত্র বর্ণনা লিখুন (জাপানি উইকিপিডিয়া জিএফডিএল বা সিসি-বিওয়াই-এসএ-3.0- তে ক্যাসিওপিয়ার মিষ্টি দ্বারা , উইকিমিডিয়া কমন্সের মাধ্যমে)

আমি আগে লাইনগুলি আগেভাগে বাছাই করার চেষ্টা করেছি, উদাহরণস্বরূপ এগুলি সমস্ত পশ্চিমে থেকে পূর্ব দিকে চালিত করা, তবে এটি উত্তর থেকে দক্ষিণে এবং অন্যান্য পথে চলমান রেখাগুলির জন্য সমস্যার সমাধান করে না।

আপনি কি এই সমস্যার সাথে মোকাবিলা করার কোনও অ্যালগরিদম জানেন? আমি অপরিবর্তিত অংশগুলির গড় দিকনির্দেশনা গণনা করতে অ্যালগরিদমের পাশাপাশি খুঁজছিলাম কিন্তু আমি দূর থেকে সহায়ক কিছু পাইনি, সুতরাং আমার অবশ্যই ভুল অনুসন্ধানের শব্দ ব্যবহার করা উচিত।


1
আমি উভয় প্রান্তের স্থানাঙ্ক গণনা করব এবং স্ট্রিংয়ের ক্ষেত্রটি পপুলেট করতে এসআরটি ([x1, y1, x2, y2]) ব্যবহার করব। অনন্য মানগুলি খুঁজে পেতে আপনি এই ক্ষেত্রটির সংক্ষিপ্তসার করতে পারেন
ফেলিক্সআইপি

উত্তর:


10

যদি আমি আপনাকে সঠিকভাবে বুঝতে পারি তবে আপনি দিকনির্দেশ না করেই ক্লাস্টার লাইনগুলি একইরকম করতে চান।

এখানে আমি ধারণা করি যে এটি কাজ করতে পারে।

  1. স্টার্ট পয়েন্ট এবং শেষ পয়েন্টে লাইনগুলি বিভক্ত করুন

  2. পয়েন্টগুলি ক্লাস্টার করুন এবং ক্লাস্টার আইডি পান

  3. ক্লাস্টার আইডির একই সংমিশ্রণ সহ লাইনগুলি সন্ধান করুন। এগুলি একটি গুচ্ছ

পোস্টজিআইএস (অবশ্যই :-)) সংস্করণ ২.৩ এ এটি হওয়া উচিত

আমি ST_ClusterDBSCAN ফাংশনটি পরীক্ষা করি নি, তবে এটির কাজটি করা উচিত।

আপনার মতো লাইনের টেবিল থাকলে:

CREATE TABLE the_lines
(
   geom geometry(linestring),
   id integer primary key
)

এবং আপনি ক্লাস্টারটি তৈরি করতে চান যেখানে শুরু এবং শেষ পয়েন্টগুলি সর্বোচ্চ 10 কিলোমিটার দূরে রয়েছে। এবং একটি ক্লাস্টার হওয়ার জন্য কমপক্ষে 2 টি পয়েন্ট থাকতে হবে তবে কোয়েরিটি এমন কিছু হতে পারে:

WITH point_id AS
   (SELECT (ST_DumpPoints(geom)).geom, id FROM the_lines),
point_clusters as
   (SELECT ST_ClusterDBSCAN(geom, 10000, 2) cluster_id, id line_id FROM point_id) 
SELECT array_agg(a.line_id), a.cluster_id, b.cluster_id 
FROM point_clusters a 
     INNER JOIN point_clusters b 
     ON a.line_id = b.line_id AND a.cluster_id < b.cluster_id
GROUP BY a.cluster_id, b.cluster_id

আপনার সাথে যোগ দিয়ে a.cluster_id<b.cluster_idআপনি তুলনামূলক ক্লাস্টার আইডি দিকনির্দেশ থেকে স্বাধীন পান।


ধন্যবাদ নিক্লাস! আমি এই পদ্ধতির পছন্দ করি কারণ এটি আমাকে ক্লাস্টার করার সময় বিভিন্ন ইউনিট (অর্থাত্ কোণ এবং দূরত্ব) মেশাতে বাধ্য করে না।
আন্ডার ডার্ক

5

আপনি কি উত্স বা গন্তব্যের কোনও বিবেচনা ছাড়াই সত্যই পুরোপুরি দিকনির্দেশ দিয়ে ক্লাস্টার করতে চান? যদি তা হয় তবে খুব সহজ কিছু উপায় রয়েছে। সম্ভবত সবচেয়ে সহজ হ'ল প্রতিটি লাইনের ভারবহন গণনা করা, এটি দ্বিগুণ করুন এবং একটি বৃত্তের বিন্দু হিসাবে এটি প্লট করুন। যেহেতু সামনে-পিছনের বিয়ারিংগুলি 180 ডিগ্রি দ্বারা পৃথক হয়, সেগুলি দ্বিগুণ হওয়ার পরে 360 ডিগ্রি দ্বারা পৃথক হয় এবং তাই ঠিক একই জায়গায় প্লট করে। এখন আপনার পছন্দ মতো কোনও পদ্ধতি ব্যবহার করে বিমানের পয়েন্টগুলি ক্লাস্টার করুন।

এখানে একটি কার্যকারী উদাহরণ রয়েছে R, যার আউটপুট চারটি ক্লাস্টারের প্রতিটি অনুযায়ী লাইনগুলি বর্ণযুক্ত দেখায়। অবশ্যই আপনি বিয়ারিংগুলি গণনা করার জন্য একটি জিআইএস ব্যবহার করবেন - আমি সরলতার জন্য ইউক্লিডিয়ান বিয়ারিং ব্যবহার করেছি।

ব্যক্তিত্ব

cluster.undirected <- function(x, ...) {
  #
  # Compute the bearing and double it.
  #
  theta <- atan2(x[, 4] - x[, 2], x[, 3] - x[, 1]) * 2
  #
  # Convert to a point on the unit circle.
  #
  z <- cbind(cos(theta), sin(theta))
  #
  # Cluster those points.
  #
  kmeans(z, ...)
}
#
# Create some data.
#
n <- 100
set.seed(17)
pts <- matrix(rnorm(4*n, c(-2,0,2,0), sd=1), ncol=4, byrow=TRUE)
colnames(pts) <- c("x.O", "y.O", "x.D", "y.D")
#
# Plot them.
#
plot(rbind(pts[1:n,1:2], pts[1:n,3:4]), pch=19, col="Gray", xlab="X", ylab="Y")
#
# Plot the clustering solution.
#
n.centers <- 4
s <- cluster.undirected(pts, centers=n.centers)
colors <- hsv(seq(1/6, 5/6, length.out=n.centers), 0.8, 0.6, 0.25)
invisible(sapply(1:n, function(i) 
  lines(pts[i, c(1,3)], pts[i, c(2,4)], col=colors[s$cluster[i]], lwd=2))
)

ধন্যবাদ! উত্স এবং গন্তব্য (ওএন্ডডি )ও গুরুত্বপূর্ণ। "স্টার্ট / এন্ড পয়েন্ট লোকেশনগুলি একই রকম হওয়া উচিত" দিয়ে এটি ইঙ্গিত করার চেষ্টা করা হয়েছিল তবে আমি কোনটিই হে এবং কোনটি ডি। তা আমি বিবেচনা করি না তবুও আমি মনে করি আপনার ব্যাখ্যাটি আমাকে যে সমাধানটির সন্ধান করছিলাম তার কাছাকাছি নিয়ে যেতে পারে, যদি আমি কে এমেন্স চালানোর আগে ইউনিট বৃত্তের মানগুলি কীভাবে বিন্দু স্থানাঙ্কে স্কেল করতে হয় তা নির্ধারণ করতে পারে।
আন্ডার ডার্ক

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

4

আপনার প্রশ্নের স্পষ্টতা ইঙ্গিত দেয় যে আপনি ক্লাস্টারিংটিকে প্রকৃত লাইন বিভাগের উপর ভিত্তি করে তৈরি করতে চান , এই অর্থে যে কোনও দুটি উত্স-গন্তব্য (ওডি) জোড়া "নিকট" হিসাবে বিবেচিত হওয়া উচিত যখন উভয় উত্স নিকটবর্তী হয় এবং উভয় গন্তব্যগুলি নিকটে থাকে , নির্বিশেষে কোন বিন্দুটিকে মূল বা গন্তব্য হিসাবে বিবেচনা করা হয়

এই সূত্রটি আপনাকে ইতিমধ্যে দু'টি পয়েন্টের মধ্যে দূরত্ব ডি সম্পর্কে উপলব্ধি করার পরামর্শ দিয়েছে : বিমানটি উড়ে যাওয়ার সময়, মানচিত্রে দূরত্ব, রাউন্ড-ট্রিপ ট্রাভেল সময়, বা অন্য কোনও মেট্রিক যা ও ও ডি থাকা অবস্থায় পরিবর্তিত হয় না তা দূরত্ব হতে পারে সুইচ। একমাত্র জটিলতা যে অংশ অনন্য উপস্থাপনা না হয়: তারা মিলা unordered জোড়া {হে, ডি} কিন্তু হিসাবে প্রতিনিধিত্ব করা আবশ্যক আদেশ , জোড়া হয় (হে, ডি) বা (ডি, হে)। সুতরাং আমরা দু'টি অর্ডারযুক্ত জোড়া (ও 1, ডি 1) এবং (ও 2, ডি 2) দূরত্বগুলি ডি (ও 1, ও 2) এবং ডি (ডি 1, ডি 2) এর কিছু সংলগ্ন সমন্বয় হতে পারি, যেমন তাদের যোগফল বা বর্গ তাদের স্কোয়ারের যোগফলের মূল। আসুন এই সংমিশ্রণটি লিখি

distance((O1,D1), (O2,D2)) = f(d(O1,O2), d(D1,D2)).

দু'টি সম্ভাব্য দূরত্বের চেয়ে ছোট হতে আনর্ডারড জোড়াগুলির মধ্যবর্তী দূরত্বটি কেবল সংজ্ঞায়িত করুন:

distance({O1,D1}, {O2,D2}) = min(f(d(O1,O2)), d(D1,D2)), f(d(O1,D2), d(D1,O2))).

এই মুহুর্তে আপনি দূরত্বের ম্যাট্রিক্সের উপর ভিত্তি করে যে কোনও ক্লাস্টারিং কৌশল প্রয়োগ করতে পারেন।


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

ব্যক্তিত্ব

Rকোডটি এখানে এই উদাহরণ তৈরি করেছে। এর ইনপুটটি "দ্রাঘিমাংশ" এবং শহরগুলির জন্য "অক্ষাংশ" ক্ষেত্র সহ একটি পাঠ্য ফাইল। (চিত্রটিতে শহরগুলি লেবেল করতে এটিতে একটি "কী" ক্ষেত্রও অন্তর্ভুক্ত রয়েছে))

#
# Obtain an array of point pairs.
#
X <- read.csv("F:/Research/R/Projects/US_cities.txt", stringsAsFactors=FALSE)
pts <- cbind(X$Longitude, X$Latitude)

# -- This emulates arbitrary choices of origin and destination in each pair
XX <- t(combn(nrow(X), 2, function(i) c(pts[i[1],], pts[i[2],])))
k <- runif(nrow(XX)) < 1/2
XX <- rbind(XX[k, ], XX[!k, c(3,4,1,2)])
#
# Construct 4-D points for clustering.
# This is the combined array of O-D and D-O pairs, one per row.
#
Pairs <- rbind(XX, XX[, c(3,4,1,2)])
#
# Compute a distance matrix for the combined array.
#
D <- dist(Pairs)
#
# Select the smaller of each pair of possible distances and construct a new
# distance matrix for the original {O,D} pairs.
#
m <- attr(D, "Size")
delta <- matrix(NA, m, m)
delta[lower.tri(delta)] <- D
f <- matrix(NA, m/2, m/2)
block <- 1:(m/2)
f <- pmin(delta[block, block], delta[block+m/2, block])
D <- structure(f[lower.tri(f)], Size=nrow(f), Diag=FALSE, Upper=FALSE, 
               method="Euclidean", call=attr(D, "call"), class="dist")
#
# Cluster according to these distances.
#
H <- hclust(D)
n.groups <- 8
members <- cutree(H, k=2*n.groups)
#
# Display the clusters with colors.
#
plot(c(-131, -66), c(28, 44), xlab="Longitude", ylab="Latitude", type="n")
g <- max(members)
colors <- hsv(seq(1/6, 5/6, length.out=g), seq(1, 0.25, length.out=g), 0.6, 0.45)
colors <- colors[sample.int(g)]
invisible(sapply(1:nrow(Pairs), function(i) 
  lines(Pairs[i, c(1,3)], Pairs[i, c(2,4)], col=colors[members[i]], lwd=1))
)
#
# Show the points for reference
#
positions <- round(apply(t(pts) - colMeans(pts), 2, 
                         function(x) atan2(x[2], x[1])) / (pi/2)) %% 4
positions <- c(4, 3, 2, 1)[positions+1]
points(pts, pch=19, col="Gray", xlab="X", ylab="Y")
text(pts, labels=X$Key, pos=positions, cex=0.6)

ধন্যবাদ! বড় ওডি ডেটাসেটের জন্য পেয়ারওয়াইস দূরত্বের গণনা কোনও সমস্যা হবে?
আন্ডার ডার্ক

হ্যাঁ, কারণ এন লাইন বিভাগগুলির সাথে এন (এন -1) / 2 দূরত্বের গণনা রয়েছে। তবে কোনও অন্তর্নিহিত সমস্যা নেই: সমস্ত ক্লাস্টারিং অ্যালগরিদমগুলিকে পয়েন্টগুলির মধ্যে (বা পয়েন্ট এবং ক্লাস্টার সেন্টারগুলির মধ্যে) দূরত্ব বা অসাম্য খুঁজে বের করতে হবে। এটি এমন একটি সাধারণ সমস্যা যে অনেক অ্যালগরিদম কাস্টম দূরত্ব ফাংশন নিয়ে কাজ করে।
শুক্র
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.