<ruby id="bdb3f"></ruby>

    <p id="bdb3f"><cite id="bdb3f"></cite></p>

      <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
        <p id="bdb3f"><cite id="bdb3f"></cite></p>

          <pre id="bdb3f"></pre>
          <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

          <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
          <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

          <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                <ruby id="bdb3f"></ruby>

                企業??AI智能體構建引擎,智能編排和調試,一鍵部署,支持知識庫和私有化部署方案 廣告
                # 二、聚類 在本章中,我們將開始應用在上一章中學到的數據轉換操作,并開始使用聚類技術在某些給定信息中找到有趣的模式,發現數據組或集群。 在此過程中,我們還將獲得兩個新工具:能夠通過 scikit-learn 庫從一組代表性數據結構中生成合成樣本集,并且能夠通過 matplotlib 庫以圖形方式繪制我們的數據和模型結果 。 我們將在本章中介紹的主題如下: * 了解群集的工作原理,并將其與替代的現有分類技術進行比較 * 使用 scikit-learn 和 matplotlib 豐富數據集選擇的可能性,并獲得看起來專業的數據圖形表示 * 實現 K 均值聚類算法 * 實現最近鄰法,并將結果與??K 均值進行比較 # 從數據中學習 -- 無監督學習 在本章中,我們將回顧兩種無監督學習的情況。 無監督學習基本上包括在先前的數據集中查找模式。 通常,很少或沒有信息提供給該技術,并且該過程應該能夠自動確定信息的組織方式,并識別數據組織中的不同結構。 # 聚類 最初可用于未標記數據集的最簡單的操作之一是嘗試了解數據集成員共同特征的可能組。 為此,可以將數據集劃分為任意數量的段,其中每個段都可以表示為中心質量(質心)點,該點代表屬于已確定組或聚類的點。 為了定義將同一組分配給不同組成員的標準,我們需要定義一個表示數據元素之間距離的概念,因此我們可以簡單地說,所有類成員比任何其他質心更接近自己的質心 。 在下圖中,我們可以看到典型聚類算法的結果以及聚類中心的表示形式: ![Clustering](https://img.kancloud.cn/65/81/65817934efdba029beef12fb0e105abe_566x449.jpg) 樣本聚類算法輸出 # K 均值 K 均值是一種非常流行的聚類算法,可以輕松實現。 這非常簡單,將它作為具有良好類分離性的數據集的第一個過程應用,可以對數據有很好的先驗理解。 ## K 均值的原理 K 均值嘗試使用成員的平均值作為主要指標,將一組樣本分成 k 個不相交的組或簇。 這一點通常稱為質心,指代具有相同名稱的算術實體,并表示為任意尺寸空間中的向量。 K 均值是一種幼稚的方法,因為它通過查找適當的質心而起作用,但是不知道先驗簇的數量是多少。 為了評估多少簇能夠很好地表示所提供的數據,Elbow 方法是一種比較流行的方法。 ### 算法迭代準則 此方法的標準和目標是最小化從群集成員到所有包含群集的樣本的實際質心的平方距離之和。 這也稱為慣性最小化。 ![Algorithm iteration criterion](https://img.kancloud.cn/9e/51/9e51894cc445a37c0d23bd8c78d5196d_411x136.jpg) K 均值的誤差最小化準則 ![](https://img.kancloud.cn/41/fb/41fb04814b73a162d5ee32afe1fcf055_140x50.gif) ## K 均值算法細分 K 均值算法的機制可以通過以下流程圖總結: ![k-means algorithm breakdown](https://img.kancloud.cn/cf/10/cf10716535122595fd31ca7b9c82dcc2_386x662.jpg) K 均值過程的簡化流程圖 該算法可以簡化如下: 1. 我們從未分類的樣本開始,以 k 個元素為起始質心。 為了簡潔起見,也可以簡化此算法,使元素列表中的第一個元素成為第一個元素。 2. 然后,我們計算樣本與首先選擇的樣本之間的距離,并獲得第一個計算出的質心(或其他代表值)。 您可以看到圖中的質心向著更常識的質心移動。 3. 形心更改后,它們的位移將引起各個距離發生更改,因此群集成員身份可能會更改。 4. 這是我們重新計算質心并在不滿足停止條件的情況下重復第一步的時候。 停止條件可以有多種類型: * 在 N 次迭代之后,可能是要么我們選擇了一個非常大的數,然后我們將進行不必要的計算,否則它可能會收斂得很慢,并且如果質心沒有非常穩定的方法,我們將得到非常令人難以置信的結果。 如果我們有一個很長的迭代過程,那么這個停止條件也可以作為最后的手段。 * 參考先前的平均結果,可能的更好的迭代收斂標準是看重心的變化,無論是在總位移還是總簇元切換中。 最后一個通常被使用,因此一旦沒有更多元素從其當前群集更改為另一個群集,我們將停止該過程。 ![k-means algorithm breakdown](https://img.kancloud.cn/f3/da/f3dae8a4efdff461cf8fbc2d6dd4e80e_566x519.jpg) K 均值簡化圖形 ### K 均值的優缺點 這種方法的優點是: * 它可以很好地擴展(大多數計算可以并行運行) * 它已經被用于很多應用中 但是,簡單性也要付出代價(沒有適用的規則): * 它需要先驗知識(可能的簇數應事先知道) * 離群值可以推入質心的值,因為它們的值與任何其他樣本相同 * 由于我們假設該圖是凸且各向同性的,因此對于非圓形定界簇來說效果不佳 # K 最近鄰 K 最近鄰(KNN)是一種簡單的經典聚類方法,它將很好地介紹此類技術,著眼于每個樣本的附近,并假設每個新樣本都應屬于的類別。 已經知道的數據點。 ![k-nearest neighbors](https://img.kancloud.cn/0f/a7/0fa76c38959e33a07a10e9c32be56ed5_282x596.jpg) ## K 最近鄰的原理 KNN 可以在我們的多種配置中實現,但是在本章中,我們將使用“半監督”方法。 我們將從一定數量的已分配樣本開始,稍后我們將根據訓練集的特征猜測集群成員。 ![Mechanics of k-nearest neighbors](https://img.kancloud.cn/6c/b8/6cb8770e14c4f8893e3355963625d17b_566x575.jpg) 最近鄰算法 在上圖中,我們可以看到該算法的細分。 可以通過以下步驟進行總結: 1. 我們將先前已知的樣本放在數據結構上。 2. 然后,我們讀取要分類的下一個樣本,并計算從新樣本到訓練集的每個樣本的歐幾里得距離。 3. 我們通過根據歐幾里得距離選擇最近的樣本的類別來確定新元素的類別。 KNN 方法需要對 k 個最接近的樣本進行投票。 4. 我們重復該過程,直到沒有剩余的樣本為止。 ### KNN 的優缺點 這種方法的優點是: * 簡單; 無需調整參數 * 沒有正規訓練; 我們只需要更多的訓練實例來改進模型 缺點: * 計算昂貴(必須計算點與每個新樣本之間的所有距離) ## 有用庫的實用示例 在以下各節中,我們將討論一些有用的庫。 ### matplotlib 繪圖庫 數據繪圖是數據科學學科不可或缺的一部分。 因此,我們需要一個非常強大的框架來繪制結果。 對于此任務,我們沒有在 TensorFlow 中實現的通用解決方案,我們將使用 matplotlib 庫。 在 matplotlib 站點(`http://matplotlib.org/`)中,定義為: > matplotlib 是一個 Python 2D 繪圖庫,它以各種硬拷貝格式和跨平臺的交互式環境生成出版物質量的圖形。 #### 合成樣本的數據繪圖 在此示例中,我們將生成一個包含 100 個隨機數的列表,生成樣本圖,并將結果保存在圖形文件中: ```py import tensorflow as tf import numpy as np import matplotlib.pyplot as plt with tf.Session() as sess: fig, ax = plt.subplots() ax.plot(tf.random_normal([100]).eval(), tf.random_normal([100] ).eval(),'o') ax.set_title('Sample random plot for TensorFlow') plt.savefig("result.png") ``` 這是結果圖像: ![Sample synthetic data plotting](https://img.kancloud.cn/6c/b8/6cb8770e14c4f8893e3355963625d17b_566x575.jpg) 使用 TensorFlow 和 matplotlib 生成的示例圖 ### 提示 為了查看 scikit 數據集模塊的更一般的解釋,請參考 [matplotlib.org](http://matplotlib.org/)。 ### scikit-learn 數據集模塊 TensorFlow 當前未實現用于輕松生成合成數據集的方法。 因此,我們將使用`sklearn`庫作為幫助程序。 #### 關于 scikit-learn 庫 [從其網站](http://scikit-learn.org/stable/): > scikit-learn(以前為`scikits.learn`)是針對 Python 編程語言的開源機器學習庫。它具有各種分類,回歸和聚類模型,旨在與 Python 數字和科學庫 NumPy 和 SciPy 互操作。 在此示例中,我們將使用數據集模塊,該模塊處理許多眾所周知的合成和現場提取的數據集的生成和加載。 ### 提示 為了查看 scikit 數據集模塊的更一般的解釋,請參考[此鏈接](http://scikit-learn.org/stable/datasets/)。 ### 合成數據集類型 我們將使用一些生成的數據集類型: ![Synthetic dataset types](https://img.kancloud.cn/f2/de/f2de1e954beb69031ef8e3e49f5425f7_566x425.jpg) Blob,圓圈和月亮數據集類型 ### Blob 數據集 該數據集是測試簡單聚類算法的理想選擇。 不會出現問題,因為數據是一致地分組的,并且類別的分離很明確。 #### 采用的方法 以下方法用于所采用的方法: ```py sklearn.datasets.make_blobs(n_samples=100, n_features=2, centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None) ``` 在這里,`n_samples`是數據總數,`n_features`是數據的列數或特征數,`centers`是中心列表或許多隨機中心,`cluster_std`是標準偏差,`center_box`是隨機生成中心時每個聚類中心的邊界框,`shuffle`指示是否必須對樣本進行混洗,`random_state`是隨機種子。 ### 圓圈數據集 這是在其他圓圈中具有圓圈的數據集。 這是一個非線性的,可分離的問題,因此需要通過非線性模型來解決。 這排除了諸如 K 均值的簡單算法。 在本章中,我們將嘗試使用它來闡明觀點。 #### 采用的方法 以下方法用于所采用的方法: ```py sklearn.datasets.make_circles(n_samples=100,shuffle=True,noise=None, random_state=None,factor=0.8) ``` 在這里,`n_samples`是數據總數,`shuffle`表示是否必須對樣本進行混洗,`noise`是要應用于循環數據的隨機量的數量,`random_state`是隨機種子,并且`factor`是圓之間的比例因子。 ### 月亮數據集 這是另一個非線性問題,但是具有另一種類型的類分離,因為沒有諸如圓環之類的閉合。 # 項目 1 -- 合成數據集上的 K 均值聚類 ## 數據集說明和加載 在本章中,我們將使用生成的數據集,這些數據集經過特殊設計以具有特殊的屬性。 目標屬性中的兩個是類別線性分離的可能性以及是否存在明顯分離的群集。 ### 生成數據集 通過這些行,我們創建了數據結構,其中將包含用于解決方案的所有元素,即: ```py centers = [(-2, -2), (-2, 1.5), (1.5, -2), (2, 1.5)] data, features = make_blobs (n_samples=200, centers=centers, n_features = 2, cluster_std=0.8, shuffle=False, random_state=42) ``` 通過 matplotlib 繪制數據集圖: ```py ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) plt.plot() ``` ## 模型架構 `points`變量包含數據集點的 2D 坐標,質心變量將包含組中心點的坐標,`cluster_assignments`變量包含每個數據元素的質心索引。 例如,`cluster_assignments[2] = 1`表示`data[2]`數據點屬于具有中心重心`1`的群集。 重心`1`的位置位于`centroids[1]`中。 ```py points=tf.Variable(data) cluster_assignments = tf.Variable(tf.zeros([N], dtype=tf.int64)) centroids = tf.Variable(tf.slice(points.initialized_value(), [0,0], [K,2])) ``` 然后,我們可以使用 matplotlib 繪制這些質心的位置: ```py fig, ax = plt.subplots() ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) plt.show() ``` ![Model architecture](https://img.kancloud.cn/f2/de/f2de1e954beb69031ef8e3e49f5425f7_566x425.jpg) 初始中心播種 ## 損失函數描述和優化器循環 然后,我們將對所有質心進行 N 份復制,對每個點進行 K 份復制,對每個點進行`N x K`份復制,因此我們可以針對每個維度計算出每個點與每個質心之間的距離: ```py rep_centroids = tf.reshape(tf.tile(centroids, [N, 1]), [N, K, 2]) rep_points = tf.reshape(tf.tile(points, [1, K]), [N, K, 2]) sum_squares = tf.reduce_sum(tf.square(rep_points - rep_centroids), reduction_indices=2) ``` 然后,我們對所有維度執行總和,并獲得最低總和的索引(這將是分配給每個點的質心或聚類的索引): ```py best_centroids = tf.argmin(sum_squares, 1) ``` 質心也將使用完整源代碼中定義的`bucket:mean`函數進行更新。 ## 停止條件 這是新質心和分配不變的停止條件: ```py did_assignments_change = tf.reduce_any(tf.not_equal(best_centroids, cluster_assignments)) ``` 在這里,我們使用`control_dependencies`來計算是否需要更新質心: ```py with tf.control_dependencies([did_assignments_change]): do_updates = tf.group( centroids.assign(means), cluster_assignments.assign(best_centroids)) ``` ## 結果描述 程序執行后,我們得到以下輸出: ![Results description](https://img.kancloud.cn/7f/01/7f01387ddc0c67986b715cd0f2bccda5_566x178.jpg) 這是一輪迭代后質心變化的匯總圖,其中繪制了從算法生成的原始聚類。 在下圖中,我們針對這種明顯分離的情況表示了 K 均值算法在應用中的不同階段: ![Results description](https://img.kancloud.cn/7f/01/7f01387ddc0c67986b715cd0f2bccda5_566x178.jpg) 每次迭代的質心變化 ## 完整源代碼 以下是完整的源代碼: ```py import tensorflow as tf import numpy as np import time import matplotlib import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_blobs from sklearn.datasets.samples_generator import make_circles DATA_TYPE = 'blobs' # Number of clusters, if we choose circles, only 2 will be enough if (DATA_TYPE == 'circle'): K=2 else: K=4 # Maximum number of iterations, if the conditions are not met MAX_ITERS = 1000 start = time.time() centers = [(-2, -2), (-2, 1.5), (1.5, -2), (2, 1.5)] if (DATA_TYPE == 'circle'): data, features = make_circles(n_samples=200, shuffle=True, noise= 0.01, factor=0.4) else: data, features = make_blobs (n_samples=200, centers=centers, n_features = 2, cluster_std=0.8, shuffle=False, random_state=42) fig, ax = plt.subplots() ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) plt.show() fig, ax = plt.subplots() if (DATA_TYPE == 'blobs'): ax.scatter(np.asarray(centers).transpose()[0], np.asarray(centers).transpose()[1], marker = 'o', s = 250) ax.scatter(data.transpose()[0], data.transpose()[1], marker = 'o', s = 100, c = features, cmap=plt.cm.coolwarm ) plt.plot() points=tf.Variable(data) cluster_assignments = tf.Variable(tf.zeros([N], dtype=tf.int64)) centroids = tf.Variable(tf.slice(points.initialized_value(), [0,0], [K,2])) sess = tf.Session() sess.run(tf.initialize_all_variables()) rep_centroids = tf.reshape(tf.tile(centroids, [N, 1]), [N, K, 2]) rep_points = tf.reshape(tf.tile(points, [1, K]), [N, K, 2]) sum_squares = tf.reduce_sum(tf.square(rep_points - rep_centroids), reduction_indices=2) best_centroids = tf.argmin(sum_squares, 1) did_assignments_change = tf.reduce_any(tf.not_equal(best_centroids, cluster_assignments)) def bucket_mean(data, bucket_ids, num_buckets): total = tf.unsorted_segment_sum(data, bucket_ids, num_buckets) count = tf.unsorted_segment_sum(tf.ones_like(data), bucket_ids, num_buckets) return total / count means = bucket_mean(points, best_centroids, K) with tf.control_dependencies([did_assignments_change]): do_updates = tf.group( centroids.assign(means), cluster_assignments.assign(best_centroids)) changed = True iters = 0 fig, ax = plt.subplots() if (DATA_TYPE == 'blobs'): colourindexes=[2,1,4,3] else: colourindexes=[2,1] while changed and iters < MAX_ITERS: fig, ax = plt.subplots() iters += 1 [changed, _] = sess.run([did_assignments_change, do_updates]) [centers, assignments] = sess.run([centroids, cluster_assignments]) ax.scatter(sess.run(points).transpose()[0], sess.run(points).transpose()[1], marker = 'o', s = 200, c = assignments, cmap=plt.cm.coolwarm ) ax.scatter(centers[:,0],centers[:,1], marker = '^', s = 550, c = colourindexes, cmap=plt.cm.plasma) ax.set_title('Iteration ' + str(iters)) plt.savefig("kmeans" + str(iters) +".png") ax.scatter(sess.run(points).transpose()[0], sess.run(points).transpose()[1], marker = 'o', s = 200, c = assignments, cmap=plt.cm.coolwarm ) plt.show() end = time.time() print ("Found in %.2f seconds" % (end-start)), iters, "iterations" print "Centroids:" print centers print "Cluster assignments:", assignments ``` 這是觀察算法機制的最簡單情況。 當數據來自真實世界時,這些類通常沒有那么清晰地分開,并且標記數據樣本更加困難。 ## 圓圈合成數據上的 K 均值 對于圓圖,我們觀察到這種數據表征并不容易用一組簡單的方法表示。 如圖所示,兩個圓要么共享一個質心的位置,要么真的很接近,因此我們無法預測明確的結果: ![k-means on circle synthetic data](https://img.kancloud.cn/67/49/67492e3aed207a19e269ca3446d1cfe5_547x415.jpg) 圓型數據集 對于此數據集,我們僅使用兩個類來確保了解此算法的主要缺點: ![k-means on circle synthetic data](https://img.kancloud.cn/29/60/29607b0dcd24a2e0706368689a0beba8_566x142.jpg) K 均值應用于圓形綜合數據集 如我們所見,初始中心向樣本數量最集中的區域漂移,因此將數據線性劃分。 這是我們現階段使用的簡單模型的局限性之一。 為了處理非線性可分離性樣本,我們可以嘗試本章范圍以外的其他統計方法,例如基于密度的帶噪應用空間聚類(DBSCAN)。 # 項目 2 -- 合成數據集上的最近鄰 在這個項目中,我們將加載一個數據集,使用該數據集,以前的算法(K 均值)在分離類時遇到問題。 ## 數據集生成 該數據集是第一個示例中具有兩個類的相同循環類數據集,但是這次我們將通過增加一些噪聲(從`0.01`到`0.12`)來增加錯誤概率: ```py data, features = make_circles(n_samples=N, shuffle=True, noise=0.12,factor=0.4) ``` 這是生成的訓練數據圖: ![Dataset generation](https://img.kancloud.cn/1a/3e/1a3e00c327a759c4211d65a7c5bd9215_532x424.jpg) ## 模型架構 將保留數據的變量只是原始數據和測試列表,其中將包含計算出的測試數據類: ```py data, features = make_circles(n_samples=N, shuffle=True, noise= 0.12, factor=0.4) tr_data, tr_features= data[:cut], features[:cut] te_data,te_features=data[cut:], features[cut:] test=[] ``` ## 損失函數說明 在聚類中,我們將使用函數來優化為歐式距離,與第 1 章,探索和轉換數據相同。 它是在集群分配循環上計算的,獲取從新點到現有訓練點的距離,要求最小值的索引,然后使用該索引搜索最近的鄰居的類: ```py distances = tf.reduce_sum(tf.square(tf.sub(i , tr_data)),reduction_indices=1) neighbor = tf.arg_min(distances,0) ``` ## 停止條件 在這個簡單的示例中,一旦訪問了測試分區的所有元素,我們將完成操作。 ## 結果描述 這是測試數據類分布的圖形,在這里我們可以看到清晰分開的類。 我們可以觀察到,至少在此有限的數據集范圍內,此方法比非重疊,斑點優化,K 均值方法更好。 ![Results description](https://img.kancloud.cn/f5/b8/f5b8a9ef5a96c215a967fe2b69480028_553x413.jpg) ## 完整源代碼 以下是完整的源代碼: ```py import tensorflow as tf import numpy as np import time import matplotlib import matplotlib.pyplot as plt from sklearn.datasets.samples_generator import make_circles N=210 K=2 # Maximum number of iterations, if the conditions are not met MAX_ITERS = 1000 cut=int(N*0.7) start = time.time() data, features = make_circles(n_samples=N, shuffle=True, noise= 0.12, factor=0.4) tr_data, tr_features= data[:cut], features[:cut] te_data,te_features=data[cut:], features[cut:] test=[] fig, ax = plt.subplots() ax.scatter(tr_data.transpose()[0], tr_data.transpose()[1], marker = 'o', s = 100, c = tr_features, cmap=plt.cm.coolwarm ) plt.plot() sess = tf.Session() sess.run(tf.initialize_all_variables()) for i, j in zip(te_data, te_features): distances = tf.reduce_sum(tf.square(tf.sub(i , tr_data)),reduction_indices=1) neighbor = tf.arg_min(distances,0) test.append(tr_features[sess.run(neighbor)]) print test fig, ax = plt.subplots() ax.scatter(te_data.transpose()[0], te_data.transpose()[1], marker = 'o', s = 100, c = test, cmap=plt.cm.coolwarm ) plt.plot() end = time.time() print ("Found in %.2f seconds" % (end-start)) print "Cluster assignments:", test ``` # 總結 在本章中,我們簡單地概述了一些我們可以實現的最基本的模型,但是嘗試在解釋中盡可能地詳細。 從現在開始,我們將能夠生成綜合數據集,從而使我們能夠快速測試模型對于不同數據配置的適當性,從而評估它們的優缺點,而不必加載具有大量未知特征的模型。 此外,我們已經實現了第一個迭代方法并測試了收斂性,該任務將以類似的方式在后續章節中繼續進行,但是將使用更精細,更精確的方法。 在下一章中,我們將使用線性函數解決分類問題,并且首次使用訓練集中的先前數據來學習其特征。 這是監督學習技術的目標,通常對于解決許多現實生活中的問題更有用。
                  <ruby id="bdb3f"></ruby>

                  <p id="bdb3f"><cite id="bdb3f"></cite></p>

                    <p id="bdb3f"><cite id="bdb3f"><th id="bdb3f"></th></cite></p><p id="bdb3f"></p>
                      <p id="bdb3f"><cite id="bdb3f"></cite></p>

                        <pre id="bdb3f"></pre>
                        <pre id="bdb3f"><del id="bdb3f"><thead id="bdb3f"></thead></del></pre>

                        <ruby id="bdb3f"><mark id="bdb3f"></mark></ruby><ruby id="bdb3f"></ruby>
                        <pre id="bdb3f"><pre id="bdb3f"><mark id="bdb3f"></mark></pre></pre><output id="bdb3f"></output><p id="bdb3f"></p><p id="bdb3f"></p>

                        <pre id="bdb3f"><del id="bdb3f"><progress id="bdb3f"></progress></del></pre>

                              <ruby id="bdb3f"></ruby>

                              哎呀哎呀视频在线观看