<label id="jgr5k"></label>
    <legend id="jgr5k"><track id="jgr5k"></track></legend>

    <sub id="jgr5k"></sub>
  1. <u id="jgr5k"></u>
      久草国产视频,91资源总站,在线免费看AV,丁香婷婷社区,久久精品99久久久久久久久,色天使av,无码探花,香蕉av在线
      您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號安全和更好的產(chǎn)品體驗,強烈建議使用更快更安全的瀏覽器
      此為臨時鏈接,僅用于文章預覽,將在時失效
      人工智能開發(fā)者 正文
      發(fā)私信給AI研習社-譯站
      發(fā)送

      0

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      本文作者: AI研習社-譯站 2018-06-21 16:13
      導語:聚類分析不需要有標簽的數(shù)據(jù)集,它可以根據(jù)數(shù)據(jù)成員的相似性對它們進行分組。

      雷鋒網(wǎng) AI 研習社按:本文為雷鋒網(wǎng)字幕組編譯的技術(shù)博客,原標題 A、Word2Vec?—?a baby step in Deep Learning but a giant leap towards Natural Language Processing,作者為機器學習工程師 Suvro Banerjee

      翻譯 | 程煒 李昊洋   整理  |  孔令雙

      原文鏈接:

      https://medium.com/@chengweizhang2012/how-to-do-unsupervised-clustering-with-keras-9e1284448437

      由于深度學習算法在表達非線性表征上的卓越能力,它非常適合完成輸入到有標簽的數(shù)據(jù)集輸出的映射。這種任務叫做分類。它需要有人對數(shù)據(jù)進行標注。無論是對 X 光圖像還是對新聞報道的主題進行標注,在數(shù)據(jù)集增大的時候,依靠人類進行干預的做法都是費時費力的。

      聚類分析,或者稱作聚類是一種無監(jiān)督的機器學習技術(shù)。它不需要有標簽的數(shù)據(jù)集。它可以根據(jù)數(shù)據(jù)成員的相似性對它們進行分組。

      你為什么需要關(guān)注它呢?讓我來講講幾個理由。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      聚類的應用

      • 推薦系統(tǒng),通過學習用戶的購買歷史,聚類模型可以根據(jù)相似性對用戶進行區(qū)分。它可以幫助你找到志趣相投的用戶,以及相關(guān)商品。

      • 在生物學上,序列聚類算法試圖將相關(guān)的生物序列進行分組。它根據(jù)氨基酸含量對蛋白進行聚類。

      • 圖像和視頻聚類分析根據(jù)相似性對它們進行分組。

      • 在醫(yī)療數(shù)據(jù)庫中,對每個病人來說,真正有價值的測試(比如葡萄糖,膽固醇)都是不同的。首先對病人進行聚類分析可以幫助我們對真正有價值的特征進行分類,從而減少特征分散。它可以增加分類任務的準確性,比如在癌癥病人生存預測上。

      • 在一般用途上,它可以生成一個數(shù)據(jù)的匯總信息用于分類,模式發(fā)現(xiàn),假設生成,以及測試。

      無論如何,對于數(shù)據(jù)科學家來說,聚類都是非常有價值的工具。

      如何才是好的聚類

      一個好的聚類方法應該生成高質(zhì)量的分類,它有如下特點:

      1. 群組內(nèi)部的高相似性:群組內(nèi)的緊密聚合

      2. 群組之間的低相似性:群組之間各不相同

      為 K-Means 算法設置一個基線

      傳統(tǒng)的 K-Means 算法速度快,并且可以廣泛應用于解決各種問題。但是,它的距離度量受限于原始的數(shù)據(jù)空間。因此在輸入數(shù)據(jù)維度較高時,它的效率就會降低,比如說圖像集。

      讓我們來訓練一個 K-Means 模型對 MNIST 手寫字體進行聚類分析到 10 個群組中。

      from sklearn.cluster import KMeans

      from keras.datasets import mnist


      (x_train, y_train), (x_test, y_test) = mnist.load_data()

      x = np.concatenate((x_train, x_test))

      y = np.concatenate((y_train, y_test))

      x = x.reshape((x.shape[0], -1))

      x = np.divide(x, 255.)

      # 10 clusters

      n_clusters = len(np.unique(y))

      # Runs in parallel 4 CPUs

      kmeans = KMeans(n_clusters=n_clusters, n_init=20, n_jobs=4)

      # Train K-Means.

      y_pred_kmeans = kmeans.fit_predict(x)

      # Evaluate the K-Means clustering accuracy.

      metrics.acc(y, y_pred_kmeans)

      評估得到 K-Means 聚類算法的準確度在 53.2%。后面我們會將它與深度嵌入聚類模型進行比較。

      • 一個自動編碼器,通過前訓練,學習無標簽數(shù)據(jù)集初始壓縮后的表征。

      • 建立在編碼器之上的聚類層將輸出送給一個群組。基于當前評估得到的 K-Means 聚類中心,聚類層完成權(quán)重值的初始化。

      • 訓練聚類模型,同時改善聚類層和編碼器。

      在找源代碼嗎?到我的 Github 上看看。

      前訓練自動編碼器

      自動編碼器是一個數(shù)據(jù)壓縮算法。它由編碼器和解碼器兩個主要部分構(gòu)成。編碼器的工作是將輸入數(shù)據(jù)壓縮成較低維度的特征。比如,一個 28x28 的 MNIST 圖像總共有 784 個像素。編碼器可以將它壓縮成 10 個浮點數(shù)組成的數(shù)組。我們將這些浮點數(shù)作為圖像的特征。另一方面,解碼器將壓縮后的特征作為輸入,通過它重建出與原始圖像盡可能相近似的圖像。實際上,自動編碼器是一個無監(jiān)督學習算法。在訓練過程中,它只需要圖像本身,而不需要標簽。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      自動編碼器

      自動編碼器是一個全連接對稱模型。之所以是對稱的,是因為圖像的壓縮和解壓過程是一組完全相反的對應過程。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      全連接自動編碼器

      我們將會對自動編碼器進行 300 輪訓練,并保存下模型權(quán)重值。

      autoencoder.fit(x, x, batch_size=256, epochs=300) #, callbacks=cb)

      autoencoder.save_weights('./results/ae_weights.h5')

      聚類模型

      通過訓練自動編碼器,我們已經(jīng)使編碼器學會了將每幅圖像壓縮成 10 個浮點數(shù)。你可能會想,因為輸入維度減少到 10, K-Means 算法應該可以以此開始聚類?是的,我們將會使用 K-Means 算法生成聚類中心。它是 10 維特征向量空間的 10 個群組的中心。但是我們還要建立我們的自定義聚類層,將輸入特征轉(zhuǎn)化為群組標簽概率。

      這個概率是由 t-分布計算得來。 T-分布,和t-分布鄰域嵌入算法一樣,測度了內(nèi)含點和中心點之間的相似度。正如你所猜測的那樣,聚類層的作用類似于用于聚類的K-means,并且該層的權(quán)重表示可以通過訓練K均值來初始化的聚類質(zhì)心。

      如果您是在 Keras 中創(chuàng)建自定義圖層的新手,那么您可以實施三種強制方法。

      • build(input_shape),在這里你定義圖層的權(quán)重,在我們的例子中是10-D特征空間中的10個簇,即10x10個權(quán)重變量。

      • call(x),層邏輯所在的地方,即從特征映射到聚類標簽魔術(shù)的地方。

      • compute_output_shape(input_shape),在這里指定從輸入形狀到輸出形狀的形狀轉(zhuǎn)換邏輯。

      Here is the custom clustering layer code,

      class ClusteringLayer(Layer):

          """

          Clustering layer converts input sample (feature) to soft label.


          # Example

          ```

              model.add(ClusteringLayer(n_clusters=10))

          ```

          # Arguments

              n_clusters: number of clusters.

              weights: list of Numpy array with shape `(n_clusters, n_features)` witch represents the initial cluster centers.

              alpha: degrees of freedom parameter in Student's t-distribution. Default to 1.0.

          # Input shape

              2D tensor with shape: `(n_samples, n_features)`.

          # Output shape

              2D tensor with shape: `(n_samples, n_clusters)`.

          """


          def __init__(self, n_clusters, weights=None, alpha=1.0, **kwargs):

              if 'input_shape' not in kwargs and 'input_dim' in kwargs:

                  kwargs['input_shape'] = (kwargs.pop('input_dim'),)

              super(ClusteringLayer, self).__init__(**kwargs)

              self.n_clusters = n_clusters

              self.alpha = alpha

              self.initial_weights = weights

              self.input_spec = InputSpec(ndim=2)


          def build(self, input_shape):

              assert len(input_shape) == 2

              input_dim = input_shape[1]

              self.input_spec = InputSpec(dtype=K.floatx(), shape=(None, input_dim))

              self.clusters = self.add_weight((self.n_clusters, input_dim), initializer='glorot_uniform', name='clusters')

              if self.initial_weights is not None:

                  self.set_weights(self.initial_weights)

                  del self.initial_weights

              self.built = True


          def call(self, inputs, **kwargs):

              """ student t-distribution, as same as used in t-SNE algorithm.        

                       q_ij = 1/(1+dist(x_i, μ_j)^2), then normalize it.

                       q_ij can be interpreted as the probability of assigning sample i to cluster j.

                       (i.e., a soft assignment)

              Arguments:

                  inputs: the variable containing data, shape=(n_samples, n_features)

              Return:

                  q: student's t-distribution, or soft labels for each sample. shape=(n_samples, n_clusters)

              """

              q = 1.0 / (1.0 + (K.sum(K.square(K.expand_dims(inputs, axis=1) - self.clusters), axis=2) / self.alpha))

              q **= (self.alpha + 1.0) / 2.0

              q = K.transpose(K.transpose(q) / K.sum(q, axis=1)) # Make sure each sample's 10 values add up to 1.

              return q


          def compute_output_shape(self, input_shape):

              assert input_shape and len(input_shape) == 2

              return input_shape[0], self.n_clusters


          def get_config(self):

              config = {'n_clusters': self.n_clusters}

              base_config = super(ClusteringLayer, self).get_config()

              return dict(list(base_config.items()) + list(config.items()))

      接下來,我們在預先訓練的編碼器之后堆疊聚類層以形成聚類模型。 對于聚類層,我們初始化它的權(quán)重,聚類中心使用k-means對所有圖像的特征向量進行訓練。

      clustering_layer = ClusteringLayer(n_clusters, name='clustering')(encoder.output)

      model = Model(inputs=encoder.input, outputs=clustering_layer)

      # Initialize cluster centers using k-means.

      kmeans = KMeans(n_clusters=n_clusters, n_init=20)

      y_pred = kmeans.fit_predict(encoder.predict(x))

      model.get_layer(name='clustering').set_weights([kmeans.cluster_centers_])

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      聚類模型結(jié)構(gòu)

      訓練聚類模型

      輔助目標分布和KL散度損失

      下一步是同時改進聚類分配和特征表示。 為此,我們將定義一個基于質(zhì)心的目標概率分布,并根據(jù)模型聚類結(jié)果將KL偏差最小化。

      我們希望目標分配具有以下屬性:

      • 加強預測,即提高群集純度。

      • 更加重視高可信度地分配的數(shù)據(jù)點。

      • 防止大集群扭曲隱藏的特征空間。

      通過首先將q(編碼特征向量)提升到第二冪然后按每個簇的頻率進行歸一化來計算目標分布。

      def target_distribution(q):

          weight = q ** 2 / q.sum(0)

          return (weight.T / weight.sum(1)).T

      有必要通過在輔助目標分布的幫助下從高置信度分配中學習來迭代地細化群集。 在特定次數(shù)的迭代之后,更新目標分布,并且訓練聚類模型以最小化目標分布與聚類輸出之間的KL散度損失。 培訓策略可以被看作是一種自我訓練的形式。 就像在自我訓練中一樣,我們采用初始分類器和未標記的數(shù)據(jù)集,然后用分類器標記數(shù)據(jù)集以訓練其高置信度的預測。

      損失函數(shù),KL散度或Kullback-Leibler散度是衡量兩種不同分布之間行為差異的指標。 我們希望將其最小化,以便目標分布盡可能接近聚類輸出分布。

      在以下代碼片段中,目標分布每180次訓練迭代更新一次。

      model.compile(optimizer=SGD(0.01, 0.9), loss='kld')


      maxiter = 8000

      update_interval = 140

      for ite in range(int(maxiter)):

          if ite % update_interval == 0:

              q = model.predict(x, verbose=0)

              p = target_distribution(q)  # update the auxiliary target distribution p

              # evaluate the clustering performance

              y_pred = q.argmax(1)

              if y is not None:

                  acc = np.round(metrics.acc(y, y_pred), 5)


          idx = index_array[index * batch_size: min((index+1) * batch_size, x.shape[0])]

          model.train_on_batch(x=x[idx], y=p[idx])

          index = index + 1 if (index + 1) * batch_size <= x.shape[0] else 0

      每次更新后,您將看到聚類準確度穩(wěn)步提高。

      評估指標

      該度量標準表明它已達到96.2%的聚類精度,考慮到輸入是未標記的圖像,這非常好。 讓我們仔細研究它的精確度。

      該度量需要從無監(jiān)督算法和地面實況分配中獲取一個集群分配,然后找到它們之間的最佳匹配。

      最好的映射可以通過在scikit學習庫中實現(xiàn)的匈牙利算法有效地計算為linear_assignment。

      from sklearn.utils.linear_assignment_ import linear_assignment


      y_true = y.astype(np.int64)

      D = max(y_pred.max(), y_true.max()) + 1

      w = np.zeros((D, D), dtype=np.int64)

      # Confusion matrix.

      for i in range(y_pred.size):

          w[y_pred[i], y_true[i]] += 1

      ind = linear_assignment(-w)

      acc = sum([w[i, j] for i, j in ind]) * 1.0 / y_pred.size

      查看混淆矩陣更直接。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      混亂矩陣

      在這里,您可以手動快速匹配聚類分配,例如,聚類1與真實標簽7或手寫數(shù)字“7”和虎鉗簽證相匹配。

      下面顯示的混淆矩陣繪制代碼片段。

      import seaborn as sns

      import sklearn.metrics

      import matplotlib.pyplot as plt

      sns.set(font_scale=3)

      confusion_matrix = sklearn.metrics.confusion_matrix(y, y_pred)


      plt.figure(figsize=(16, 14))

      sns.heatmap(confusion_matrix, annot=True, fmt="d", annot_kws={"size": 20});

      plt.title("Confusion matrix", fontsize=30)

      plt.ylabel('True label', fontsize=25)

      plt.xlabel('Clustering label', fontsize=25)

      plt.show()

      應用卷積自動編碼器(實驗)

      由于我們正在處理圖像數(shù)據(jù)集,所以值得一試卷積自動編碼器,而不是僅使用完全連接的圖層構(gòu)建。

      值得一提的是,為了重建圖像,您可以選擇去卷積層(Keras中的Conv2DTranspose)或上采樣(UpSampling2D)層以減少偽像問題。卷積自動編碼器的實驗結(jié)果可以在我的GitHub上找到。

      結(jié)論和進一步閱讀

      自動編碼器在降維和參數(shù)初始化方面發(fā)揮了重要作用,然后針對目標分布對定制的聚類層進行訓練以進一步提高精度。

      進一步閱讀

      在 Keras 建立自動編碼器 - 官方Keras博客

      用于聚類分析的無監(jiān)督深嵌入 - 激勵我寫這篇文章。

      完整的源代碼在我的 GitHub 上,一直讀到筆記本的最后,因為您會發(fā)現(xiàn)另一種可以同時減少聚類和自動編碼器丟失的另一種方法,這種方法被證明對于提高卷積聚類模型的聚類準確性非常有用。

      雷鋒網(wǎng)字幕組編譯。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

      如何使用 Keras 實現(xiàn)無監(jiān)督聚類

      分享:
      相關(guān)文章

      知情人士

      AI研習社(yanxishe.com)譯站頻道,傳播前沿人工智能知識,讓語言不再成為學習知識的門檻。(原雷鋒字幕組)
      當月熱門文章
      最新文章
      請?zhí)顚懮暾埲速Y料
      姓名
      電話
      郵箱
      微信號
      作品鏈接
      個人簡介
      為了您的賬戶安全,請驗證郵箱
      您的郵箱還未驗證,完成可獲20積分喲!
      請驗證您的郵箱
      立即驗證
      完善賬號信息
      您的賬號已經(jīng)綁定,現(xiàn)在您可以設置密碼以方便用郵箱登錄
      立即設置 以后再說
      主站蜘蛛池模板: 国产一级精品毛片基地| 亚洲AV成人无码网天堂| 我和亲妺妺乱的性视频| 狂野欧美激情性xxxx| 久久99色综合| 熟妇图区| 亚洲综合成人精品| 九九免费成年人在线观看| 亚洲成人无码中文字幕| 亚洲欧美国内综合| 国产乱人对白| 成人乱码一区二区三区av| 免费看美女毛片| 双腿张开被9个黑人调教影片| 好吊妞这里有精品| 色色色资源| 德昌县| 日本午夜网站| 91在现观看| 国产玖玖| 日屄影视| 精品视频无码一区二区三区| 久久www视频| 2021精品国产品免费观看| 欧洲熟妇色xxxx欧美老妇性| 欧美日韩人妻精品一区二区三区 | 乱亲女h秽乱长久久久| 精品人妻潮喷久久久又裸又黄| 无码AⅤ最新av无码专区| 伊人丁香欧美成A片| 亚洲va欧美ⅴa国产va影院| 久久夜色精品国产欧美乱| 性色av 一区二区三区| 五月婷之久久综合丝袜美腿| 国内精品一区二区三区最新| 伊人久久大香线蕉AV五月天 | 国产偷国产偷亚洲高清app| 99久久国产综合精品女同| 久操资源站| 亚洲中文字幕人妻系列| 亚洲天堂高清|