小白初涉,先試試水。涉及Python,C語言基礎,機器學習等

新人小白初涉博客,不足之處,還望點出

1.小白簡介

1.1自我介紹

我現在是山建理學院的一名大一新生,專業:信息與計算科學,計算機和數學四六分,(嘿嘿,不太喜歡數學,所以大部分時間用在了計算機上)。畢竟是大一嘛,接觸的東西還是太少了,雖然進了專業的實驗室,但對很多東西接觸的還是很少,希望能在接下來的幾年裏能認識並體驗到計算機的奧祕。

1.2目的

2020年,這個疫情帶來了好多好多麻煩。作爲大一的學生,暗自慶幸早考了一年。沒有畢業生的焦慮,似乎同時也沒了學習的動力。所以來寫寫博客,以提醒監督自己,同時增長下自己的寫作能力。

1.3方向

實驗室主攻人工智能(雖然就兩個學長會),又加上自己也喜歡編程,喜歡搞些新東西,因此我也學習人工智能方向(現在在學Python)。專業有所趨向數學,數學建模也是一個學習方向(MATLAB)。

1.4目標

最直接的:考研。爭取在大學裏多參加些競賽,( 數學建模,國創啥的必須參加),即使得不了獎,也要積累些經驗嘛。

1.5現狀

主要在學Python,兩三個月了,學的有點亂,機器學習主要是跟着書打代碼,沒有做過自己的。而且一會學爬蟲,一會還學着做些小東西,(感覺也還可以,換換腦子哈哈)。學校剛開C語言,編程語言都差不多,但比起來,C語言就是麻煩。大二學校還要開Java,數據結構啥的,把自己的業餘學習全撲到Python上,其他也不會落下。

1.7.flag

畢竟自己才大一,不懂得有很多,要學的東西也還很多很多,但我畢竟年輕嘛,哈哈,對編程有絕對的興趣,也有朝氣有決心。剛看了小鹿的一個博客,裏面有個如何十年學好編程,(十年還不一定學好,哈哈,太難了),所以我也不急功近利,穩紮穩打中儘快提升自己,能做更多項目就好。以後至少一週一篇博客吧,不求多少人看,只想督促下自己,同時記錄下自己的學習路線。

1.8. 博客內容

大一新生,剛接觸編程,內容肯定不會多好,也會很雜亂,可能一會機器學習,一會爬蟲,一會又C語言了,主要目的就是像做筆記似的,記錄下自己的學習。還望多多指教下我這個小白(同時也能提高下你們嘛 哈哈)。

2.機器學習訓練模型

2.1.如果你的訓練集有超過百萬個特徵,你會選擇什麼線性迴歸訓練算法?

答:如果訓練集有數百萬個特徵,你可以使用隨機梯度下降或者是小批量梯度下降,如果內存允許,甚至可以使用批量梯度下降。但是 由於計算複雜度隨着特徵數量的增加而快速提升(比二次方還高), 因此不能使用標準方程的方法。幾種梯度下降方法計較

2.2.如果你的訓練集裏特徵的數值大小迥異,什麼算法可能會受到影響?受影響程度如何?你應該怎麼做?

答:如果訓練集的特徵數值具有非常迥異的尺寸比例,成本函數將呈現爲細長的碗狀,這導致梯度下降算法將耗費很長時間來收斂。要解決這個問題,需要在訓練模型之前先對數據進行縮放。值得注意的是,使用標準方程法,不經過特徵縮放也能正常工作。

2.3.訓練邏輯迴歸模型時,梯度下降是否會困於局部最小值?

答:訓練邏輯迴歸模型時,梯度下降不會陷入局部最小值,因爲它 的成本函數是凸函數(如果在曲線上任意兩點之間畫一條連接線,該線永遠不會穿過曲
線。)

2.4.假設運行時間足夠長,所有的梯度下降算法是不是最終會產生相同的模型?

