1. 程式人生 > 其它 >智慧主題檢測與無監督機器學習:識別顏色教程

智慧主題檢測與無監督機器學習:識別顏色教程

介紹

人工智慧學習通常由兩種主要方法組成:監督學習和無監督的學習。監督學習包括使用現有的訓練集,這種訓練集由預先標記的分類資料列組成。機器學習演算法會發現資料的特徵和這一列的標籤(或輸出)之間的關聯。通過這種方式,機器學習模型可以預測它從來沒有公開過的新的資料列,並且根據它的訓練資料返回一個精確的分類。在你已經有了預先分類的資料的情況下,監督學習對於大資料集是非常有用的。 在另一種是無監督的學習。使用這種學習方式,資料不需要在訓練集中進行預先標記或預分類,相反,機器學習演算法在資料的特徵中發現相似的特徵和關聯,並將它們分組在一起。例如,根據某些特性,兩個資料可能會出現類似的情況,因此會被分組到同一個框中(更正式地稱為“叢集”)。通過將相似的資料聚集在一起,就可以預測出新列之前從未見過的資料,並獲得一個準確的分類。不受監督的學習可以很好地適用於某些公共關係形式的資料集。這也得益於不需要事先貼上標籤的訓練集,而這往往是監督學習中較為困難的部分(通常需要人工標記訓練資料)。

與監督學習的方法相似,無監督學習和聚類可以利用訓練資料來形成分組。當監督學習使用預先標記的訓練集時,無監督的學習只需要資料。很自然地,預先標記的訓練資料用於監督學習不僅費時,而且容易出現人為錯誤。由於這些原因,不需要(人工/自動化)預先標記的資料集,無監督學習就有潛力在機器學習和人工智慧結果方面取得進展。 在本教程中,我們將演示使用無監督學習和叢集來智慧地識別圖上繪製的顏色點,如紅色、綠色或藍色的整體顏色。例如,一個紫色的點可能被認為是紅色或藍色的。我們的無監督學習演算法將會學習到像這樣的點,作為一個特定的顏色類別。我們還將看到執行K-Means演算法來聚類訓練資料,識別聚類中心,標記現有資料,並預測新資料的類別。 最後,你將看到如何將非監督分類應用於其他型別的資料,包括在特定類別下對股票和債券ETF基金進行分類。 我們將使用R作為程式語言,當然,你也可以使用JavaScript

或你所選擇的任何語言作為示例。

在完成本教程之後,你將瞭解如何將無人監督的機器學習應用到各種主題,包括其他數字資料、行業特定主題、自然語言處理,甚至文字中。

一堆漂亮的顏色

讓我們通過生成一組不同的顏色來開始本教程。 我們都知道,顏色由紅色、綠色和藍色組成。通過將這三種顏色組合在一起,我們就可以獲得多種顏色。純紅色是由RGB(255、0、0)的紅色、綠色、藍色值確定的,同樣地,所有三個純色值都列在下面。

rgb(255, 0, 0) // Red
rgb(0, 255, 0) // Green
rgb(0, 0, 255) // Blue

不同程度的紅色、綠色和藍色可以通過調整各自的值來表示。例如,rgb(255、0、255)由大量的紅色和大量的藍色組成,這就變成了紫色。

我們到底在分類什麼?

到目前為止,我們已經討論瞭如何通過組合紅色、綠色和藍色的值來生成顏色。現在我們可以建立顏色了,機器學習演算法是如何做到這一點的呢? 回想一下,紫色實際上可以被認為是紅色或藍色。事實上,因為紫色示例的紅色和藍色值都包含最大值rgb(255、0、255),將此顏色標記為紅色或藍色將是正確的。但是,如果我們稍微降低藍色的值,會怎麼樣呢? 這種顏色在人眼看來仍然是紫色的。然而,現在它可能更準確地歸類為紅色。 下面是一些關於顏色如何分組的例子。

rgb(200, 0, 150) // Purple Plum => Red
rgb(50, 199, 135) // Sea Green => Green
rgb(100, 180, 255) // Sky Blue => Blue

有了以上分類的概念,我們就可以利用機器學習來判斷它是否能單獨識別這些顏色組。雖然我們知道哪些顏色應該是紅色的(在rgb()組合中有較高的紅色值),所以我們來看看計算機是否可以識別這些顏色組,並精確地將rgb值放置到它們的自然分組中。

