導航:首頁 > 源碼編譯 > 最近鄰演算法實現

最近鄰演算法實現

發布時間:2022-07-12 09:52:49

❶ 機器學習中演算法的優缺點之最近鄰演算法

機器學習中有個演算法是十分重要的,那就是最近鄰演算法,這種演算法被大家稱為KNN。我們在學習機器學習知識的時候一定要學習這種演算法,其實不管是什麼演算法都是有自己的優缺點的,KNN演算法也不例外,在這篇文章中我們就詳細的給大家介紹一下KNN演算法的優缺點,大家一定要好好學起來喲。
說到KNN演算法我們有必要說一下KNN演算法的主要過程,KNN演算法的主要過程有四種,第一就是計算訓練樣本和測試樣本中每個樣本點的距離,第二個步驟就是對上面所有的距離值進行排序(升序)。第三個步驟就是選前k個最小距離的樣本。第四個步驟就是根據這k個樣本的標簽進行投票,得到最後的分類類別。
那麼大家是否知道如何選擇一個最佳的K值,這取決於數據。一般情況下,在分類時較大的K值能夠減小雜訊的影響,但會使類別之間的界限變得模糊。一般來說,一個較好的K值可通過各種啟發式技術來獲取,比如說交叉驗證。另外雜訊和非相關性特徵向量的存在會使K近鄰演算法的准確性減小。近鄰演算法具有較強的一致性結果,隨著數據趨於無限,演算法保證錯誤率不會超過貝葉斯演算法錯誤率的兩倍。對於一些好的K值,K近鄰保證錯誤率不會超過貝葉斯理論誤差率。
那麼KNN演算法的優點是什麼呢?KNN演算法的優點具體體現在六點,第一就是對數據沒有假設,准確度高,對outlier不敏感。第二就是KNN是一種在線技術,新數據可以直接加入數據集而不必進行重新訓練。第三就是KNN理論簡單,容易實現。第四就是理論成熟,思想簡單,既可以用來做分類也可以用來做回歸。第五就是可用於非線性分類。第六就是訓練時間復雜度為O(n)。由此可見,KNN演算法的優點是有很多的。
那麼KNN演算法的缺點是什麼呢?這種演算法的缺點具體體現在六點,第一就是樣本不平衡時,預測偏差比較大。第二就是KNN每一次分類都會重新進行一次全局運算。第三就是k值大小的選擇沒有理論選擇最優,往往是結合K-折交叉驗證得到最優k值選擇。第四就是樣本不平衡問題(即有些類別的樣本數量很多,而其它樣本的數量很少)效果差。第五就是需要大量內存。第六就是對於樣本容量大的數據集計算量比較大。
正是由於這些優點和缺點,KNN演算法應用領域比較廣泛,在文本分類、模式識別、聚類分析,多分類領域中處處有KNN演算法的身影。
在這篇文章中我們給大家介紹了很多關於KNN演算法的相關知識,通過對這些知識的理解相信大家已經知道該演算法的特點了吧,希望這篇文章能夠幫助大家更好的理解KNN演算法。

❷ KNN演算法,k近鄰