答:如果優化問題是凸的(例如線性迴歸或者邏輯迴歸),並且學習率也不是太高,那麼所有梯度下降算法都可以接近全局最優,最終生成的模型都非常相似。但是,除非逐漸降低學習率,否則隨機梯度 下降和小批量梯度下降都不會真正收斂。相反,它們會不斷在全局最優的附近波動。也就是說,即使運行時間非常長,這些梯度下降算法產生的模型仍然會有輕微不同。

2.5.假設你使用的是批量梯度下降,並且每一輪訓練都繪製出其驗證誤差,如果發現驗證誤差持續上升,可能發生了什麼?你如何解決這個問題?

答:如果驗證誤差開始每輪上升,那麼可能性之一是學習率太高, 算法開始發散所致。如果訓練誤差也開始上升,那麼很顯然你需要降 低學習率了。但是,如果訓練誤差沒有上升,那麼模型很可能過度擬 合訓練集,應該立刻停止練。

2.6.當驗證誤差開始上升時,立刻停止小批量梯度下降算法訓練是否爲一個好主意?

答:無論是隨機梯度下降還是小批量梯度下降,由於它們的隨機 性,使得它們都不能保證在每一次的訓練迭代中都取得進展。所以, 如果在驗證誤差剛開始上升時就停止訓練,很有可能會在達到最優之 前過早停止訓練。更好的方法是定時保存模型,當較長一段時間都沒 有改善時(意味着可能不會再超過最好的記錄了),可以恢復到保存 的最優模型。

2.7.哪種梯度下降算法(所有我們討論過的)能最快到達最優解的附近?哪種會收斂?如何使其他算法同樣收斂?

答:隨機梯度下降的訓練迭代最快,因爲它一次只考慮一個訓練實例,所以通常來說,它會最快到達全局最優的附近(或者是批量非常小的小批量梯降)。但是,只有批量梯度下降纔會經過足夠長時間的訓練後真正收斂。對於隨機梯度下降和小批量梯度下降來說,除非逐漸調低學習率,否則將一直圍繞最小值上上下下。

2.8.假設你使用的是多項式迴歸,繪製出學習曲線,你發現訓練誤差和驗證誤差之間存在很大的差距。發生了什麼?哪三種方法可以解決這個問題?

答:如果驗證誤差遠高於訓練誤差,可能是因爲模型過度擬合訓練集。解決這個問題的方法之一是對多項式降階:自由度越低的模型,過度擬合的可能性越低。另一個方法是對模型進行正則化——例如,在成本函數中增加2(嶺迴歸)或1(Lasso迴歸)懲罰,同樣可以降低模型的自由度。最後,你還可以嘗試擴大訓練集。

2.9.假設你使用的是嶺迴歸,你注意到訓練誤差和驗證誤差幾乎相等,並且非常高。你認爲模型是高方差還是高偏差?你應該提高還是降低正則化超參數?

答:如果訓練誤差和驗證誤差相近,並且都非常高,則模型很可能對訓練集擬合不足。這意味着偏差較高,應該嘗試降低正則化超參數。

2.10.你爲何要使用:嶺迴歸而不是線性迴歸?Lasso迴歸而不是嶺迴歸?彈性網絡而不是Lasso迴歸?

答:有正則化的模型通常比沒有正則化的模型表現得更好,所以應該優先選擇嶺迴歸而不是普通的線性迴歸。如果訓練誤差和驗證誤差相近,並且都非高,則模型很可能對訓練集擬合不足。這意味着偏差較高,應該嘗試降低正則化超參數。
Lasso迴歸使用1懲罰函數,往往傾向於將不重要的特徵權重降至零。這將生成一個除了最重要的權重之外,其他所有權重都爲零的稀疏模型。這是自動執行特徵選擇的一種方法,如果你覺得只有少數幾個特徵是真正重要的,這不失爲一個非常好的選擇,但是當您不確定的時候,應該更青睞嶺迴歸模型。
·彈性網絡比Lasso更受歡迎,因爲某些情況下Lasso可能產生異常
表現(例如當多個特徵強相關,或者特徵數量比訓練實例多時)。並
且,彈性網絡會添加一個額外的超參數來對模型進行調整。如果你想
使用Lasso,只需要將彈性網絡的l1_ratio設置爲接近1即可。