考慮顏色

通過在圖上檢視顏色,可以更容易地(更有趣!)來考慮顏色是如何聚集在一起的。這樣,我們可以在圖上畫出顏色,用各自的紅色、綠色和藍色的值將它們組合在一起,並瞭解這些顏色是如何自然地形成一層的。

生成隨機顏色

首先,讓我們看看一些可以隨機生成顏色,並在圖表上繪製它們的程式碼。我們需要生成紅色、綠色和藍色的隨機值。我們還需要將rgb()值轉換為十六進位制格式,以便呈現圖表上的顏色。幸運的是,R語言很容易將rgb轉換為十六進位制,只需呼叫以下程式碼行:

rgb(255, 100, 175, maxColorValue = 255)

上述程式碼的結果是 #FF64AF,這是一個與html相容的顏色,我們可以在圖表上繪製。

將RGB轉換為數值

除了生成顏色外,我們還需要一種在2D圖表上繪製3D顏色的方法。也就是說,我們的顏色由紅色,綠色和藍色的值組成。然而,在圖表上繪製需要x y值。因此,我們需要一種將3D紅、綠、藍的數值轉換成數值的方法。 我們可以將顏色轉換為數值,只需將它們各自的紅、綠、藍的值乘以最大值,並相應的進行索引。 我們可以使用以下公式:

(Red * 256 * 256) +
(Green * 256) +
(Blue)

使用上面的公式,我們得到以下這些示例顏色的值:

rgb(200, 0, 150)
// 13107350
rgb(50, 199, 135)
// 3327879
rgb(100, 180, 255)
// 6599935

現在我們有了生成隨機顏色的方法並將它們轉換為數值表示,我們可以在圖表上畫出它們。然後,我們可以用無監督學習來對它們進行分類,並觀察計算機如何決定在顏色之間劃定界限,有效地將每一種顏色組合成一組紅色、綠色或藍色。注意紅色的顏色如何形成一個更大的數值。如果使用y軸來繪製值,那麼紅色就會被繪製到圖表的頂部。同樣地,藍色值的值範圍更小,導致它們在圖表的底部出現。綠色的顏色在中間。

在圖表上繪製顏色

我們可以使用如下所示的R程式碼來生成一組隨機顏色並將它們轉換為數值表示。

rgb2Num <- function(data) {
  # Maps RGB colors to a single value.
  result <- sapply(1:nrow(data), function(row) {
    color <- data[row,]
    (color$red * 256 * 256) + (color$green * 256) + color$blue
  })
  
  result
}
generateColors <- function(n) {
  # Generate a set of random colors.
  colors <- as.data.frame(t(sapply(1:n, function(i) {
    parts <- sample(0:255, 3)
    c(red = parts[1], green = parts[2], blue = parts[3], hex = rgb(parts[1], parts[2], parts[3], maxColorValue = 255))
  })), stringsAsFactors = F)
  # Convert to numeric values.
  colors$red <- as.numeric(colors$red)
  colors$green <- as.numeric(colors$green)
  colors$blue <- as.numeric(colors$blue)
  
  # Map each color to an x/y-coordinate for easy plotting.
  colors$x <- 1:nrow(colors)
  colors$y <- rgb2Num(colors)
  colors
}

上面的程式碼只生成每個紅色、綠色和藍色值中0-255的隨機數字。然後,它將為每種顏色生成html相容的顏色的十六進位制值,並使用前面描述的簡單公式計算y軸值。對於x軸,我們只需要使用顏色的索引(1-1000,對於1000種生成的顏色)。 下面是訓練資料的一個例子,它是通過執行上面的程式碼生成的。

> generateColors(10)
   red green blue     hex  x        y
1  186   160  122 #BAA07A  1 12230778
2   40     2  114 #280272  2  2622066
3  126    99  118 #7E6376  3  8282998
4  182    14   90 #B60E5A  4 11931226
5  205   213   60 #CDD53C  5 13489468
6   90   218  216 #5ADAD8  6  5954264
7   75    37  178 #4B25B2  7  4924850
8   26     8  253 #1A08FD  8  1706237
9    8    86  232 #0856E8  9   546536
10 158    73  187 #9E49BB 10 10373563

你可以看到,我們現在可以通過使用紅色、綠色和藍色值生成的x、y值來輕鬆地將這些資料繪製到圖表上。