K最近鄰(k-Nearest Neighbour,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。

❸ 什麼是k-最近鄰演算法

K最近鄰(k-Nearest Neighbor,KNN)分類演算法,是一個理論上比較成熟的方法,也是最簡單的機器學習演算法之一。該方法的思路是:如果一個樣本在特徵空間中的k個最相似(即特徵空間中最鄰近)的樣本中的大多數屬於某一個類別,則該樣本也屬於這個類別。KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。 KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成正比。該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。
該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。

❹ 使用Node.js如何實現K最近鄰分類演算法

源於數據挖掘的一個作業, 這里用Node.js技術來實現一下這個機器學習中最簡單的演算法之一k-nearest-neighbor演算法(k最近鄰分類法)。
k-nearest-neighbor-classifier
還是先嚴謹的介紹下。急切學習法(eager learner)是在接受待分類的新元組之前就構造了分類模型,學習後的模型已經就緒,急著對未知的元組進行分類,所以稱為急切學習法,諸如決策樹歸納,貝葉斯分類等都是急切學習法的例子。惰性學習法(lazy learner)正好與其相反,直到給定一個待接受分類的新元組之後,才開始根據訓練元組構建分類模型,在此之前只是存儲著訓練元組,所以稱為惰性學習法,惰性學習法在分類進行時做更多的工作。
本文的knn演算法就是一種惰性學習法,它被廣泛應用於模式識別。knn基於類比學習,將未知的新元組與訓練元組進行對比,搜索模式空間,找出最接近未知元組的k個訓練元組,這里的k即是knn中的k。這k個訓練元祖就是待預測元組的k個最近鄰。
balabala了這么多,是不是某些同學想大喊一聲..speak Chinese! 還是來通俗的解釋下,然後再來看上面的理論應該會明白很多。小時候媽媽會指著各種各樣的東西教我們,這是小鴨子,這個紅的是蘋果等等,那我們哼哧哼哧的看著應答著,多次被教後再看到的時候我們自己就能認出來這些事物了。主要是因為我們在腦海像給這個蘋果貼了很多標簽一樣,不只是顏色這一個標簽,可能還有蘋果的形狀大小等等。這些標簽讓我們看到蘋果的時候不會誤認為是橘子。其實這些標簽就對應於機器學習中的特徵這一重要概念,而訓練我們識別的過程就對應於泛化這一概念。一台iphone戴了一個殼或者屏幕上有一道劃痕,我們還是能認得出來它,這對於我們人來說非常簡單,但蠢計算機就不知道怎麼做了,需要我們好好調教它,當然也不能過度調教2333,過度調教它要把其他手機也認成iphone那就不好了,其實這就叫過度泛化。
所以特徵就是提取對象的信息,泛化就是學習到隱含在這些特徵背後的規律,並對新的輸入給出合理的判斷。
我們可以看上圖,綠色的圓代表未知樣本,我們選取距離其最近的k個幾何圖形,這k個幾何圖形就是未知類型樣本的鄰居,如果k=3,我們可以看到有兩個紅色的三角形,有一個藍色的三正方形,由於紅色三角形所佔比例高,所以我們可以判斷未知樣本類型為紅色三角形。擴展到一般情況時,這里的距離就是我們根據樣本的特徵所計算出來的數值,再找出距離未知類型樣本最近的K個樣本,即可預測樣本類型。那麼求距離其實不同情況適合不同的方法,我們這里採用歐式距離。
綜上所述knn分類的關鍵點就是k的選取和距離的計算。
2. 實現
我的數據是一個xls文件,那麼我去npm搜了一下選了一個叫node-xlrd的包直接拿來用。
// node.js用來讀取xls文件的包
var xls = require('node-xlrd');
然後直接看文檔實例即可,把數據解析後插入到自己的數據結構里。
var data = [];// 將文件中的數據映射到樣本的屬性var map = ['a','b','c','d','e','f','g','h','i','j','k'];// 讀取文件
xls.open('data.xls', function(err,bk){
if(err) {console.log(err.name, err.message); return;}
var shtCount = bk.sheet.count;
for(var sIdx = 0; sIdx < shtCount; sIdx++ ){
var sht = bk.sheets[sIdx],
rCount = sht.row.count,
cCount = sht.column.count;
for(var rIdx = 0; rIdx < rCount; rIdx++){
var item = {};
for(var cIdx = 0; cIdx < cCount; cIdx++){
item[map[cIdx]] = sht.cell(rIdx,cIdx);
}
data.push(item);
}
}
// 等文件讀取完畢後 執行測試
run();
});
然後定義一個構造函數Sample表示一個樣本,這里是把剛生成的數據結構里的對象傳入,生成一個新的樣本。
// Sample表示一個樣本
var Sample = function (object) {
// 把傳過來的對象上的屬性克隆到新創建的樣本上
for (var key in object)
{
// 檢驗屬性是否屬於對象自身
if (object.hasOwnProperty(key)) {
this[key] = object[key];
}
}
}
再定義一個樣本集的構造函數
// SampleSet管理所有樣本 參數k表示KNN中的kvar SampleSet = function(k) {
this.samples = [];
this.k = k;
};
// 將樣本加入樣本數組
SampleSet.prototype.add = function(sample) {
this.samples.push(sample);
}
然後我們會在樣本的原型上定義很多方法,這樣每個樣本都可以用這些方法。
// 計算樣本間距離 採用歐式距離
Sample.prototype.measureDistances = function(a, b, c, d, e, f, g, h, i, j, k) {
for (var i in this.neighbors)
{
var neighbor = this.neighbors[i];
var a = neighbor.a - this.a;
var b = neighbor.b - this.b;
var c = neighbor.c - this.c;
var d = neighbor.d - this.d;
var e = neighbor.e - this.e;
var f = neighbor.f - this.f;
var g = neighbor.g - this.g;
var h = neighbor.h - this.h;
var i = neighbor.i - this.i;
var j = neighbor.j - this.j;
var k = neighbor.k - this.k;
// 計算歐式距離
neighbor.distance = Math.sqrt(a*a + b*b + c*c + d*d + e*e + f*f + g*g + h*h + i*i + j*j + k*k);
}
};
// 將鄰居樣本根據與預測樣本間距離排序
Sample.prototype.sortByDistance = function() {
this.neighbors.sort(function (a, b) {
return a.distance - b.distance;
});
};
// 判斷被預測樣本類別
Sample.prototype.guessType = function(k) {
// 有兩種類別 1和-1
var types = { '1': 0, '-1': 0 };
// 根據k值截取鄰居裡面前k個
for (var i in this.neighbors.slice(0, k))
{
var neighbor = this.neighbors[i];
types[neighbor.trueType] += 1;
}
// 判斷鄰居里哪個樣本類型多
if(types['1']>types['-1']){
this.type = '1';
} else {
this.type = '-1';
}
}
注意到我這里的數據有a-k共11個屬性,樣本有1和-1兩種類型,使用truetype和type來預測樣本類型和對比判斷是否分類成功。
最後是樣本集的原型上定義一個方法,該方法可以在整個樣本集里尋找未知類型的樣本,並生成他們的鄰居集,調用未知樣本原型上的方法來計算鄰居到它的距離,把所有鄰居按距離排序,最後猜測類型。
// 構建總樣本數組,包含未知類型樣本
SampleSet.prototype.determineUnknown = function() {

for (var i in this.samples)
{
// 如果發現沒有類型的樣本
if ( ! this.samples[i].type)
{
// 初始化未知樣本的鄰居
this.samples[i].neighbors = [];
// 生成鄰居集
for (var j in this.samples)
{
// 如果碰到未知樣本 跳過
if ( ! this.samples[j].type)
continue;
this.samples[i].neighbors.push( new Sample(this.samples[j]) );
}
// 計算所有鄰居與預測樣本的距離
this.samples[i].measureDistances(this.a, this.b, this.c, this.d, this.e, this.f, this.g, this.h, this.k);
// 把所有鄰居按距離排序
this.samples[i].sortByDistance();
// 猜測預測樣本類型
this.samples[i].guessType(this.k);
}
}
};
最後分別計算10倍交叉驗證和留一法交叉驗證的精度。
留一法就是每次只留下一個樣本做測試集,其它樣本做訓練集。
K倍交叉驗證將所有樣本分成K份,一般均分。取一份作為測試樣本,剩餘K-1份作為訓練樣本。這個過程重復K次,最後的平均測試結果可以衡量模型的性能。
k倍驗證時定義了個方法先把數組打亂隨機擺放。
// helper函數 將數組里的元素隨機擺放
function ruffle(array) {
array.sort(function (a, b) {
return Math.random() - 0.5;
})
}
剩餘測試代碼好寫,這里就不貼了。
測試結果為
用餘弦距離等計算方式可能精度會更高。
3. 總結
knn演算法非常簡單,但卻能在很多關鍵的地方發揮作用並且效果非常好。缺點就是進行分類時要掃描所有訓練樣本得到距離,訓練集大的話會很慢。
可以用這個最簡單的分類演算法來入高大上的ML的門,會有點小小的成就感。

