無監督機器學習算法沒有任何主管提供任何類型的指導。這就是爲什麼它們與一些人所說的真正的人工智慧密切相關。
在無監督的學習中,沒有正確的答案,也沒有老師指導。算法需要發現用於學習的數據中的有趣模式。
What is Clustering?
基本上,它是一種無監督的學習方法,是統計數據分析中常用的一種技術。聚類主要是將一組觀測值分成若干子集,稱爲聚類,這樣同一個聚類中的觀測值在某種意義上是相似的,並且它們與其他聚類中的觀測值不同。簡單地說,我們可以說聚類的主要目的是基於相似性和相異性對數據進行分組。
例如,下圖顯示了不同集羣中類似類型的數據;
Algorithms for Clustering the Data
以下是一些常用的數據聚類算法−
K-Means algorithm
K-means聚類算法是一種著名的數據聚類算法。我們需要假設集羣的數量是已知的。這也被稱爲平面聚類。它是一種疊代聚類算法。此算法需要遵循以下步驟−
步驟1−我們需要指定所需的K個子組數。
第2步−修復羣集數並將每個數據點隨機分配給羣集。或者換句話說,我們需要根據集羣的數量對數據進行分類。
在此步驟中,應計算簇質心。
由於這是一個疊代算法,我們需要在每次疊代中更新K個質心的位置,直到找到全局最優解,或者質心到達它們的最優位置。
下面的代碼將有助於在Python中實現K-means聚類算法。我們將使用Scikit學習模塊。
讓我們進口必要的包裝;
import matplotlib.pyplot as plt import seaborn as sns; sns.set() import numpy as np from sklearn.cluster import KMeans
下面的代碼行將有助於通過使用sklearn.dataset包中的make-blob生成包含四個blob的二維數據集。
from sklearn.datasets.samples_generator import make_blobs X, y_true = make_blobs(n_samples = 500, centers = 4, cluster_std = 0.40, random_state = 0)
我們可以使用以下代碼可視化數據集−
plt.scatter(X[:, 0], X[:, 1], s = 50); plt.show()
在這裡,我們將kmeans初始化爲kmeans算法,所需參數是多少個集羣(n_clusters)。
kmeans = KMeans(n_clusters = 4)
我們需要用輸入數據訓練K-均值模型。
kmeans.fit(X) y_kmeans = kmeans.predict(X) plt.scatter(X[:, 0], X[:, 1], c = y_kmeans, s = 50, cmap = 'viridis') centers = kmeans.cluster_centers_
下面給出的代碼將幫助我們根據我們的數據繪製和可視化機器的發現,並根據要找到的集羣數量進行安裝。
plt.scatter(centers[:, 0], centers[:, 1], c = 'black', s = 200, alpha = 0.5); plt.show()
Mean Shift Algorithm
它是另一種在無監督學習中使用的流行且強大的聚類算法。它不做任何假設,因此它是一個非參數算法。它也被稱爲層次聚類或均值漂移聚類分析。以下是該算法的基本步驟&負;
首先,我們需要從分配給自己集羣的數據點開始。
現在,它計算質心並更新新質心的位置。
通過重複這一過程,我們將向更高密度的區域靠近團簇的峯值。
此算法停止在質心不再移動的階段。
藉助以下代碼,我們在Python中實現Mean-Shift聚類算法。我們將使用Scikit學習模塊。
讓我們進口必要的包裝;
import numpy as np from sklearn.cluster import MeanShift import matplotlib.pyplot as plt from matplotlib import style style.use("ggplot")
下面的代碼將有助於通過使用sklearn.dataset包中的make-blob生成包含四個blob的二維數據集。
from sklearn.datasets.samples_generator import make_blobs
我們可以使用以下代碼可視化數據集
centers = [[2,2],[4,5],[3,10]] X, _ = make_blobs(n_samples = 500, centers = centers, cluster_std = 1) plt.scatter(X[:,0],X[:,1]) plt.show()
現在,我們需要用輸入數據訓練均值漂移聚類模型。
ms = MeanShift() ms.fit(X) labels = ms.labels_ cluster_centers = ms.cluster_centers_
下面的代碼將根據輸入的數據列印集羣中心和預期的集羣數量;
print(cluster_centers) n_clusters_ = len(np.unique(labels)) print("Estimated clusters:", n_clusters_) [[ 3.23005036 3.84771893] [ 3.02057451 9.88928991]] Estimated clusters: 2
下面給出的代碼將有助於根據我們的數據繪製和可視化機器的發現,以及根據要找到的集羣數量進行安裝。
colors = 10*['r.','g.','b.','c.','k.','y.','m.'] for i in range(len(X)): plt.plot(X[i][0], X[i][1], colors[labels[i]], markersize = 10) plt.scatter(cluster_centers[:,0],cluster_centers[:,1], marker = "x",color = 'k', s = 150, linewidths = 5, zorder = 10) plt.show()
Measuring the Clustering Performance
真實世界的數據並不是自然地組織成許多不同的集羣。正是由於這個原因,我們很難想像和推斷。這就是爲什麼我們需要衡量集羣的性能和質量。它可以通過輪廓分析來完成。
Silhouette Analysis
該方法可以通過測量聚類之間的距離來檢驗聚類質量。基本上,它提供了一種通過給出輪廓得分來評估參數(比如簇的數量)的方法。此分數是一個度量指標,用于衡量一個簇中的每個點與相鄰簇中的點之間的距離。
Analysis of silhouette score
分數的範圍是[-1,1]。下面是對這個分數的分析;
得分+1−得分接近+1表示樣本遠離相鄰的簇。
得分爲0−得分爲0表示樣本位於或非常接近兩個相鄰簇之間的決策邊界。
得分爲-1&負分表示樣本分配到了錯誤的簇。
Calculating Silhouette Score
在本節中,我們將學習如何計算輪廓分數。
剪影得分可以使用以下公式計算&負;
$$silhouette score = \frac{\left ( p-q \right )}{max\left ( p,q \right )}$$
這裡,𝑝是到數據點不屬於的最近簇中的點的平均距離。其中,𝑞是到它自己的簇中所有點的平均簇內距離。
爲了找到最佳的集羣數量,我們需要從sklearn包導入metrics模塊,再次運行集羣算法。在下面的例子中,我們將運行K-means聚類算法來找到最佳的聚類數;
如圖所示進口必要的包裝;
import matplotlib.pyplot as plt import seaborn as sns; sns.set() import numpy as np from sklearn.cluster import KMeans
在以下代碼的幫助下,我們將使用sklearn.dataset包中的make-blob生成包含四個blob的二維數據集。
from sklearn.datasets.samples_generator import make_blobs X, y_true = make_blobs(n_samples = 500, centers = 4, cluster_std = 0.40, random_state = 0)
如圖所示初始化變量;
scores = [] values = np.arange(2, 10)
我們需要在所有值中疊代K-means模型,還需要用輸入數據訓練它。
for num_clusters in values: kmeans = KMeans(init = 'k-means++', n_clusters = num_clusters, n_init = 10) kmeans.fit(X)
現在,使用歐氏距離度量估計當前聚類模型的輪廓得分;
score = metrics.silhouette_score(X, kmeans.labels_, metric = 'euclidean', sample_size = len(X))
下面的代碼行將有助於顯示集羣的數量以及輪廓分數。
print("\nNumber of clusters =", num_clusters) print("Silhouette score =", score) scores.append(score)
您將收到以下輸出&負;
Number of clusters = 9 Silhouette score = 0.340391138371 num_clusters = np.argmax(scores) + values[0] print('\nOptimal number of clusters =', num_clusters)
現在,最佳集羣數量的輸出如下所示&負;
Optimal number of clusters = 2
Finding Nearest Neighbors
如果我們想要建立推薦系統,比如電影推薦系統,那麼我們需要理解尋找最近鄰居的概念。這是因爲推薦系統利用了近鄰的概念。
找到最近鄰的概念可以定義爲從給定的數據集中找到離輸入點最近的點的過程。這種KNN)K近鄰(K-nearest neighbors)算法的主要用途是建立分類系統,在輸入數據點與各種類的接近程度上對數據點進行分類。
下面給出的Python代碼有助於找到給定數據集的K近鄰;
導入必要的包,如下所示。在這裡,我們使用sklearn包中的nearest neighbors模塊
import numpy as np import matplotlib.pyplot as plt from sklearn.neighbors import NearestNeighbors
現在讓我們定義輸入數據;
A = np.array([[3.1, 2.3], [2.3, 4.2], [3.9, 3.5], [3.7, 6.4], [4.8, 1.9], [8.3, 3.1], [5.2, 7.5], [4.8, 4.7], [3.5, 5.1], [4.4, 2.9],])
現在,我們需要定義最近的鄰居;
k = 3
我們還需要給出測試數據,從中可以找到最近的鄰居;
test_data = [3.3, 2.9]
下面的代碼可以可視化並繪製由us−定義的輸入數據;
plt.figure() plt.title('Input data') plt.scatter(A[:,0], A[:,1], marker = 'o', s = 100, color = 'black')
現在,我們需要建立K最近的鄰居。這個物體也需要訓練
knn_model = NearestNeighbors(n_neighbors = k, algorithm = 'auto').fit(X) distances, indices = knn_model.kneighbors([test_data])
現在,我們可以列印K個最近的鄰居,如下所示
print("\nK Nearest Neighbors:") for rank, index in enumerate(indices[0][:k], start = 1): print(str(rank) + " is", A[index])
我們可以看到最近的鄰居和測試數據點
plt.figure() plt.title('Nearest neighbors') plt.scatter(A[:, 0], X[:, 1], marker = 'o', s = 100, color = 'k') plt.scatter(A[indices][0][:][:, 0], A[indices][0][:][:, 1], marker = 'o', s = 250, color = 'k', facecolors = 'none') plt.scatter(test_data[0], test_data[1], marker = 'x', s = 100, color = 'k') plt.show()
Output
K近鄰
1 is [ 3.1 2.3] 2 is [ 3.9 3.5] 3 is [ 4.4 2.9]
K-Nearest Neighbors Classifier
K近鄰(KNN)分類器是一種利用近鄰算法對給定數據點進行分類的分類模型。在最後一節中我們已經實現了KNN算法,現在我們將使用該算法構建一個KNN分類器。
Concept of KNN Classifier
K-最近鄰分類的基本概念是找到一個預先定義的數目,即距離新樣本最近的訓練樣本的「K」減去,必須對其進行分類。新的樣品將從鄰居那裡得到標籤。KNN分類器有一個固定的用戶定義常數,用於確定鄰居的數目。對於距離,標準歐氏距離是最常見的選擇。KNN分類器直接作用於學習樣本,而不是創建學習規則。KNN算法是所有機器學習算法中最簡單的一種。它已經在許多分類和回歸問題上取得了成功,例如字符識別或圖像分析。
示例
我們正在構建一個KNN分類器來識別數字。爲此,我們將使用MNIST數據集。我們將把這段代碼寫在Jupyter筆記本上。
導入必要的包,如下所示。
在這裡,我們使用來自sklearn.neighborsscifier包的kneighborsclier模塊−
from sklearn.datasets import * import pandas as pd %matplotlib inline from sklearn.neighbors import KNeighborsClassifier import matplotlib.pyplot as plt import numpy as np
下面的代碼將顯示數字圖像,以驗證我們需要測試的圖像是什麼;
def Image_display(i): plt.imshow(digit['images'][i],cmap = 'Greys_r') plt.show()
現在,我們需要加載MNIST數據集。實際上總共有1797張圖片,但是我們使用前1600張圖片作爲訓練樣本,剩下的197張將保留下來用於測試。
digit = load_digits() digit_d = pd.DataFrame(digit['data'][0:1600])
現在,在顯示圖像時,我們可以看到輸出如下所示;
Image_display(0)
Image_display(0)
0的圖像顯示如下−
Image_display(9)
9的圖像顯示如下&負;
digit.keys()
現在,我們需要創建訓練和測試數據集,並爲KNN分類器提供測試數據集。
train_x = digit['data'][:1600] train_y = digit['target'][:1600] KNN = KNeighborsClassifier(20) KNN.fit(train_x,train_y)
下面的輸出將創建K近鄰分類器構造函數-minus;
KNeighborsClassifier(algorithm = 'auto', leaf_size = 30, metric = 'minkowski', metric_params = None, n_jobs = 1, n_neighbors = 20, p = 2, weights = 'uniform')
我們需要通過提供任何大於1600的任意數字來創建測試樣本,這是訓練樣本。
test = np.array(digit['data'][1725]) test1 = test.reshape(1,-1) Image_display(1725)
Image_display(6)
6的圖像顯示如下&負;
現在我們將按以下方式預測測試數據–-;
KNN.predict(test1)
上面的代碼將生成以下輸出−
array([6])
現在,請考慮以下幾點;
digit['target_names']
上面的代碼將生成以下輸出−