美麗的顏色

下面是根據它們各自的值繪製圖表,隨機生成的1000種顏色。

圖表中顯示了1000個隨機的顏色,由紅色、綠色和藍色的值組成。

正如你在上面的圖片中所看到的,藍色的顏色主要是在底部,然後是綠色的顏色。注意綠色的顏色如何融入到藍色和紅色中,它們在每個邊界移動的時候都使用不同程度的橙色和藍綠色。在綠色的和紅色的開始之間,很難畫出一條清晰的分界線。同樣地,藍色和綠色的開始和結束也很難確定。這種型別的分類是機器學習和人工智慧演算法的真正優勢。 由於機器學習使用資料中的數值特性來形成關聯和分類,因此它可以確定一組邊界,以便將顏色分類到它們各自的分組或聚類中。

更少的顏色與更多的機器學習

用我們的分組公式繪製1000種顏色肯定會產生美麗的影象。但是,讓我們考慮一組更小的只有100種顏色的資料集。這將使在紅色、綠色和藍色叢集中檢視資料及其最終分類變得更加容易。 下面是我們的訓練資料,由100個隨機生成的顏色組成,根據它們各自的值繪製圖表。

圖表中顯示了100個隨機的顏色,由紅色、綠色和藍色的值組成。

上面的100種顏色和1000種顏色沒有什麼不同。請注意,藍色的點在圖的底部是如何下降的,中間是綠色和黃色,紅色是指向頂部的點。 讓我們看看如何根據顏色對每個點進行分類和標註來應用無監督的機器學習演算法。

使顏色聚整合組

將資料聚集到組中最常用的演算法是K-Means演算法。這種聚類演算法將資料分組到k個叢集中,基於每個資料點的特性與彼此之間的相似程度。我們可以將K-Means聚類演算法應用到顏色點上,根據它們各自的紅、綠、藍顏色來組合它們。K-Means演算法首先在資料中設定隨機的中心點。然後將最接近每個中心的所有點集中到一個單獨的叢集中。然後將每個叢集的中心轉移到相關點的中心。最後,我們將所有的點重新分配到最接近的中心,直到每個叢集的中心不再發生變化(或者變化小於某個閾值),然後重複這個過程。 這時,無人監督的訓練就完成了。 它可以幫助檢視K-Means演算法的視覺化,從而更好地理解這些步驟是如何工作的。

K-Means聚類

下面顯示了K-Means無監督學習演算法步驟的完整清單。 1.確定叢集的數量(即K值)。 對於選擇叢集的數量,一個經驗法則是將資料點的數量除以一半。下面給出了一個示例。 2.隨機初始化質心(即每個叢集的中心)。 3.將資料中的每個點分配給叢集,並將其與最接近的中心放在一起。 4. 將每個叢集的質心轉移到分配給它的所有點的平均值(中心)。 5重複步驟3-5,直到質心停止移動,或者點停止交換叢集,或者到達一個給定的閾值。 下面顯示了用於確定叢集的質心的示例程式碼。

K = ~~(Math.sqrt(points.length * 0.5));

計算質心

讓我們把K-Means演算法應用到顏色資料點上,看看叢集中心的位置在哪裡。通常情況下,你會嘗試猜測適當數量的叢集來使用,比如使用上面提到的演算法。然而,由於我們知道我們要為資料點尋找紅色、綠色或藍色的分類,為了這3個叢集組,我們可以將K值定為3。 我們可以在顏色資料點的集合上執行K-means演算法,程式碼如下所示。

# Run kmeans clustering on the data.
fit <- kmeans(train[,1:3], 3, nstart = 20)
train$group <- fit$cluster

在上面的程式碼中,請注意,我們只選擇資料中的前3列。這對應於紅色列、綠色列和藍色列,因為這是我們想要進行的3個特性。我們的資料集中的其他列對應在繪製圖和繪製顏色的座標上。 第二行程式碼簡單地設定了叢集,在執行演算法之後,這些叢集的每個資料點都被分配到各自的位置。 完成聚類後,我們可以在質心上檢視詳細的程序的結果。

K-means clustering with 3 clusters of sizes 24, 33, 43
Cluster means:
        red     green      blue