❺ 數據挖掘常用演算法有哪些

1、 樸素貝葉斯


樸素貝葉斯(NB)屬於生成式模型(即需要計算特徵與類的聯合概率分布),計算過程非常簡單,只是做了一堆計數。NB有一個條件獨立性假設,即在類已知的條件下,各個特徵之間的分布是獨立的。這樣樸素貝葉斯分類器的收斂速度將快於判別模型,如邏輯回歸,所以只需要較少的訓練數據即可。即使NB條件獨立假設不成立,NB分類器在實踐中仍然表現的很出色。它的主要缺點是它不能學習特徵間的相互作用,用mRMR中的R來講,就是特徵冗餘。


2、邏輯回歸(logistic regression)


邏輯回歸是一個分類方法,屬於判別式模型,有很多正則化模型的方法(L0,L1,L2),而且不必像在用樸素貝葉斯那樣擔心特徵是否相關。與決策樹與SVM相比,還會得到一個不錯的概率解釋,甚至可以輕松地利用新數據來更新模型(使用在線梯度下降演算法online gradient descent)。如果需要一個概率架構(比如,簡單地調節分類閾值,指明不確定性,或者是要獲得置信區間),或者希望以後將更多的訓練數據快速整合到模型中去,那麼可以使用它。


3、 線性回歸


