Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Tiêu đềngàyThể loạiTags

Hướng dẫn phân cụm DBSCAN: Ví dụ với scikit-learn

2020-12-09

khung

SVM

phân nhóm

DBSCAN

machine-learning

Python

scikit-learn

unsupervised-learning

Có nhiều thuật toán để phân cụm có sẵn ngày hôm nay. DBSCAN, hoặc phân cụm không gian dựa trên mật độ của các ứng dụng có nhiễu, là một trong những thuật toán phân cụm này. Nó có thể được sử dụng cho các điểm dữ liệu phân cụm dựa trên mật độ, tức là, bằng cách nhóm các khu vực với nhiều mẫu. Điều này làm cho nó đặc biệt hữu ích để thực hiện phân cụm trong điều kiện ồn ào: Như chúng ta sẽ thấy, bên cạnh việc phân cụm, DBSCAN cũng có khả năng phát hiện các điểm ồn ào, có thể - nếu muốn - bị loại bỏ khỏi bộ dữ liệu.density-based spatial clustering of applications with noise, is one of these clustering algorithms. It can be used for clustering data points based on density, i.e., by grouping together areas with many samples. This makes it especially useful for performing clustering under noisy conditions: as we shall see, besides clustering, DBSCAN is also capable of detecting noisy points, which can - if desired - be discarded from the dataset.

Trong bài viết này, chúng tôi sẽ xem xét DBSCAN chi tiết hơn. Đầu tiên, chúng ta sẽ xem xét một trường hợp sử dụng ví dụ để phân cụm, bằng cách tạo hai đốm dữ liệu nơi có một số mẫu nosiy. Sau đó, chúng tôi sẽ giới thiệu phân cụm dựa trên DBSCAN, cả các khái niệm của nó (điểm cốt lõi, điểm có thể tiếp cận trực tiếp, điểm có thể tiếp cận và ngoại lệ/nhiễu) và thuật toán của nó (bằng cách giải thích từng bước). Sau đó, chúng tôi sẽ thực hiện một thuật toán phân cụm dựa trên DBSCAN với Python và Scikit-learn. Điều này cho phép chúng tôi vừa hiểu thuật toán vừa áp dụng nó.

Trong hướng dẫn này, bạn sẽ học ...

  • Các khái niệm đằng sau DBSCAN.
  • Làm thế nào các thuật toán DBSCAN hoạt động.
  • Làm thế nào bạn có thể tự thực hiện thuật toán DBSCAN, với Scikit-learn.

Đặt một câu hỏi

Hãy xem! 😎

Cập nhật 11/Jan/2021: Đã thêm ví dụ mã bắt đầu nhanh. added quick-start code example.


[toc]


Mã ví dụ: Làm thế nào để thực hiện phân cụm dbscan với scikit-learn?

Với ví dụ nhanh này, bạn có thể bắt đầu với DBSCAN trong Python ngay lập tức. Nếu bạn muốn hiểu cách thuật toán hoạt động chi tiết hơn hoặc xem các ví dụ từng bước để mã hóa phương thức phân cụm, hãy đảm bảo đọc toàn bộ bài viết dưới đây!

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np

# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)

# Compute DBSCAN
db = DBSCAN(eps=epsilon, min_samples=min_samples).fit(X)
labels = db.labels_

no_clusters = len(np.unique(labels) )
no_noise = np.sum(np.array(labels) == -1, axis=0)

print('Estimated no. of clusters: %d' % no_clusters)
print('Estimated no. of noise points: %d' % no_noise)


Phân cụm là gì?

DBSCAN là một thuật toán phân cụm và là một phần của lớp thuật toán học không giám sát. Nhưng phân cụm là gì? Trước tiên chúng ta hãy xem một định nghĩa:

Phân tích cụm & nbsp; hoặc & nbsp; phân cụm & nbsp; là nhiệm vụ nhóm một tập hợp các đối tượng theo cách mà các đối tượng trong cùng một nhóm (được gọi là A & NBSP; cụm) giống nhau hơn (theo một nghĩa nào đó) với nhau so với các nhóm khác trong các nhóm khác ( cụm). or clustering is the task of grouping a set of objects in such a way that objects in the same group (called a cluster) are more similar (in some sense) to each other than to those in other groups (clusters).

Wikipedia (2004)

Aha!

Nó cho phép chúng tôi chọn các nhóm từ các bộ dữ liệu dựa trên các đặc điểm được chia sẻ cho các mẫu trong một nhóm cụ thể.

Điều đó thật thú vị, bởi vì - chỉ đưa ra một ví dụ - chúng ta có thể sử dụng phân cụm để tạo bộ dữ liệu được dán nhãn (ví dụ: để chọn các lớp nếu chúng ta không có chúng) để tạo mô hình dự đoán. Hơn nữa, như chúng ta sẽ thấy trong bài viết này, phân cụm cũng có thể được sử dụng để phát hiện các mẫu ồn ào, có thể được loại bỏ trước khi đào tạo mô hình học tập có giám sát.

Một loạt các ví dụ rộng lớn có sẵn ở đây.


Giới thiệu phân cụm DBSCAN

DBSCAN là một thuật toán để thực hiện phân tích cụm trên bộ dữ liệu của bạn.

Trước khi chúng tôi bắt đầu bất kỳ công việc nào trong việc thực hiện DBSCAN với Scikit-Learn, trước tiên hãy phóng to thuật toán. Như chúng ta đã đọc ở trên, nó là viết tắt của phân cụm không gian dựa trên mật độ của các ứng dụng có tiếng ồn, đây là một tên khá phức tạp cho một thuật toán tương đối đơn giản. Nhưng chúng ta có thể phá vỡ nó để chúng ta có thể nắm bắt trực giác những gì nó làm. Dựa trên mật độ có nghĩa là nó sẽ phóng to vào các khu vực có mật độ lớn, hay nói cách khác là một lượng lớn các mẫu gần nhau. Vì các cụm dày đặc, nên sự tập trung vào mật độ là tốt.density-based spatial clustering of applications with noise, which is quite a complex name for a relatively simple algorithm. But we can break it apart so that we can intuitively grasp what it does. Density-based means that it will zoom into areas that have great density, or in other words a large amount of samples closely together. Since clusters are dense, this focus on density is good.

Phân cụm không gian có nghĩa là nó thực hiện phân cụm bằng cách thực hiện các hành động trong không gian tính năng. Nói cách khác, trong khi một số kỹ thuật phân cụm hoạt động bằng cách gửi tin nhắn giữa các điểm, DBSCAN thực hiện các biện pháp khoảng cách trong không gian để xác định mẫu nào thuộc về nhau. Phân cụm nói cho chính nó và các ứng dụng có tiếng ồn có nghĩa là kỹ thuật có thể được sử dụng với các bộ dữ liệu ồn ào. Chúng ta sẽ thấy lý do tại sao đây là trường hợp tiếp theo, bởi vì bây giờ chúng ta sẽ xem xét các khái niệm cơ bản của DBSCAN: điểm cốt lõi, điểm trực tiếp có thể tiếp cận, điểm có thể tiếp cận và ngoại lệ.

Các khái niệm về dbscan

Trước khi chúng ta bắt đầu nhìn vào các khái niệm này, trước tiên chúng ta phải tạo ra một bộ dữ liệu tưởng tượng. Đây là. Giả sử rằng chúng ta đang xử lý một không gian tính năng hai chiều trong đó các mẫu của chúng ta có thể được biểu thị dưới dạng điểm (nghĩa là [latex] (x_1, x_2) [/latex] tọa độ). Sau đó, nó có thể trông như thế này:

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Khi thực hiện DBSCAN, hai tham số phải được cung cấp trước khi thuật toán được chạy. Đầu tiên là giá trị epsilon hoặc [latex] \ epsilon [/latex]. Giá trị này chỉ ra một số khoảng cách xung quanh một điểm, có thể được hiển thị dưới dạng một vòng tròn với một diamater của [latex] \ epsilon [/latex] xung quanh một điểm. Lưu ý rằng mỗi điểm có cùng một epsilon, nhưng chúng tôi vẽ vòng tròn chỉ một điểm bên dưới.epsilon value, or [latex]\epsilon[/latex]. This value indicates some distance around a point, which can be visualized as a circle with a diamater of [latex]\epsilon[/latex] around a point. Note that each point has the same epsilon, but that we draw the circle for just one point below.