1  98.16667  64.66667 189.20833
2 164.18182  65.03030  64.72727
3 140.67442 196.58140 132.20930
Clustering vector:
  [1] 3 3 3 3 2 2 3 3 3 2 3 2 2 1 2 1 3 3 2 3 2 3 3 3 2 1 2 1 1 3 3 2 2 3 3 3 1 1 2 3 2 1 2 3 3
 [46] 3 2 2 2 1 2 1 2 3 2 3 1 3 3 3 1 3 1 2 3 1 3 3 3 1 2 1 1 1 2 1 3 2 2 1 3 1 3 2 2 2 3 3 3 1
 [91] 2 3 2 3 2 2 3 1 3 1
Within cluster sum of squares by cluster:
[1] 182410.6 201096.4 443809.0
 (between_SS / total_SS =  46.1 %)

注意,我們的演算法已經完成了3個叢集,大小分別為24、33和43(總計為100個數據點)。它們表示為分配給每個叢集的顏色點的數量。因此,24個數據點被分配到第一個叢集,33個數據點到第二個叢集,最後一個叢集是43個數據點。 我們還可以看到每個叢集中每個特性的平均值。請記住,每個資料點都有3個特徵值(紅色、綠色和藍色之間的值為0-255),我們已經對3個叢集進行了訓練。因此,每個質心也將有一個紅色、綠色和藍色的值,對應於分配給它們的叢集的相關資料點的平均值。當我們在圖上畫出質心時,這個看起來會更直觀。 在這一點上,我們在資料上有3個受過訓練的叢集。我們所有的資料點都被分配到一個叢集中。然而,叢集實際上並沒有一個“名稱”。 我們不能叫第一個叢集為“我們的紅色組”,因為我們還不知道已經分配給它的資料型別是什麼樣的(但實際上,我們可以窺視質心的平均值,猜測每個叢集的名稱;例如,第一個叢集平均值rgb(98, 64, 189)這是紫色的顏色或者也可以被認為是藍色的;同樣的第二個叢集是 rgb(164, 65, 64)這是紅色的;最後一個叢集是rgb(140, 196, 132)這是綠色的)。 讓我們在圖上畫出每個群集的質心,就在顏色點上。這將讓我們瞭解每個叢集中心的位置,併為我們提供了一種正確方式,從而對叢集進行命名。

叢集中心標識在它們各自的位置顯示在圖中顏色。

在上圖中,我們在顏色資料點上繪製了3個經過訓練的叢集的中心。 正如我們從叢集輸出結果中所預測的那樣,叢集1實際上位於圖底部的藍色範圍內。叢集2在圖上是最高的,對應紅色值。叢集3位於中間,對應綠色值。此時,我們可以將叢集命名為以下內容:

Cluster 1 - 'Blue Group'
Cluster 2 - 'Red Group'
Cluster 3 - 'Green Group'

將顏色分類為一個叢集

讓我們看一下每個顏色資料點,看看它們被分配給哪個叢集比較合適。回想一下,在訓練之後,我們設定了每個資料點分配的叢集號。通過這種方式,我們的訓練集現在有了一個額外的列,包含了分配的叢集號。使用這個資料段,我們可以在圖上繪製每個資料點的叢集,如下所示。

在將非監督學習應用到資料集之後,顏色被標記為已分配的叢集。

上面的影象將每個資料點與指定的叢集一起標記。我們已經在圖上繪製了叢集中心,但現在我們也展示了每個點的實際賦值。 請注意,底部的大多數藍色點被分配給叢集1(“藍色組”)。在圖的底部也有幾個點被分配給叢集3(“綠色組”)。記住,我們要根據一個簡單的數學公式,把原始的紅,綠,和藍色的值轉換成數值。但是,叢集的運作方式不同,通過計算平均值到每個叢集的中心。 例如,檢視圖表底部的點,它們被標記為3(“綠色組”)。它們的顏色從綠色、藍色到青色,再到藍綠色,所有的顏色都包括綠色和藍色。在藍色或綠色的組中對這些點進行分類是有意義的。 同樣地,在圖的頂部有一些點沒有被分配到叢集2(“紅色組”),而是被分配到叢集1或3。例如,分配給叢集3的一些點是黃色的。它們被繪製在圖表的頂部,因為它們的數值來自於我們的簡單公式,但是它們被分組到“綠色”叢集中,因為它們的rgb值仍然在訓練的“綠色”組的範圍內。畢竟,黃色就在綠色的旁邊。 如果我們在指定的叢集中直接繪製每一種顏色,那麼在每個顏色的座標和指定的顏色的位置上的差異就會變得更加明顯。這將允許我們根據所分配的叢集來檢視每一種顏色,並繪製在一個單線上。

