什麼是無監督學習?

時間 2021-05-07 20:04:16

1樓:王佳馳

我想先提出乙個問題:「監督學習「,」無監督學習「,這兩個名詞的翻譯恰當嗎?

在我的理解中,supervised可以有指導的含義,而中文的監督,更傾向與管理和監視。比如,古代的督軍、監軍行使的職責。在我學習supervised和unsupervised兩種learning之後,我感覺它們的最主要區別在於,在學習過程中,演算法有沒有受到人為的干預和指引。

舉個生活中的例子:

小孩子學說話的時候,就有明顯的supervised和unsupervised learning。

在最初一段時間,孩子不會說話,只會咿咿呀呀,甚至只懂聽、不懂說的時候,她做的就是unsupervised learning。她把聽到的話語,通過「資料分析」,跟場景中的事物一一對應,並歸類為不同事物對應不同詞語、句子。這個過程有點像unsupervised learning。

(孩子學到的大部分語言,並不是家長手把手教的,而是他們用歸納法「自學的」)

有一天,孩子開始說話了。她叫「媽媽」,「爸爸」。但發音有點不準確,還可能把媽媽和爸爸都說成是「媽」。

這時候,家人們就開始糾正她——這個是「媽媽」,那個是「爸爸」。然後,孩子一次次重複嘗試改正,最終學會了正確的發音。這個過程,應該就是supervised learning吧?

2樓:故事與魚

無監督學習裡典型例子是聚類。聚類的目的在於把相似的東西聚在一起,而我們並不關心這一類是什麼。因此,乙個聚類演算法通常只需要知道如何計算相似度就可以開始工作了

3樓:真誠的人

現實生活中常常會有這樣的問題:缺乏足夠的先驗知識,因此難以人工標註類別或進行人工類別標註的成本太高。很自然地,我們希望計算機能代我們完成這些工作,或至少提供一些幫助。

根據類別未知(沒有被標記)的訓練樣本解決模式識別中的各種問題,稱之為無監督學習

4樓:

昨天按照文獻上面的記錄,開始分類一組資料,總是不能成功,然後想到如果用CLUSTER或許可以,今天才琢磨過來,這個就是unsupervised和sepervised learning的區別了;文獻中已經給了標準的資料,而我是沒有標準資料的,只好做CLUSTER了

5樓:大數小編

通俗來說,從學習方式來說,監督學習演算法是在「老師」監督下進行學習,有規則才有預判;而無監督學習演算法則是邊學習邊建立規則,隨時調整,「更智慧型」。

樓上回答都很多。監督學習是有資料、要建模,輸出標籤。而無監督學習是有資料,不需要實現建模,輸出歸類。

6樓:劉瑞軒

無監督學習不需要對知識的分類進行指導,實現不斷地自我認知,實現自我提高,最後進行自我總結得出結論,在機器學習中,無監督學習可以被簡單理解為不為訓練集提供對應的類別標識其與有監督學習的對比如下:

有監督學習(Supervised Learning)下的訓練集:

(x(1),y(1)),(x(2),y2)(x(1),y(1)),(x(2),y2)

無監督學習(Unsupervised Learning)下的訓練集:

(x(1)),(x(2)),(x(3))(x(1)),(x(2)),(x(3))

無監督式學習(Unsupervised Learning )是人工智慧網路的一種演算法(algorithm),其目的是去對原始資料進行分類,以便了解資料內部結構。有別於監督式學習網路,無監督式學習網路在學習時並不知道其分類結果是否正確,亦即沒有受到監督式增強(告訴它何種學習是正確的)。其特點是僅對此種網路提供輸入範例,而它會自動從這些範例中找出其潛在類別規則。

當學習完畢並經測試後,也可以將之應用到新的案例上。

無監督學習裡典型的例子就是聚類了。聚類的目的在於把相似的東西聚在一起,而我們並不關心這一類是什麼。因此,乙個聚類演算法通常只需要知道如何計算相似度就可以開始工作了。

在有監督學習中,我們把對樣本進行分類的過程稱之為分類(Classification),而在無監督學習中,我們將物體被劃分到不同集合的過程稱之為聚類(Clustering)。聚這個動詞十分精確,他傳神地描繪了各個物體自主地想屬於自己的集合靠攏的過程。在聚類中,我們把物體所在的集合稱之為簇(cluster)。

那麼,K-Means 這個演算法是如何完成聚類過程的呢?其實演算法名稱中對此已有體現:

K: 描述了的數量,也就是應當聚合成的幾何數。

Means均值求解會是該演算法的核心。

下面具體看到該演算法的步驟:

(1)根據設定的聚類數 ,隨機地選擇個聚類中心(Cluster Centroid),這就好比古代亂世,天下諸侯並起而逐鹿

(2)評估各個樣本到聚類中心的距離,如果樣本距離第個聚類中心更近,則認為其屬於第簇,這可以看做四方義士紛紛投奔諸侯,形成不同的勢力。