Thứ hai là số lượng mẫu tối thiểu. Số này cho biết số lượng mẫu tối thiểu (bao gồm cả điểm chính) phải nằm trong phạm vi Epsilon (tức là, vòng tròn) để một điểm được coi là điểm cốt lõi. Bây giờ chúng ta sẽ xem xét những gì là những gì.minimum number of samples. This number indicates the minimum number of samples (including the point itself) that should be within the epsilon range (i.e., the circle) for a point to be considered a core point. We will now look at what these are.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Điểm cốt lõi

Giả sử rằng chúng ta có một số epsilon [latex] \ epsilon [/latex] và đặt số điểm tối thiểu thành 3. Bây giờ chúng ta sẽ xem xét hai điểm của bộ dữ liệu. Ở bên trái, chúng tôi nhìn vào điểm trên, trong khi ở bên phải, chúng tôi nhìn vào một trong những điểm giữa.

Một điểm & nbsp; p & nbsp; là a & nbsp; điểm cốt lõi & nbsp; nếu ít nhất & nbsp; minpts & nbsp; điểm nằm trong khoảng cách & nbsp; ε & nbsp; của nó (bao gồm & nbsp; p).

Wikipedia (2007)

Nói cách khác, trong ví dụ của chúng tôi, một điểm là một điểm cốt lõi nếu ít nhất 3 điểm, bao gồm cả chính nó, nằm trong vòng tròn. Như đã trở nên rõ ràng, cả hai điểm mà chúng ta đang xem xét là những điểm được gọi là điểm cốt lõi.

Điều tuyệt vời của các điểm cốt lõi là chúng có khả năng là một phần của một cụm, bởi vì chúng ở trong vùng lân cận của các điểm khác. Đó là lý do tại sao chúng rất quan trọng trong thuật toán DBSCAN.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Nếu bộ dữ liệu lớn hơn (ví dụ: vì chúng tôi phóng to vào một khu vực cụ thể) và một điểm khác sẽ được kiểm tra, chúng tôi có thể đi đến kết luận rằng nó không phải là điểm cốt lõi. Ví dụ dưới đây minh họa lý do tại sao: chỉ có hai điểm, bao gồm cả chính nó, trong vùng lân cận [latex] \ epsilon [/latex] của điểm. Vì [latex] \ text {minpts} = 3 [/latex] và [latex] 2 <3 [/latex], đây không phải là một điểm cốt lõi.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Điểm trực tiếp tiếp cận

Nếu một điểm không phải là một điểm cốt lõi, chúng ta phải xem liệu nó có thể truy cập trực tiếp hay không.directly reachable.

Một điểm & nbsp; q & nbsp; is & nbsp; có thể truy cập trực tiếp & nbsp; từ & nbsp; p & nbsp; if point & nbsp; q & nbsp; nằm trong khoảng cách & nbsp; ε & nbsp; từ lõi điểm & nbsp; p. Điểm chỉ được cho là có thể tiếp cận trực tiếp từ các điểm cốt lõi.

Wikipedia (2007)

Nói cách khác, trong ví dụ của chúng tôi, một điểm là một điểm cốt lõi nếu ít nhất 3 điểm, bao gồm cả chính nó, nằm trong vòng tròn. Như đã trở nên rõ ràng, cả hai điểm mà chúng ta đang xem xét là những điểm được gọi là điểm cốt lõi.