2.11.如果你想將圖片分類爲戶外/室內以及白天/黑夜。你應該實現

兩個邏輯迴歸分類器還是一個Softmax迴歸分類器?**
答:要將圖片分類爲戶外/室內和白天/夜間,你應該訓練兩個邏輯
迴歸分類器,因爲這些類別之間並不是排他的(存在四種組合)

3 雜亂的基礎知識

3.1 np.c_ np.r_

**1.np.c_

>>>np.c_[np.ones([2,2]),([1,2],[3,4])]
array([[1., 1., 1., 2.],
       [1., 1., 3., 4.]])
>>>np.c_[np.array([1,2,3]), np.array([4,5,6])]
array([[1, 4],
       [2, 5],
       [3, 6]])
>>>np.c_[np.array([[1,2,3]]), 0, 0, np.array([[4,5,6]])]
array([[1, 2, 3,0,0, 4, 5, 6]]

2.np.r_


>>> np.r_[1:4:4j, [0]*3, 5, 6]
array([1., 2., 3., 4., 0., 0., 0., 5., 6.])
>>> np.r_[np.array([1,2,3]), 0, 0, np.array([4,5,6])]
array([1, 2, 3,0,0, 4, 5, 6])
>>> a = np.array([[0, 1, 2], [3, 4, 5]])
>>> b=np.array([[1,1,1],[2,2,2]])
>>> np.r_['0', a, b]
array([[0, 1, 2],
       [3, 4, 5]
       [1, 1, 1],
       [2, 2, 2]])
>>> a = np.array([[0, 1, 2], [3, 4, 5]])
>>> b=np.array([[1,1,1],[2,2,2]])
>>> np.r_['1', a, b]
 array([[0, 1, 2, 1, 1, 1],
       [3, 4, 5, 2, 2, 2]])

3.2 np.random

1.np.random.rand()
rand函數根據給定維度生成[0,1)之間的數據,包含0,不包含1

>>np.random.rand(4,2)

array([[ 0.02173903,  0.44376568],
       [ 0.25309942,  0.85259262],
       [ 0.56465709,  0.95135013],
       [ 0.14145746,  0.55389458]])

2.np.random.randn()
randn函數返回一個或一組樣本,具有標準正態分佈。

>>np.random.randn(2,4)

array([[ 0.27795239, -2.57882503,  0.3817649 ,  1.42367345],
       [-1.16724625, -0.22408299,  0.63006614, -0.41714538]])

3.np.random.randint()
返回隨機整數

>>np.random.randint(-5,5,size=(2,2))

array([[ 2, -1],
       [ 2,  0]])

4.np.random.seed
np.random.seed()的作用:使得隨機數據可預測。
當我們設置相同的seed,每次生成的隨機數相同。如果不設置seed,則每次會生成不同的隨機數

	import numpy as np
	i=0
	a=[]
	b=[]
	while i<6:
	    np.random.seed(1)
	    a.append(np.random.randint(1,10))
	    i+=1
	print(a)

[6, 6, 6, 6, 6, 6]
	np.random.seed(1)
	for j in range(10):
	    b.append(np.random.randint(1,10))
	print(b)

[6, 9, 6, 1, 1, 2, 8, 7, 3, 5]

5.random.shuffle(x)
現場修改序列,改變自身內容。(類似洗牌,打亂順序)

>>B = np.arange(9).reshape((3, 3))
		array([[0, 1, 2],
               [3, 4, 5],
               [6, 7, 8]])
               
>>>np.random.shuffle(B)
>array([[6, 7, 8],
                [0, 1, 2],
                [3, 4, 5]])

6.numpy.random.permutation ( x )
返回一個隨機排列


>>>np.random.permutation(10)
array([7, 9, 5, 0, 3, 6, 1, 4, 8, 2])
 
>>>np.random.permutation([1, 4, 9, 12, 15])
array([ 1,  9, 15, 12,  4])

>>>A = np.arange(9).reshape((3, 3))
 array([[0, 1, 2],
      [3, 4, 5],
      [6, 7, 8]])
 
>>>np.random.permutation(A)
 array([[0, 1, 2],
        [6, 7, 8],
        [3, 4, 5]])

7.numpy.random.RandomState()
指定種子值是爲了使同樣的條件下每次產生的隨機數一樣,避免程序調試時由隨機數不同而引起的問題。


>>>np.random.RandomState(2018).randn(2,3)  #RandomState()固定隨機值 使其可還原 rand(2,3)兩行三列的數組
array([[-0.2767676 ,  0.581851  ,  2.14839926],
       [-1.279487  ,  0.50227689,  0.8560293 ]])

8.np.random.permutation(x)
洗牌

>>>np.random.permutation(np.arange(10))#洗牌
array([0, 5, 1, 3, 7, 8, 6, 9, 2, 4])

3.3C語言函數(變量)

1.局部變量
局部變量也稱爲內部變量。局部變量是在函數內作定義說明的。其作用域僅限於函數內,離開該函數後再使用這種變量是非法的。
關於局部變量的作用域還要說明以下幾點:
1)主函數中定義的變量也只能在主函數中使用,不能在其它函數中使用。同時,主函數中也不能使用其它函數中定義的變量。因爲主函數也是一個函數,它與其它函數是平行關係。這一點是與其它語言不同的,應予以注意。
2)形參變量是屬於被調函數的局部變量,實參變量是屬於主調函數的局部變量。
3)允許在不同的函數中使用相同的變量名,它們代表不同的對象,分配不同的單元,互不干擾,也不會發生混淆。如在前例中,形參和實參的變量名都爲n,是完全允許的。
4)在複合語句中也可定義變量,其作用域只在複合語句範圍內。