線性回歸是用於回歸的,而不像Logistic回歸是用於分類,其基本思想是用梯度下降法對最小二乘法形式的誤差函數進行優化。


4、最近鄰演算法——KNN


KNN即最近鄰演算法,其主要過程為:計算訓練樣本和測試樣本中每個樣本點的距離(常見的距離度量有歐式距離,馬氏距離等);對上面所有的距離值進行排序;選前k個最小距離的樣本;根據這k個樣本的標簽進行投票,得到最後的分類類別;如何選擇一個最佳的K值,這取決於數據。


5、決策樹


決策樹中很重要的一點就是選擇一個屬性進行分枝,因此要注意一下信息增益的計算公式,並深入理解它。


6、SVM支持向量機


高准確率,為避免過擬合提供了很好的理論保證,而且就算數據在原特徵空間線性不可分,只要給個合適的核函數,它就能運行得很好。在動輒超高維的文本分類問題中特別受歡迎。可惜內存消耗大,難以解釋,運行和調參也有些煩人,而隨機森林卻剛好避開了這些缺點,比較實用。

❻ 最近鄰匹配法可以1對5匹配嗎

最近鄰匹配法可以1對5匹配。
kNN演算法全程是k-最近鄰演算法(k-NearestNeighbor)。
匹配法:就是匹配實驗組和控制組的某些被試屬性,先測量被試身上和實驗任務高相關性的屬性,然後再根據測得結果把被試分為屬性相等的實驗組和控制組。

❼ matlab協同過濾找近鄰