Điều tuyệt vời của các điểm cốt lõi là chúng có khả năng là một phần của một cụm, bởi vì chúng ở trong vùng lân cận của các điểm khác. Đó là lý do tại sao chúng rất quan trọng trong thuật toán DBSCAN.

  • Nếu bộ dữ liệu lớn hơn (ví dụ: vì chúng tôi phóng to vào một khu vực cụ thể) và một điểm khác sẽ được kiểm tra, chúng tôi có thể đi đến kết luận rằng nó không phải là điểm cốt lõi. Ví dụ dưới đây minh họa lý do tại sao: chỉ có hai điểm, bao gồm cả chính nó, trong vùng lân cận [latex] \ epsilon [/latex] của điểm. Vì [latex] \ text {minpts} = 3 [/latex] và [latex] 2 <3 [/latex], đây không phải là một điểm cốt lõi.
  • Điểm trực tiếp tiếp cận

Nếu một điểm không phải là một điểm cốt lõi, chúng ta phải xem liệu nó có thể truy cập trực tiếp hay không.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Một điểm & nbsp; q & nbsp; is & nbsp; có thể truy cập trực tiếp & nbsp; từ & nbsp; p & nbsp; if point & nbsp; q & nbsp; nằm trong khoảng cách & nbsp; ε & nbsp; từ lõi điểm & nbsp; p. Điểm chỉ được cho là có thể tiếp cận trực tiếp từ các điểm cốt lõi.

Trong ví dụ trên, chúng tôi thấy rằng điểm phụ mà chúng tôi đang xem không phải là một điểm cốt lõi. Nhưng nó có thể tiếp cận trực tiếp không?reachable points:

Nó dường như là trường hợp:

Wikipedia (2007)

Nói cách khác, trong ví dụ của chúng tôi, một điểm là một điểm cốt lõi nếu ít nhất 3 điểm, bao gồm cả chính nó, nằm trong vòng tròn. Như đã trở nên rõ ràng, cả hai điểm mà chúng ta đang xem xét là những điểm được gọi là điểm cốt lõi.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Điều tuyệt vời của các điểm cốt lõi là chúng có khả năng là một phần của một cụm, bởi vì chúng ở trong vùng lân cận của các điểm khác. Đó là lý do tại sao chúng rất quan trọng trong thuật toán DBSCAN.

Nếu bộ dữ liệu lớn hơn (ví dụ: vì chúng tôi phóng to vào một khu vực cụ thể) và một điểm khác sẽ được kiểm tra, chúng tôi có thể đi đến kết luận rằng nó không phải là điểm cốt lõi. Ví dụ dưới đây minh họa lý do tại sao: chỉ có hai điểm, bao gồm cả chính nó, trong vùng lân cận [latex] \ epsilon [/latex] của điểm. Vì [latex] \ text {minpts} = 3 [/latex] và [latex] 2 <3 [/latex], đây không phải là một điểm cốt lõi.

Điểm trực tiếp tiếp cận

Wikipedia (2007)

Nói cách khác, trong ví dụ của chúng tôi, một điểm là một điểm cốt lõi nếu ít nhất 3 điểm, bao gồm cả chính nó, nằm trong vòng tròn. Như đã trở nên rõ ràng, cả hai điểm mà chúng ta đang xem xét là những điểm được gọi là điểm cốt lõi.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Điều tuyệt vời của các điểm cốt lõi là chúng có khả năng là một phần của một cụm, bởi vì chúng ở trong vùng lân cận của các điểm khác. Đó là lý do tại sao chúng rất quan trọng trong thuật toán DBSCAN.

