Анализ изменений в наборе пространственно-временных данных

Кластеризация данных в неконтролируемом обучении — это немного нечеткие вещи для ИИ из-за его неконтролируемой природы. Мы не знаем, является ли результат кластеризации лучшим, или нам нужно дополнительно настроить параметры. Однако мы всегда пытаемся добиться наилучшего результата, используя эвристику или другие средства. Сегодня я собираюсь написать о том, как я обнаруживаю изменения в пространственно-временных набор данных.

Пространственно-временной набор данных — это набор данных, который имеет как время, так и географическое положение. По мере изменения времени сформированный кластер также изменяется в одном и том же пространстве. Итак, как мы определяем, что кластер, сформированный в одно время, является точно таким же кластером в другое время? Например, давайте посмотрим на эти две фигуры

На этом рисунке показан результат кластеризации за апрель в наборе данных такси Нью-Йорка. Здесь я назвал два кластера кластером 1 и кластером 2. Теперь давайте сгруппируем набор данных за июнь.

Вот мы и получили результат. Теперь, как мы узнаем, являются ли кластер 1 и кластер 2 за апрель одним и тем же кластером в июньском наборе данных или это новый кластер, сформированный? Поэтому я дал четыре свойства для кластера:

  1. Кластер может расти.
  2. кластер может лопнуть.
  3. кластер исчезает.
  4. Появится новый кластер.

Итак, чтобы оценить свойства кластера, для первого шага давайте найдем кластер с приведенным ниже кодом.

def make_cluster(X):#use DBSCAN to cluster the datasets 
 model=DBSCAN(eps=0.005, min_samples=20).fit(X)
 ax.scatter(X[:,1],X[:,0],c=model.labels_, s=10, alpha=0.9,cmap=plt.cm.Set1)
labels=model.labels_
 n_clusters_=(len(set(model.labels_)))-(1 if -1 in model.labels_ else 0)
 cluster_pts=dict()
 e=len(X)
 for x in range(n_clusters_):
 for r in range(e):
 if x==labels[r]:
 if x in cluster_pts:
 cluster_pts[x].append((X[r,1],X[r,0]))
 else:
 cluster_pts[x]=[(X[r,1],X[r,0])]
 for x in cluster_pts:
 points=np.array(cluster_pts[x])
 points1=np.array(cluster_pts[1])
 hull=ConvexHull(points)#cover cluster in hull
 for simplex in hull.simplices:
 ax.plot(points[simplex, 0], points[simplex, 1], ‘k-’)
 plt.show() 
 return cluster_pts

Я использовал выпуклую оболочку, чтобы покрыть кластер в форме многоугольника.

Приведенный ниже метод проверяет, сколько точек лежит внутри полигона одного кластера.

def in_hull(p, hull,pinhull):#whether the point lies inside polygon or not …(returns how many points lies inside the polygon)
 alreadyptsinhull=len(pinhull) 
 if not isinstance(hull,Delaunay):
 hull = Delaunay(hull)
 asd=( hull.find_simplex(p)>=0)
 b=[x for x in asd if x==True]
 return len(b)

Теперь я определяю свойство кластера на основе простого правила.

Вот псевдокод для понимания формулировки изменений.

For all x cluster in april:
     for all y cluster in june:
         //match (x,y) 
         if 80 percent of points of x lies on y:
                if no of points in x < no of points in y
                      then  cluster expand //1
                      break     
                else
                       cluster shrink//-1
                       break 
      
      cluster disappear

Наконец-то я составил список свойств кластера.

изменить[st[t]]=[расширение,сжатие,дис,формирование]

которые описывают, сколько кластеров расширено, сжато, сколько кластеров предыдущего набора данных исчезло и сколько образовалось вновь.

Спасибо!

Вот ссылка на полный код на python 2.7

https://github.com/akash56/cluster_analysis