基於用戶協同過濾的最近鄰演算法。
所謂最近鄰,就是找到距離最近或最相似的用戶,將他的物品推薦出來。k近鄰(K Nearest Neighbor)的意思就是,找出最近或最相似的k個用戶,將他們的評分(相似度權重求和)最高的幾個物品進行推薦。
代碼中有兩個數據集,一個是直接寫在的代碼中的users;一個是包含在BX-Book-Ratings.csv、BX-Books.csv、BX-Users.csv文件中;(下載地址:http://www.guidetodatamining.com/assets/data/BX-Dump.zip)

❽ k近鄰演算法的案例介紹

如 上圖所示,有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在, 我們不知道中間那個綠色的數據是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。我們常說,物以類聚,人以群分,判別一個人是一個什麼樣品質特徵的人,常常可以從他/她身邊的朋友入手,所謂觀其友,而識其人。我們不是要判別上圖中那個綠色的圓是屬於哪一類數據么,好說,從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:
如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。 於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特徵,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰演算法的核心思想。
KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN 演算法本身簡單有效,它是一種 lazy-learning 演算法,分類器不需要使用訓練集進行訓練,訓練時間復雜度為0。KNN 分類的計算復雜度和訓練集中的文檔數目成正比,也就是說,如果訓練集中文檔總數為 n,那麼 KNN 的分類時間復雜度為O(n)。
KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
K 近鄰演算法使用的模型實際上對應於對特徵空間的劃分。K 值的選擇,距離度量和分類決策規則是該演算法的三個基本要素: K 值的選擇會對演算法的結果產生重大影響。K值較小意味著只有與輸入實例較近的訓練實例才會對預測結果起作用,但容易發生過擬合;如果 K 值較大,優點是可以減少學習的估計誤差,但缺點是學習的近似誤差增大,這時與輸入實例較遠的訓練實例也會對預測起作用,是預測發生錯誤。在實際應用中,K 值一般選擇一個較小的數值,通常採用交叉驗證的方法來選擇最優的 K 值。隨著訓練實例數目趨向於無窮和 K=1 時,誤差率不會超過貝葉斯誤差率的2倍,如果K也趨向於無窮,則誤差率趨向於貝葉斯誤差率。 該演算法中的分類決策規則往往是多數表決,即由輸入實例的 K 個最臨近的訓練實例中的多數類決定輸入實例的類別 距離度量一般採用 Lp 距離,當p=2時,即為歐氏距離,在度量之前,應該將每個屬性的值規范化,這樣有助於防止具有較大初始值域的屬性比具有較小初始值域的屬性的權重過大。 KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。
該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
實現 K 近鄰演算法時,主要考慮的問題是如何對訓練數據進行快速 K 近鄰搜索,這在特徵空間維數大及訓練數據容量大時非常必要。

❾ K近鄰聚類演算法

推薦本書吧
Wiley - Pattern Classification, 2Ed.pdf
有中文版的但是不好找 上面很詳細 還包括其他演算法

❿ 沒有近似最近鄰演算法,還怎麼用深度學習來做推薦和搜索

現在深度學習在機器學習領域是一個很熱的概念,不過經過各種媒體的轉載播報,這個概念也逐漸變得有些神話的感覺:例如,人們可能認為,深度學習是一種能夠模擬出人腦的神經結構的機器學習方式,從而能夠讓計算機具有人一樣的智慧;而這樣一種技術在將來無疑是前景無限的。那麼深度學習本質上又是一種什麼樣的技術呢?
深度學習是什麼
深度學習是機器學習領域中對模式(聲音、圖像等等)進行建模的一種方法,它也是一種基於統計的概率模型。在對各種模式進行建模之後,便可以對各種模式進行識別了,例如待建模的模式是聲音的話,那麼這種識別便可以理解為語音識別。而類比來理解,如果說將機器學習演算法類比為排序演算法,那麼深度學習演算法便是眾多排序演算法當中的一種(例如冒泡排序),這種演算法在某些應用場景中,會具有一定的優勢。
深度學習的「深度」體現在哪裡
論及深度學習中的「深度」一詞,人們從感性上可能會認為,深度學習相對於傳統的機器學習演算法,能夠做更多的事情,是一種更為「高深」的演算法。而事實可能並非我們想像的那樣,因為從演算法輸入輸出的角度考慮,深度學習演算法與傳統的有監督機器學習演算法的輸入輸出都是類似的,無論是最簡單的Logistic Regression,還是到後來的SVM、boosting等演算法,它們能夠做的事情都是類似的。正如無論使用什麼樣的排序演算法,它們的輸入和預期的輸出都是類似的,區別在於各種演算法在不同環境下的性能不同。
那麼深度學習的「深度」本質上又指的是什麼呢?深度學習的學名又叫深層神經網路(Deep Neural Networks ),是從很久以前的人工神經網路(Artificial Neural Networks)模型發展而來。這種模型一般採用計算機科學中的圖模型來直觀的表達,而深度學習的「深度」便指的是圖模型的層數以及每一層的節點數量,相對於之前的神經網路而言,有了很大程度的提升。
深度學習也有許多種不同的實現形式,根據解決問題、應用領域甚至論文作者取名創意的不同,它也有不同的名字:例如卷積神經網路(Convolutional Neural Networks)、深度置信網路(Deep Belief Networks)、受限玻爾茲曼機(Restricted Boltzmann Machines)、深度玻爾茲曼機(Deep Boltzmann Machines)、遞歸自動編碼器(Recursive Autoencoders)、深度表達(Deep Representation)等等。不過究其本質來講,都是類似的深度神經網路模型。
既然深度學習這樣一種神經網路模型在以前就出現過了,為什麼在經歷過一次沒落之後,到現在又重新進入人們的視線當中了呢?這是因為在十幾年前的硬體條件下,對高層次多節點神經網路的建模,時間復雜度(可能以年為單位)幾乎是無法接受的。在很多應用當中,實際用到的是一些深度較淺的網路,雖然這種模型在這些應用當中,取得了非常好的效果(甚至是the state of art),但由於這種時間上的不可接受性,限制了其在實際應用的推廣。而到了現在,計算機硬體的水平與之前已經不能同日而語,因此神經網路這樣一種模型便又進入了人們的視線當中。
「 2012年6月,《紐約時報》披露了Google Brain項目,吸引了公眾的廣泛關注。這個項目是由著名的斯坦福大學機器學習教授Andrew Ng和在大規模計算機系統方面的世界頂尖專家Jeff Dean共同主導,用16000個CPU Core的並行計算訓練一種稱為「深層神經網路」(DNN,Deep Neural Networks) 」
從Google Brain這個項目中我們可以看到,神經網路這種模型對於計算量的要求是極其巨大的,為了保證演算法實時性,需要使用大量的CPU來進行並行計算。
當然,深度學習現在備受關注的另外一個原因,當然是因為在某些場景下,這種演算法模式識別的精度,超過了絕大多數目前已有的演算法。而在最近,深度學習的提出者修改了其實現代碼的Bug之後,這種模型識別精度又有了很大的提升。這些因素共同引起了深層神經網路模型,或者說深度學習這樣一個概念的新的熱潮。
深度學習的優點
為了進行某種模式的識別,通常的做法首先是以某種方式,提取這個模式中的特徵。這個特徵的提取方式有時候是人工設計或指定的,有時候是在給定相對較多數據的前提下,由計算機自己總結出來的。深度學習提出了一種讓計算機自動學習出模式特徵的方法,並將特徵學習融入到了建立模型的過程中,從而減少了人為設計特徵造成的不完備性。而目前以深度學習為核心的某些機器學習應用,在滿足特定條件的應用場景下,已經達到了超越現有演算法的識別或分類性能。
深度學習的缺點
深度學習雖然能夠自動的學習模式的特徵,並可以達到很好的識別精度,但這種演算法工作的前提是,使用者能夠提供「相當大」量級的數據。也就是說在只能提供有限數據量的應用場景下,深度學習演算法便不能夠對數據的規律進行無偏差的估計了,因此在識別效果上可能不如一些已有的簡單演算法。另外,由於深度學習中,圖模型的復雜化導致了這個演算法的時間復雜度急劇提升,為了保證演算法的實時性,需要更高的並行編程技巧以及更好更多的硬體支持。所以,目前也只有一些經濟實力比較強大的科研或,才能夠用深度學習演算法,來做一些比較前沿而又實用的應用。

閱讀全文

與最近鄰演算法實現相關的資料

熱點內容
噴油螺桿製冷壓縮機 瀏覽:578
python員工信息登記表 瀏覽:376
高中美術pdf 瀏覽:160
java實現排列 瀏覽:512
javavector的用法 瀏覽:981
osi實現加密的三層 瀏覽:231
大眾寶來原廠中控如何安裝app 瀏覽:913
linux內核根文件系統 瀏覽:242
3d的命令面板不見了 瀏覽:525
武漢理工大學伺服器ip地址 瀏覽:148
亞馬遜雲伺服器登錄 瀏覽:524
安卓手機如何進行文件處理 瀏覽:70
mysql執行系統命令 瀏覽:929
php支持curlhttps 瀏覽:142
新預演算法責任 瀏覽:443
伺服器如何處理5萬人同時在線 瀏覽:250
哈夫曼編碼數據壓縮 瀏覽:424
鎖定伺服器是什麼意思 瀏覽:383
場景檢測演算法 瀏覽:616
解壓手機軟體觸屏 瀏覽:348