(3)計算每個簇中樣本的平均(Mean)位置,將聚類中心移動至該位置,該過程可以被認為是諸侯調整戰略根據地以達到最強的控制力和凝聚力。

重複以上步驟直至各個聚類中心的位置不再發生改變。

綜上,K-Means 的演算法步驟能夠簡單概括為:

分配:樣本分配到簇。

移動:移動聚類中心到簇中樣本的平均位置。

注意,某些聚類中心可能沒有被分配到樣本,這樣的聚類中心就會被淘汰(意味著最終的類數可能會減少)。假設簇的個數被定為 ,樣本數為 。

隨機設定個聚類中心:

重複如下過程直至聚類中心的位置不再改變:

分配過程

for to :

距離的計算式如下:

移動過程

for to :

假設聚類中心下分配了個樣本:

亦即:那麼將會移動到這四個樣本的中心位置:

和其他機器學習演算法一樣,K-Means 也要評估並且最小化聚類代價,在引入 K-Means 的代價函式之前,先引入如下定義:

引入代價函式:

J也被稱為失真代價函式(Distortion Cost Function)

實際上,K-Means 的兩步已經完成了最小化代價函式的過程:

樣本分配時

我們固定住了 ,而關於最小化了 。

中心移動時

我們再關於最小化了 。

由於 K-Means 每次迭代過程都在最小化 ,所以下面的代價函式變化曲線不會出現:

如何初始化聚類中心

通常,我們會隨機選取個樣本作為個聚類中心()。但是,如下圖所示,不同的初始化有可能引起不同的聚類結果,能達到全域性最優(global optimal)固然是好的,但是,往往得到的是區域性最優(local optimal)。現在,想要提前避免不好的聚類結果仍是困難的,我們只能嘗試不同的初始化:

隨機初始化,執行 K-Means,得到每個所屬的簇 ,以及各聚類的中心位置 :

計算失真函式

選擇這 100 次中, 最小的作為最終的聚類結果。

顯然,該方法計算量較大,所以只適用於值較小的場景。一般來說,K-Means 得到的聚類結果是服務於我們的後續目的(如通過聚類進行市場分析),所以不能脫離實際而單純以數學方法來選擇值。在下面這個例子中,假定我們的衣服想要是分為 S,M,L 三個尺碼,就設定 ,如果我們想要 XS、S、M、L、XL 5 個衣服的尺碼,就設定 :

二分 K-Means 演算法

該演算法補充自 《機器學習實戰》 一書

常規的 K-Means 演算法的誤差通常只能收斂到區域性最小,在此,引入一種稱為二分 K-Means(bisecting kmeans)的演算法,相較於常規的 K-Means,二分 K-Means 不急於一來就隨機個聚類中心,而是首先把所有點歸為乙個簇,然後將該簇一分為二。計算各個所得簇的失真函式(即誤差),選擇誤差最大的簇再進行劃分(即最大程度地減少誤差),重複該過程直至達到期望的簇數目。

二分 KMeans 演算法流程大致如下:

初始時,所有樣本被看做在同乙個簇:

while ( 表示當前的簇數):

for to (對於每乙個簇):

計算誤差

在該簇上進行 K-Means 聚類,其中

計算將該簇一分為二後的總誤差,該誤差在之後將會被用於比較

選擇使得總誤差最小的簇進行劃分。

雖然二分 K-Means 能帶來全域性最優解,但是我們也可以看到,該演算法是乙個貪心演算法,因此計算量不小。

# coding: utf-8

# kmeans/kmeans.py

import numpy as np

def loadDataSet(filename):

"""讀取資料集

Argsfilename: 檔名

ReturnsdataMat: 資料樣本矩陣

"""dataMatfr = open(filename)