2.全局變量
全局變量也稱爲外部變量,它是在函數外部定義的變量。它不屬於哪一個函數,它屬於一個源程序文件。其作用域是整個源程序。在函數中使用全局變量,一般應作全局變量說明。只有在函數內經過說明的全局變量才能使用。全局變量的說明符爲extern。但在一個函數之前定義的全局變量,在該函數內使用可不再加以說明。
3.根據長方體的長寬高求它的體積以及三個面的面積

#include <stdio.h>
int s1, s2, s3;  //面積
int vs(int a, int b, int c){
    int v;  //體積
    v = a * b * c;
    s1 = a * b;
    s2 = b * c;
    s3 = a * c;
    return v;
}
int main(){
    int v, length, width, height;
    printf("Input length, width and height: ");
    scanf("%d %d %d", &length, &width, &height);
    v = vs(length, width, height);
    printf("v=%d, s1=%d, s2=%d, s3=%d\n", v, s1, s2, s3);
    return 0;
}

利用下列公式編程計算三角形面積

提示:
(1)三角形邊長a,b,c由鍵盤輸入;
(2)若輸入的a,b,c能構成三角形,則計算面積並輸出(結果保留兩位小數);
(3)若輸入的a,b,c不能構成三角形,則重新輸入一組a,b,c,轉(2)。
要求:【樣例輸出1】Please input a,b,c:1,2,3
a=1,b=2,c=3 is not triangle.
Please input a,b,c again:1,1,1
area=0.43

#include<stdio.h>
#include<math.h>
//float a, b, c, s, ar, area; //遞歸調用,全局局部都可
int inp() {
	float a, b, c, s, ar, area;
	printf("Please input a,b,c:\n");
	scanf("%f%f%f", &a, &b, &c);
	s = (a + b + c) / 2, ar = (s - a) * (s - b) * (s - c), area = sqrt(s * ar);
	if (a < c + b && b < c + a && c < a + b) {
		printf("area=%.2f\n", area);
	}
	else {
		printf("a=%.0f,b=%.0f,c=%.0f is not triangle.\n", a, b, c);
		float are = inp();
	}
	return  area;
}
int main() {
	 inp();
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章