Анализ изменений в наборе пространственно-временных данных
Кластеризация данных в неконтролируемом обучении — это немного нечеткие вещи для ИИ из-за его неконтролируемой природы. Мы не знаем, является ли результат кластеризации лучшим, или нам нужно дополнительно настроить параметры. Однако мы всегда пытаемся добиться наилучшего результата, используя эвристику или другие средства. Сегодня я собираюсь написать о том, как я обнаруживаю изменения в пространственно-временных набор данных.
Пространственно-временной набор данных — это набор данных, который имеет как время, так и географическое положение. По мере изменения времени сформированный кластер также изменяется в одном и том же пространстве. Итак, как мы определяем, что кластер, сформированный в одно время, является точно таким же кластером в другое время? Например, давайте посмотрим на эти две фигуры
На этом рисунке показан результат кластеризации за апрель в наборе данных такси Нью-Йорка. Здесь я назвал два кластера кластером 1 и кластером 2. Теперь давайте сгруппируем набор данных за июнь.
Вот мы и получили результат. Теперь, как мы узнаем, являются ли кластер 1 и кластер 2 за апрель одним и тем же кластером в июньском наборе данных или это новый кластер, сформированный? Поэтому я дал четыре свойства для кластера:
- Кластер может расти.
- кластер может лопнуть.
- кластер исчезает.
- Появится новый кластер.
Итак, чтобы оценить свойства кластера, для первого шага давайте найдем кластер с приведенным ниже кодом.
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