Nếu bộ dữ liệu lớn hơn (ví dụ: vì chúng tôi phóng to vào một khu vực cụ thể) và một điểm khác sẽ được kiểm tra, chúng tôi có thể đi đến kết luận rằng nó không phải là điểm cốt lõi. Ví dụ dưới đây minh họa lý do tại sao: chỉ có hai điểm, bao gồm cả chính nó, trong vùng lân cận [latex] \ epsilon [/latex] của điểm. Vì [latex] \ text {minpts} = 3 [/latex] và [latex] 2 <3 [/latex], đây không phải là một điểm cốt lõi.

  1. Điểm trực tiếp tiếp cận
  2. Nếu một điểm không phải là một điểm cốt lõi, chúng ta phải xem liệu nó có thể truy cập trực tiếp hay không.
  3. Một điểm & nbsp; q & nbsp; is & nbsp; có thể truy cập trực tiếp & nbsp; từ & nbsp; p & nbsp; if point & nbsp; q & nbsp; nằm trong khoảng cách & nbsp; ε & nbsp; từ lõi điểm & nbsp; p. Điểm chỉ được cho là có thể tiếp cận trực tiếp từ các điểm cốt lõi.
  4. Trong ví dụ trên, chúng tôi thấy rằng điểm phụ mà chúng tôi đang xem không phải là một điểm cốt lõi. Nhưng nó có thể tiếp cận trực tiếp không?
  5. Bây giờ chúng tôi bắt đầu tại (2) một lần nữa, trừ khi tất cả các điểm đã được kiểm tra và dán nhãn.

Bằng cách tìm kiếm các cụm từng cụm, chúng ta có thể chậm nhưng chắc chắn xây dựng một cụm và không nhất thiết phải kết thúc với quá nhiều chỉ dẫn cụm thực sự là một phần của cùng một cụm. Tất nhiên, đây là thứ mà chúng ta có thể kiểm soát bằng cách đặt [latex] \ epsilon [/latex] và [latex] \ text {minpts} [/latex] và tùy thuộc vào bộ dữ liệu (yêu cầu phân tích dữ liệu khám phá của riêng bạn trước tiên). Ngoài ra, các điểm ghi nhãn là tiếng ồn có nghĩa là sau khi phân cụm kết thúc, chúng tôi có thể chỉ cần hiển thị và đếm các điểm còn lại được dán nhãn là tiếng ồn và có thể xóa chúng khỏi bộ dữ liệu của chúng tôi.

Nếu đối với một số [latex] \ epsilon [/latex] giá trị cho [latex] \ text {minpts} = 4 [/latex], đây sẽ là kết quả: nhiều điểm cốt lõi, một số điểm không phải là điểm cốt lõi nhưng có thể truy cập trực tiếp Từ các điểm cốt lõi và do đó là một phần của cụm, và một số điểm không thể truy cập được và do đó các ngoại lệ. Nói cách khác, chúng ta có một cụm ở đây, bao gồm các điểm màu xanh lá cây và đỏ, trong đó hai điểm màu xanh là ngoại lệ.

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan


Thực hiện phân cụm dựa trên DBSCAN với Scikit-learn

Được rồi, bây giờ bạn nên có một sự hiểu biết công bằng về cách thuật toán DBSCAN hoạt động và do đó làm thế nào nó có thể được sử dụng để phân cụm. Hãy chuyển đổi kiến ​​thức của chúng tôi thành mã bằng cách viết một tập lệnh có khả năng thực hiện phân cụm trên một số dữ liệu. Chúng tôi sẽ sử dụng Scikit-Learn cho mục đích này, vì nó có sẵn

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
1 trong API
from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
2 của nó và vì Python là ngôn ngữ tiêu chuẩn thực tế cho kỹ thuật ML ngày nay.

Hãy mở trình chỉnh sửa mã và tạo tệp có tên, ví dụ:

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
3.

Thêm nhập khẩu

Điều đầu tiên chúng tôi làm là thêm nhập khẩu:

  • Chúng tôi sẽ nhập
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    4 từ
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    5 để tạo bộ dữ liệu dựa trên blob trong phần tiếp theo.
  • Từ
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    2, chúng tôi nhập
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    1, cho phép chúng tôi thực hiện phân cụm.
  • Numpy (như
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    8) sẽ được sử dụng để xử lý số.
  • Cuối cùng, chúng tôi sẽ sử dụng API pyplot matplotlib (
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    9) để trực quan hóa bộ dữ liệu được tạo sau khi phân cụm.

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt

Tạo một bộ dữ liệu

Để tạo dữ liệu, chúng tôi sẽ thực hiện hai điều: chỉ định một số tùy chọn cấu hình và sử dụng chúng khi gọi

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
4. Lưu ý rằng chúng tôi cũng chỉ định
# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
1 và
# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
2, sau này sẽ được sử dụng cho hoạt động phân cụm.

# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)

Các cụm trông như sau (trong trường hợp của bạn, chúng sẽ trông hơi khác nhau vì chúng được tạo ngẫu nhiên).

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Đối với khả năng sao chép, có thể là khôn ngoan khi lưu dữ liệu chỉ một lần sau khi chạy tập lệnh - bằng cách không đưa ra dòng

# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
3 sau đó, bạn sẽ luôn tải cùng một dữ liệu từ tệp
# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
4. Điều này là không cần thiết.

np.save('./clusters.npy', X)
X = np.load('./clusters.npy')

Khởi tạo DBSCAN và tính toán các cụm

Bây giờ chúng ta có thể khởi tạo DBSCAN và tính toán các cụm.

  • Chúng tôi khởi tạo
    from sklearn.datasets import make_blobs
    from sklearn.cluster import DBSCAN
    import numpy as np
    import matplotlib.pyplot as plt
    
    1 với các giá trị của chúng tôi cho
    # Configuration options
    num_samples_total = 1000
    cluster_centers = [(3,3), (7,7)]
    num_classes = len(cluster_centers)
    epsilon = 1
    .0
    min_samples = 13
    
    # Generate data
    X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
    
    1 và
    # Configuration options
    num_samples_total = 1000
    cluster_centers = [(3,3), (7,7)]
    num_classes = len(cluster_centers)
    epsilon = 1
    .0
    min_samples = 13
    
    # Generate data
    X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
    
    2.
  • Sau đó, chúng tôi ngay lập tức phù hợp với dữ liệu với DBSCAN, có nghĩa là việc phân cụm sẽ bắt đầu.
  • Chúng tôi tải các nhãn được tạo (tức là chỉ số cụm) vào
    # Configuration options
    num_samples_total = 1000
    cluster_centers = [(3,3), (7,7)]
    num_classes = len(cluster_centers)
    epsilon = 1
    .0
    min_samples = 13
    
    # Generate data
    X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
    
    8 sau khi kết thúc phân cụm.

# Compute DBSCAN
db = DBSCAN(eps=epsilon, min_samples=min_samples).fit(X)
labels = db.labels_

Trong trường hợp của chúng tôi, in số lượng cụm và số lượng mẫu ồn ào mang lại 2 cụm với 0 mẫu ồn do lựa chọn [latex] \ epsilon = 1.0 của chúng tôi; \ text {minpts} = 13 [/latex]. Trong trường hợp của bạn, kết quả có thể sẽ khác nhau. Xáo trộn xung quanh với các giá trị epsilon (nghĩa là làm cho vòng tròn lớn hơn) hoặc số lượng mẫu tối thiểu (tùy thuộc vào mật độ của các cụm của bạn) sẽ mang lại kết quả khác sau đó!

no_clusters = len(np.unique(labels) )
no_noise = np.sum(np.array(labels) == -1, axis=0)

print('Estimated no. of clusters: %d' % no_clusters)
print('Estimated no. of noise points: %d' % no_noise)

(Outcome:)

Estimated no. of clusters: 2
Estimated no. of noise points: 0

Vẽ đồ thị dữ liệu phân cụm

Cuối cùng, chúng tôi có thể tạo ra một sơ đồ phân tán cho dữ liệu đào tạo của chúng tôi. Vì chúng tôi có hai cụm, chúng tôi sử dụng hàm Lambda đơn giản chọn một màu này hay màu khác. Nếu bạn có nhiều cụm, bạn có thể dễ dàng khái quát chức năng Lambda này với cách tiếp cận từ điển.