for line in fr.readlinescurLine = line.strip().split('\t'通過map函式批量轉換

return dataMat

def distEclud(vecA, vecB):

"""計算兩向量的歐氏距離

ArgsvecA: 向量A

vecB: 向量B

Returns歐式距離

"""return np.sqrt(np.sum(np.power(vecA - vecB, 2)))

def randCent(dataSet, k):

"""隨機生成k個聚類中心

ArgsdataSet: 資料集

k: 簇數目

Returnscentroids: 聚類中心矩陣

"""_, n = dataSet.shape

centroids = np.mat(np.zeros((k, n)))

for j in range(n隨機聚類中心落在資料集的邊界之內

minJ = np.min(dataSet[:, jmaxJ = np.

max(dataSet[:, jrangeJ = float(maxJ - minJcentroids[:, j] = minJ + rangeJ * np.

random.rand(k, 1)

return centroids

def kMeans(dataSet, k, maxIter = 5):

"""K-Means

ArgsdataSet: 資料集

k: 聚類數

Returnscentroids: 聚類中心

clusterAssment: 點分配結果

"""# 隨機初始化聚類中心

centroids = randCent(dataSet, k)

m, n = np.shape(dataSet)

# 點分配結果: 第一列指明樣本所在的簇,第二列指明該樣本到聚類中心的距離

clusterAssment = np.mat(np.zeros((m, 2標識聚類中心是否仍在改變

clusterChanged = True

# 直至聚類中心不再變化

iterCount = 0

while clusterChanged and iterCount < maxIteriterCount += 1

clusterChanged = False分配樣本到簇

for i in range(m計算第i個樣本到各個聚類中心的距離minIndex = 0minDist = np.inffor j in range(kdist = distEclud(dataSet[i, :], centroids[jif(dist < minDistminIndex = jminDist = dist判斷cluster是否改變if(clusterAssment[i, 0] !

= minIndexclusterChanged = TrueclusterAssment[i, :] = minIndex, minDist**2重新整理聚類中心: 移動聚類中心到所在簇的均值位置

for cent in range(k通過陣列過濾獲得簇中的點ptsInCluster = dataSet[np.nonzeroclusterAssment[:, 0].

A == cent)[0if ptsInCluster.shape[0] > 0計算均值並移動centroids[cent, :] = np.

mean(ptsInCluster, axis=0)

return centroids, clusterAssment

仍然是在 kmeans.p 中,我們又新增了二分 K-Means 演算法:

# coding: utf-8

# kmeans/kmeans.py

# ...

def biKmeans(dataSet, k):

"""ArgsdataSet: 資料集

k: 聚類數

Returnscentroids: 聚類中心

clusterAssment: 點分配結果

"""# 隨機初始化聚類中心

centroids = randCent(dataSet, k)

m, n = np.shape(dataSet)

# 點分配結果: 第一列指明樣本所在的簇,第二列指明該樣本到聚類中心的距離

clusterAssment = np.mat(np.zeros((m, 2標識聚類中心是否仍在改變

clusterChanged = True

# 直至聚類中心不再變化

while clusterChangedclusterChanged = False分配樣本到簇

for i in range(m計算第i個樣本到各個聚類中心的距離minIndex = 0minDist = np.inffor j in range(kdist = distEclud(dataSet[i, :], centroids[jif(dist < minDistminIndex = jminDist = dist判斷cluster是否改變if(clusterAssment[i, 0] !

= minIndexclusterChanged = TrueclusterAssment[i, :] = minIndex, minDist**2重新整理聚類中心: 移動聚類中心到所在簇的均值位置

for cent in range(k通過陣列過濾獲得簇中的點ptsInCluster = dataSet[np.nonzeroclusterAssment[:, 0].

A == cent)[0計算均值並移動centroids[cent, :] = np.mean(ptsInCluster, axis=0)

return centroids, clusterAssment

# ...

# coding: utf-8

# kmeans/test_bi_kmeans.py

import kmeans

import numpy as np

import matplotlib.pyplot as plt

if __name__ == "__main__":

dataMat = np.mat(kmeans.loadDataSet('data/testSet2.txt'))

centroids, clusterAssment = kmeans.biKmeans(dataMat, 3)

clusterCount = centroids.shape[0]

m = dataMat.shape[0]

# 繪製散點圖

patterns = ['o', 'D', '^']

colors = ['b', 'g', 'y']

fig = plt.figure()

title = 'bi-kmeans with k=3'

ax = fig.add_subplot(111, title=title)

for k in range(clusterCount繪製聚類中心

ax.scatter(centroids[k,0], centroids[k,1], color='r', marker='+', linewidth=20for i in range(m繪製屬於該聚類中心的樣本ptsInCluster = dataMat[np.nonzero(clusterAssment[:

, 0].A==k)[0ax.scatter(ptsInCluster[:

, 0].flatten().A[0], ptsInCluster[:

, 1].flatten().A[0], marker=patterns[k], color=colors[k])

plt.show()

執行結果如下

如何看待無監督學習在vision transformer上的應用前景?

安靜的太陽 我對transformer不是很了解,但感覺大量資料的自監督預訓練是對的路子。產生這個想法的原因有二 但並不嚴謹 1 人類實際上從出生開始就在持續接收大量資料,幾乎每分每秒我們都在看 聽 讀。直觀上先用大量資料預訓練得到乙個general model,再在具體下游任務上fine tune...

自監督學習(Self supervised Learning)有什麼比較新的思路?

林錦堅 分享乙個綜述。這項工作中,作者提出了乙個關於在圖結構資料上的自我監督學習主題的調查。首先詳盡地介紹了相關的初步定義,回顧了近年來的研究成果,並對其進行了系統的分類。更重要的是,作者深入研究課題,揭示關鍵的挑戰,並分析未來可能的方向。圖形SSL具有廣泛的應用潛力,將成為乙個活躍和有前途的研究領...

無監督學習在計算機視覺領域有什麼應用?

無監督學習對於NLP和CV都是至關重要的,其實這個結論可以推廣到一般的問題上。無監督學習的核心思想就是通過構造內蘊的一致性 不變性來挖掘問題自身的結構,這個結構其實無非包括兩個方面,乙個是系統的不變性,乙個是系統之間的相互關係,大致上,前者定義了系統的區域性特徵,後者定義了全域性特徵。畢竟我們這個世...