-
1 # 臥蠶uncle46
-
2 # DKink
好好學習數學,然後學習你要研究的方向的演算法。
計算機圖形學
有限元
神經網路
分散式
有成熟的演算法也有在發展中的演算法。
沒有具體的答案。
-
3 # 加米穀大資料
Apriori演算法:https://www.toutiao.com/i6602129057633010184/
AdaBoost演算法:https://www.toutiao.com/i6602034223387771400/
C4.5演算法:https://www.toutiao.com/i6602461790884332045/
CART演算法:https://www.toutiao.com/i6602016174802731533/
K-Means演算法:https://www.toutiao.com/i6602460997519147524/
EM演算法:https://www.toutiao.com/i6602049078824010247/
SVM演算法:https://www.toutiao.com/i6602460036063035911/
PageRank演算法:https://www.toutiao.com/i6602036596369785347/
K-鄰近演算法/kNN:https://www.toutiao.com/i6602033239240475140/
樸素貝葉斯演算法:https://www.toutiao.com/i6602032352438780419/
-
4 # 哎呦658
演算法原理整合學習(ensemble leaning)透過構建並結合多個學習器來完成學習任務,透過將多個學習器結合,常常可以獲得比單一學習器顯著優越的效果和泛化能力。整合學習中的基學習器可以是同質的,也可以是異質的。根據個體學習器的生成方式,目前的整合學習方法大致可分為三大類:一類是Bagging,個體學習器之間不存在強依賴關係,可以同時並行化訓練和生成,最終結果通常透過投票機制產出,隨機森林是這一型別的代表;另一類是Boosting,個體學習器之間存在強依賴關係,後一學習器依賴前一學習器的結果,,因此必須以序列化形式序列生成,我們下節會講到的Adaboost和GBDT是這一型別的代表;其實還有第三類,叫Stacking,即將初級學習器的輸出次級學習器的輸入特徵,深層神經網路甚至可以理解為Stacking整合學習的變種。
隨機森林(Random Forest)是以決策樹為基學習器構建的Bagging整合學習演算法,其實現簡單、計算開銷小、並且在很多現實任務中表現出搶眼的效果。其主要透過樣本擾動和屬性擾動使得整合學習的泛化性顯著提高。樣本擾動是指透過對初始訓練集取樣構建每一棵決策樹;屬性擾動是指對基決策樹的每個節點,分裂時從該節點的屬性集合中隨機選擇k個屬性(k一般去log(d,2),d為屬性數量)。
模型訓練程式碼地址:https://github.com/qianshuang/ml-exp
def train():
print("start training...")
# 處理訓練資料
train_feature, train_target = process_file(train_dir, word_to_id, cat_to_id)
# 模型訓練
model.fit(train_feature, train_target)
def test():
print("start testing...")
# 處理測試資料
test_feature, test_target = process_file(test_dir, word_to_id, cat_to_id)
# test_predict = model.predict(test_feature) # 返回預測類別
test_predict_proba = model.predict_proba(test_feature) # 返回屬於各個類別的機率
test_predict = np.argmax(test_predict_proba, 1) # 返回機率最大的類別標籤
# accuracy
true_false = (test_predict == test_target)
accuracy = np.count_nonzero(true_false) / float(len(test_target))
print()
print("accuracy is %f" % accuracy)
# precision recall f1-score
print()
print(metrics.classification_report(test_target, test_predict, target_names=categories))
# 混淆矩陣
print("Confusion Matrix...")
print(metrics.confusion_matrix(test_target, test_predict))
if not os.path.exists(vocab_dir):
# 構建詞典表
build_vocab(train_dir, vocab_dir)
categories, cat_to_id = read_category()
words, word_to_id = read_vocab(vocab_dir)
# kNN
# model = neighbors.KNeighborsClassifier()
# decision tree
# model = tree.DecisionTreeClassifier()
# random forest
model = ensemble.RandomForestClassifier(n_estimators=10) # n_estimators為基決策樹的數量,一般越大效果越好直至趨於收斂
train()
test()執行結果:
ead_category...
read_vocab...
start training...
start testing...
accuracy is 0.875000
precision recall f1-score support
娛樂 0.83 0.91 0.87 89
房產 0.78 0.83 0.80 104
教育 0.81 0.81 0.81 104
家居 0.75 0.71 0.73 89
遊戲 0.93 0.95 0.94 104
時政 0.78 0.79 0.78 94
時尚 0.94 0.89 0.92 91
體育 0.98 0.97 0.97 116
財經 0.95 0.91 0.93 115
科技 0.99 0.96 0.97 94
avg / total 0.88 0.88 0.88 1000
Confusion Matrix...
---------------------
-
5 # 破力
演算法這個詞比較籠統,在程式設計中,有邏輯上的演算法,也有資料上的演算法
比如簡單的邏輯演算法:
func(){
a 走100步
b走10步
完成
}
這就可以是一個演算法。
資料上的演算法:
func(a, b) {
a + b
}
一個加法運算的演算法
還有那些深度學習,神經網路都可以稱為演算法
-
6 # 程式設計師愛學習
演算法思想有很多,業界公認的常用演算法思想有8種,分別是列舉、遞推、遞迴、分治、貪心、試探法、動態迭代和模擬。當然8種只是一個大概的劃分,是一個“仁者見仁、智者見智”的問題。
其實這些演算法都是用來處理資料的,這些被處理的資料必須按照一定的規則進行組織。當這些資料之間存在一種或多種特定關係時,通常將這些關係稱為結構。在C語言資料之間一般存在如下3種基本結構。
-
7 # dlrowolleh
基礎的一些演算法,如排序,查詢,搜尋等,基礎資料結構如,線性表,連結串列,樹,圖等。
上面的演算法不再介紹了,隨便一本資料結構和演算法的樹都介紹的很詳細。
後面簡單說幾個我工作後接觸到的幾個有意思的演算法。
一致性hash演算法
更多的用在分散式快取和儲存系統當中,主要用於節點的查詢,以及節點的動態擴容。一般情況下不考慮節點的動態擴容的話,我們如果將資料分散式儲存,使用普通hash演算法就可以做到,只要將資料的id透過hash對映到指定節點上就可以,但問題是如果需要動態調整節點的話,所有已經hash計算過的對映資料需要重新計算,而一致性hash演算法就解決這個問題誕生的。
Kademlia演算法
Kademlia是一種分散式雜湊演算法(DHT),這個演算法主要應用在P2P的網路資料儲存和查詢中。它的特點是分散式儲存內容的索引資訊,索引資訊的節點儲存和節點本身的地址有一定關係,能夠透過節點路由查詢到需要的內容,並且保證索引資訊在不同節點上有一定冗餘,用來解決P2P節點的不可靠性,即使一個節點下限後也能保證資料也能夠查詢到。簡單打個比方,我想認識國家主席,我可以先認識省委書記,想認識省委書記可以先認識市委書記,認識市委書記可以先認識教育廳廳長,認識教育廳廳長可以先認識我們學校校長,認識學習校長,可以先認識我孩子的班主任。這個就是利用節點關係來查詢目標物件的方式。
區塊鏈
涉及區塊鏈的知識比較多,這裡只是簡單介紹一下它的核心部分。
可以先回顧一下我們學習過的普通連結串列資料結構,每個連結串列節點,都會有一個指標指向下一個連結串列節點,而透過拿到連結串列表頭,我們就遍歷整個連結串列,查詢資料了。而區塊鏈其實也是個連結串列,只不過它不是為了靈活插入資料到鏈中,或者遍歷鏈中的資料。它的主要作用是驗證連結串列中資料的合法性,兩個區塊之間的鏈是使用雜湊值關聯起來的,後一個區塊儲存前一個區塊的雜湊摘要,因此前一個區塊內容被非法篡改,後一個區塊透過前一個區塊的摘要就會驗證失敗,而摘要的生成是需要有一定規則的,需要用窮舉的方式碰撞出來,因此摘要的生成是需要一定算力才可以完成,這就保證的想要篡改歷史區塊,從計算量上來說,幾乎不可能了。
上面說了幾個工作中涉及到的其中幾個演算法,其實還有很多有意思的演算法沒有介紹到,比如HyperLogLog、布隆過濾器、分散式系統Paxos演算法等等,如果有朋友喜歡計算機演算法這塊的知識,可以關注下我,後面我會發一些文章詳細介紹下。
回覆列表
計算機的程式語言只不過是演算法的一種實現形式罷了。同一個需求可以用很多不同的演算法去實現,同一個演算法又可以用多種程式語言去編寫。但不可否認的話,幾乎要用到程式設計的地方就離不開演算法。