# Generate scatter plot for training data
colors = list(map(lambda x: '#3b4cc0' if x == 1 else '#b40426', labels))
plt.scatter(X[:,0], X[:,1], c=colors, marker="o", picker=True)
plt.title('Two clusters with data')
plt.xlabel('Axis X[0]')
plt.ylabel('Axis X[1]')
plt.show()

Kết quả cuối cùng thực sự là hai cụm, như dự định:

Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

Mã mô hình đầy đủ

Đây là mã đầy đủ cho những người nhằm mục đích sử dụng nó ngay lập tức:

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt

# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)

np.save('./clusters.npy', X)
X = np.load('./clusters.npy')

# Compute DBSCAN
db = DBSCAN(eps=epsilon, min_samples=min_samples).fit(X)
labels = db.labels_

no_clusters = len(np.unique(labels) )
no_noise = np.sum(np.array(labels) == -1, axis=0)

print('Estimated no. of clusters: %d' % no_clusters)
print('Estimated no. of noise points: %d' % no_noise)

# Generate scatter plot for training data
colors = list(map(lambda x: '#3b4cc0' if x == 1 else '#b40426', labels))
plt.scatter(X[:,0], X[:,1], c=colors, marker="o", picker=True)
plt.title('Two clusters with data')
plt.xlabel('Axis X[0]')
plt.ylabel('Axis X[1]')
plt.show()


Xóa nhiễu khỏi bộ dữ liệu sau khi phân cụm

Nếu chúng ta điều chỉnh giá trị cho [latex] \ epsilon [/latex] và đặt nó thành 0,3, chúng ta sẽ nhận được kết quả khác nhau:

Estimated no. of clusters: 3
Estimated no. of noise points: 50

Cụ thể, thuật toán hiện có khả năng phát hiện các mẫu ồn ào, như chúng ta có thể thấy trong hình ảnh dưới đây. Tuy nhiên, việc loại bỏ các mẫu ồn ào sau khi thực hiện DBSCAN rất dễ dàng - và chỉ cần bốn dòng mã bổ sung. Đây là bởi vì DBSCAN đặt nhãn cho các mẫu ồn ào thành

# Configuration options
num_samples_total = 1000
cluster_centers = [(3,3), (7,7)]
num_classes = len(cluster_centers)
epsilon = 1
.0
min_samples = 13

# Generate data
X, y = make_blobs(n_samples = num_samples_total, centers = cluster_centers, n_features = num_classes, center_box=(0, 1), cluster_std = 0.5)
9; Đây là cách "báo hiệu một nhãn là ồn ào".

Thêm các dòng trước khi tạo biểu đồ phân tán cho thấy các mẫu được dán nhãn là nhiễu được xóa khỏi bộ dữ liệu.

Vì lý do này, chúng tôi cũng có thể sử dụng DBSCAN làm thuật toán loại bỏ tiếng ồn, ví dụ: Trước khi áp dụng phân loại dựa trên SVM, để tìm ranh giới quyết định tốt hơn.

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
0

  • Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan

  • Hướng dẫn dbscan text clustering python - python phân cụm văn bản dbscan


Bản tóm tắt

Trong bài viết này, chúng tôi đã xem xét phân cụm dựa trên DBSCAN theo nhiều cách. Đầu tiên, chúng tôi đã xem xét phân tích cụm hoặc phân cụm nói chung - nó là gì? Cái này được dùng để làm gì? Như chúng ta có thể thấy trong bài viết này, có một số lĩnh vực thú vị nơi các kỹ thuật như vậy có thể được sử dụng.