將顏色分組到它們的叢集中

讓我們看看哪個顏色點被分配到哪個更直觀的地方。根據我們對紅、綠、藍的簡單數值計算,我們可以根據所指定的叢集來繪製資料點,而不是根據y軸的簡單數值計算來繪製資料點。我們將x軸沿著一條直線來繪製每個點,並將其指定的叢集用於y軸。

這個圖表顯示了被分配的叢集分組的顏色,每個叢集都表示在y軸上。更明顯的展示了這些顏色是如何根據紅、綠、藍的顏色來聚類的。

上圖顯示了在訓練過程中,顏色是如何組合在一起的。當然,所有的藍色值都被分組到叢集1(“藍色組”)中。當我們使用簡單的y軸的數值計算時,這包括了紫色和粉紅色的顏色(之前可能已經在圖的頂部畫過了。[在紅色區域中])。 同樣地,紅色和黃色是在叢集2(“紅色組”)中繪製的。包括棕色,甚至一些黃綠色。最後,綠色,淡藍色,甚至一些更接近綠色的淺粉色,在第三組(綠色組)中被繪製出來。

在新資料上預測

既然我們已經用K-means聚類訓練了無監督機器學習演算法,我們就有了一種將顏色資料點標記為特定叢集的方法。我們將每個叢集分別標記為“藍色組”、“紅色組”和“綠色組”。 現在最大的測試是預測一個演算法以前從未見過的新的資料點的分配組。它能預測出顏色點的正確顏色組嗎? 讓我們生成三個新的隨機顏色點。然後,我們將要求模型對每個叢集進行分類。

test <- generateColors(3)

上面的程式碼生成3個新顏色,如下所示。

  red green blue     hex x        y
1 232    17  252 #E811FC 1 15208956
2  86   109  216 #566DD8 2  5664216
3  67   219  216 #43DBD8 3  4447192

使用我們已經訓練過的模型(例如:計算出的質心),我們可以確定每個點將被分配到哪個叢集。在R語言中,我們可以使用kcaa庫來預測已經經過訓練的k-means演算法,如下所示。

# Cast the k-means model to be of type kcaa, so we can use the predict method.
fit2 <- as.kcca(fit, data=train[,1:3])
# Predict the assigned color by mapping the color to a cluster.
group <- predict(model, newdata=data[,1:3])
# Assign the label of the cluster.
data$label <- sapply(1:nrow(data), function(row) {
centroids[centroids$group == data[row, 'group'], ]$label
})

在上面的程式碼中,我們只是簡單地將k-means模型轉換為kcaa型別,這樣我們就可以呼叫預測方法。在轉型之後,我們可以呼叫預測,通過我們已經訓練過的模型,以及資料點來預測。在預測了叢集號之後,我們可以將給定的叢集名稱分配給每個資料點,以便在預測的資料上進行更易於理解的叢集任務。 我們得到以下資料的結果。

  red green blue     hex x        y group label
1 241    52   11 #F1340B 1 15807499     2   red
2  80   187  139 #50BB8B 2  5290891     3 green
3  34    15  194 #220FC2 3  2232258     1  blue

注意,第一個點被分配到叢集2(“紅色組”)。這很容易理解,因為紅色值是最大的值。第二個點被分配給叢集3(“綠色組”),並且確定的是,它的綠色值是最大的值。最後一個點被分配給叢集1(“藍色組”),再一次因為它的藍色值是最大的值。

在測試集中,每一種新顏色都可以預測一個類別主題。

上面的影象顯示了三個新的資料點的預測的叢集組。這些隨機生成的顏色(紅、綠、藍)分別被分配到紅、綠、藍兩組。

結語

聚類顏色是一種簡潔的的方法,可以直觀地理解人工智慧中無監督的機器學習是如何工作的。 然而,我們可以超越這個主題,將無監督的學習轉向更多真實的場景中。 此文為編譯作品,作者:KORY BECKER,原網站:http://www.primaryobjects.com/2017/07/24/intelligent-topic-detection-with-unsupervised-learning/