大資料 機器學習 演算法概論

tea_year發表於2018-04-12

視訊解析  https://edu.csdn.net/course/play/7813

演算法概述

演算法是電腦科學領域最重要的基石之一,計算機語言和開發平臺日新月異,但萬變不離其宗的是那些演算法和理論,資料結構和演算法是軟體開發必備的核心基礎,是內功心法。下面舉例拿推薦演算法和分類演算法的實際場景做下舉例:

推薦演算法的應用場景,各種app(偏資訊)的應用外的手機推薦:

上面可以看出有米飯資訊,優酷視訊,抖音短視訊等推薦,他們都傾向於在下班休息的碎片時間進行推送。他們有的是根據你的關注和興趣進行提醒,有的是根據當下社會熱點進行推薦,還有的就是優惠券性質的推送。

再有就是應用內的推薦:

 

可以看出手機購物時,當我們搜尋某家商店的某件商品時。系統會根據我們的搜尋歷史和購買歷史進行相似物品的推薦。

分類演算法(醫學上的腫瘤判斷)

如何判斷細胞是否屬於腫瘤細胞呢?腫瘤細胞和普通細胞,有差別。但是,需要非常有經驗的醫生,通過病理切片才能判斷。如果通過機器學習的方式,使得系統自動識別出腫瘤細胞。此時的效率,將會得到飛速的提升。並且,通過主觀(醫生)+客觀(模型)的方式識別腫瘤細胞,結果交叉驗證,結論可能更加靠譜。

如何操作?通過分類模型識別。簡言之,包含兩個步驟。首先,通過一系列指標刻畫細胞特徵,例如細胞的半徑、質地、周長、面積、光滑度、對稱性、凹凸性等等,構成細胞特徵的資料。其次,在細胞特徵寬表的基礎上,通過搭建分類模型進行腫瘤細胞的判斷。

 

對於我們來說最簡單的應用案例。請看如下程式碼應用

對於我們來說最簡單的應用案例。請看如下程式碼應用,根據班級同學不同的分段給出評級。一個班級裡不同分段的人數不是相等的,而是有著峰值和低谷。案例:將學生的百分制成績轉換為五分製成績:≥90 分: A,80~89分: B,70~79分: C,60~69分: D,<60分: E。一般程式寫法:

/**
 * @author 張晨光
 * 測試成績結果演算法1
 */
public class TestOne {
	public static String getGrade(int grade){
		String result="";
		if(grade<60){
			result="E";
		}else if(grade<70){
			result="D";
		}else if(grade<80){
			result="C";
		}else if(grade<90){
			result="B";
		}else{
			result="A";
		}
		return result;
	}
}

如果學生的總成績資料有10000條,則5%的資料需 1 次比較,15%的資料需 2 次比較,40%的資料需 3 次比較,40%的資料需 4 次比較,因此10000 個資料比較的

次數為:  10000 (5%+2×15%+3×40%+4×40%)=31500次

此種形狀的二叉樹,需要的比較次數是:10000 (3×20%+2×80%)=22000次,顯然:兩種判別樹的效率是不一樣的。

 

因此,不同的演算法程式的執行效率是不一樣的,我們儘量找到最優演算法,提高程式的執行效率。就像你編遊戲,人口最高只敢100,否則機器就特慢,人家就敢讓人口到300;你的農民遇到石頭就停住了,人家的農民就能繞過去,找最近的路。這些都離不開演算法工程師的功勞。

所謂“演算法”是指解決問題的一種方法步驟或者一個過程。

一個演算法應該具有以下幾個重要的特徵。

(1)輸入:一個演算法應該有n(n≥0)個初始的輸入資料。

(2)輸出:一個演算法可以沒有或有一個或多個輸出資訊,它們與輸入資料之間會有著某種特定的關係。

(3)確定性:演算法中的每一個步驟都必須具有確切的含義,不能有二義性。

(4)可行性:演算法中描述的每一個操作步驟都必須是可以執行的,也就是說,都可以通過計算機實現。

(5)有窮性:一個演算法必須在經歷有限個步驟之後正常結束,不能形成死迴圈。                         

思考題,3個數中求最大值,比較下哪種演算法比較好!!!

/**
 * 
 * @author 張晨光
 * 求3個數中的最大值
 * 
 */
public class TestFour {
	public static int getMax1(int a,int b,int c){
		int max;
		if(a>b&&a>c){
			max=a;
		}else if(c>a&&c>b){
			max=c;
		}else
			max=b;
		return max;
	}
	//第2種寫法,其他比較幼稚的寫法,暫時不再提供
	public static int getMax2(int a,int b,int c){
		int max=a;
		if(b>max){
			max=b;
		}
		if(c>max){
			max=c;
		}
		return max;
	}
	//三元運算子;
	public static int getMax3(int a,int b,int c){
		int max=(a>b)?a:b;
		max=(max>c)?max:c;
		//或者老老司機寫的
		max =((a > b ? a : b) > c) ? (a > b ? a : b) : c;
		return max;
	}
}


相關文章