Sau đó, chúng tôi đã giới thiệu DBSCAN, viết tắt của phân cụm không gian dựa trên mật độ của các ứng dụng có nhiễu và là một thuật toán phân cụm được sử dụng rộng rãi. Chúng tôi đã xem xét thuật toán và các khối xây dựng khái niệm trước. Chúng tôi đã thấy rằng các điểm cốt lõi được đặt tên nên nếu ít nhất [latex] \ text {minpts} [/latex] điểm được đặt ở mức nhỏ hơn [latex] \ epsilon [/latex] khoảng cách từ điểm. Tất cả các điểm trong vòng tròn này có thể truy cập trực tiếp. Nếu chúng ta có thể xây dựng một đường dẫn từ điểm này sang điểm khác, không có khả năng tiếp cận trực tiếp, thông qua các điểm cốt lõi khác, điểm cuối cùng được cho là có thể truy cập được. Tất cả các điểm không thể truy cập được được coi là ngoại lệ, hoặc tiếng ồn.

Các thuật toán sau đó thực sự đơn giản. Bắt đầu từ một điểm, nó cố gắng xây dựng một cụm bằng cách nhóm [latex] \ epsilon- \ text {lân cận} [/latex], tức là các điểm có thể tiếp cận trực tiếp cho điểm. Nếu không có điểm như vậy, nó được dán nhãn là tiếng ồn. Nếu một số có sẵn, đối với các điểm này, các điểm có thể tiếp cận trực tiếp của chúng được thêm vào, v.v., cho đến khi cụm không thể được mở rộng thêm nữa. Sau đó, nó chọn một điểm không visit khác và thực hiện các bước tương tự, cho đến khi tất cả các điểm đã được truy cập. Sau đó chúng ta biết các cụm và các điểm ồn ào.

Biết về các khối xây dựng và cách thuật toán hoạt động về mặt khái niệm, sau đó chúng tôi đã chuyển tiếp và cung cấp một triển khai Python cho DBSCAN bằng cách sử dụng Scikit-learn. Chúng tôi đã thấy rằng chỉ với một vài dòng mã Python, chúng tôi có thể tạo một bộ dữ liệu, áp dụng phân cụm DBSCAN cho nó, trực quan hóa các cụm và thậm chí xóa các điểm ồn ào. Cái sau làm cho bộ dữ liệu của chúng tôi sạch hơn mà không mất nhiều thông tin cốt lõi có sẵn trong các cụm.

Đặt một câu hỏi

Tôi hy vọng rằng bạn đã học được điều gì đó từ bài báo hôm nay. Nếu bạn có bất kỳ câu hỏi nào, bạn có thể để lại một bình luận trong phần bình luận bên dưới. Bạn cũng có thể nhấp vào nút màu xanh lá cây bên phải, nơi bạn có thể đặt câu hỏi của bạn trong diễn đàn câu hỏi của chúng tôi. Xin vui lòng để lại một bình luận nếu bạn có những nhận xét hoặc đề xuất khác để cải thiện. Tôi rất muốn nghe từ bạn.Ask Questions forum. Please feel free to leave a comment as well if you have other remarks or suggestions for improvement. I'd love to hear from you.

Cảm ơn bạn đã đọc MachineCurve hôm nay và Kỹ thuật hạnh phúc! 😎


Người giới thiệu

Wikipedia. (2007, ngày 16 tháng 10). & NBSP; DBSCAN. Wikipedia, bách khoa toàn thư miễn phí. Truy cập & nbsp; tháng 12 & nbsp; 8, 2020, từ & nbsp; https: //en.wikipedia.org/wiki/dbscan

SCIKIT-LEARN. . Scikit-learn: Học máy trong Python-Scikit-LEARN 0.16.1 Tài liệu. Truy cập & nbsp; tháng 12 & nbsp; 9, 2020, từ & nbsp; https: //scikit-learn.org/stable/modules/generated/sklearn.cluster.dbscan.html#sklearn.cluster.dbscan

Wikipedia. (2004, ngày 21 tháng 5). & NBSP; Phân tích cụm. Wikipedia, bách khoa toàn thư miễn phí. Truy cập & nbsp; tháng 12 & nbsp; 9, 2020, từ & nbsp; https: //en.wikipedia.org/wiki/cluster_analysis