主頁 > 後端開發 > 5.機器學習之樸素貝葉斯詳解

5.機器學習之樸素貝葉斯詳解

2020-10-17 00:20:46 後端開發

本篇博客主要詳細介紹樸素貝葉斯模型,首先貝葉斯分類器是一類分類演算法的總稱,這類演算法均以貝葉斯定理為基礎,故統稱為貝葉斯分類器,而樸素貝葉斯分類器是貝葉斯分類器中最簡單,也是最常見的一種分類方法,并且,樸素貝葉斯演算法仍然是流行的十大挖掘演算法之一,該演算法是有監督的學習演算法,解決的是分類問題,該演算法的優點在于簡單易懂、學習效率高、在某些領域的分類問題中能夠與決策樹、神經網路相媲美,但由于該演算法以自變數之間的獨立(條件特征獨立)性和連續變數的正態性假設為前提(這個假設在實際應用中往往是不成立的),就會導致演算法精度在某種程度上受影響,

樸素貝葉斯法是基于貝葉斯定理與特征條件獨立假設的分類方法,是經典的機器學習演算法之一,最為廣泛的兩種分類模型是決策樹(Decision Tree Model)和樸素貝葉斯模型(Naive Bayesian Model,NBM),和決策樹模型相比,樸素貝葉斯分類器(Naive Bayes Classifier 或 NBC)發源于古典數學理論,有著堅實的數學基礎,以及穩定的分類效率,同時,NBC模型所需估計的引數很少,對缺失資料不太敏感,演算法也比較簡單,理論上,NBC模型與其他分類方法相比具有最小的誤差率,

歷史背景解讀:

18世紀英國數學家托馬斯·貝葉斯(Thomas Bayes,1702~1761)提出過一種看似顯而易見的觀點:“用客觀的新資訊更新我們最初關于某個事物的信念后,我們就會得到一個新的、改進了的信念,”這個研究成果由于簡單顯得平淡無奇,直至他死后兩年才于1763年由他的朋友理查德·普萊斯幫助發表,它的數學原理很容易理解,簡單說就是,如果你看到一個人總是做一些好事,則會推斷那個人多半會是一個好人,這就是說,當你不能準確知悉一個事物的本質時,你可以依靠與事物特定本質相關的事件出現的多少去判斷其本質屬性的概率,用數學語言表達就是:支持某項屬性的事件發生得愈多,則該屬性成立的可能性就愈大,與其他統計學方法不同,貝葉斯方法建立在主觀判斷的基礎上,你可以先估計一個值,然后根據客觀事實不斷修正,

1774年,法國數學家皮埃爾-西蒙·拉普拉斯(Pierre-Simon Laplace,1749-1827)獨立地再次發現了貝葉斯公式,拉普拉斯關心的問題是:當存在著大量資料,但資料又可能有各種各樣的錯誤和遺漏的時候,我們如何才能從中找到真實的規律,拉普拉斯研究了男孩和女孩的生育比例,有人觀察到,似乎男孩的出生數量比女孩更高,這一假說到底成立不成立呢? 拉普拉斯不斷地搜集新增的出生記錄,并用之推斷原有的概率是否準確,每一個新的記錄都減少了不確定性的范圍,拉普拉斯給出了我們現在所用的貝葉斯公式的表達:

   

該公式表示在B事件發生的條件下A事件發生的條件概率,等于A事件發生條件下B事件發生的條件概率乘以A事件的概率,再除以B事件發生的概率,公式中,P(A)也叫做先驗概率,P(A/B)叫做后驗概率,嚴格地講,貝葉斯公式至少應被稱為“貝葉斯-拉普拉斯公式”,

貝葉斯學派很古老,但是從誕生到一百年前一直不是主流,主流是頻率學派,頻率學派的權威皮爾遜和費歇爾都對貝葉斯學派不屑一顧,但是貝葉斯學派硬是憑借在現代特定領域的出色應用表現為自己贏得了半壁江山,貝葉斯學派的思想可以概括為先驗概率+資料=后驗概率,也就是說我們在實際問題中需要得到的后驗概率,可以通過先驗概率和資料一起綜合得到,資料大家好理解,被頻率學派攻擊的是先驗概率,一般來說先驗概率就是我們對于資料所在領域的歷史經驗,但是這個經驗常常難以量化或者模型化,于是貝葉斯學派大膽的假設先驗分布的模型,比如正態分布,beta分布等,這個假設一般沒有特定的依據,因此一直被頻率學派認為很荒謬,雖然難以從嚴密的數學邏輯里推出貝葉斯學派的邏輯,但是在很多實際應用中,貝葉斯理論很好用,比如垃圾郵件分類,文本分類,

概率基礎:

條件概率是指事件A在另外一個事件B已經發生條件下的發生概率, 條件概率表示為: P(A|B), 讀作“在B條件下A的概率”,若只有兩個事件A, B, 那么:

?

 

 

 

概念:

先驗概率:是指根據以往經驗和分析得到的概率,例如如果我們對西瓜的色澤、根蒂和紋理等特征一無所知,按照常理來說,西瓜是好瓜的概率是60%,那么這個概率P(好瓜)就被稱為先驗概率,

后驗概率:事情已經發生,要求這件事情發生的原因是由某個因素引起的可能性的大小,例如假如我們了解到判斷西瓜是否好瓜的一個指標是紋理,一般來說,紋理清晰的西瓜是好瓜的概率大一些,大概是75%,如果把紋理清晰當作一種結果,然后去推測好瓜的概率,那么這個概率P(好瓜|紋理清晰)就被稱為后驗概率,后驗概率類似于條件概率(紋理清晰的條件下是好瓜的概率),

聯合概率:設二維離散型隨機變數(X,Y)所有可能取得值為,記則稱 為隨機變數X和Y的聯合概率,計算如下:

例:在買西瓜的案例中,P(好瓜,紋理清晰)稱為聯合分布,它表示紋理清晰且是好瓜的概率,關于它的聯合概率,滿足以下乘法等式:

其中,P(好瓜|紋理清晰)就是后驗概率,表示在“紋理清晰”的條件下,是“好瓜”的概率,P(紋理清晰|好瓜)表示在“好瓜”的情況下,是“紋理清晰”的概率,

 

貝葉斯定理:

 (注:P(x,c)=P(x│c)P(c))

 

 

 

后驗概率P(c∣x),在現實任務中通常難以直接獲得,所要實作的是基于有限的訓練樣本集盡可能準確地估計出后驗概率P(c│x),有兩種策略:直接建模P(c∣x)來預測c,“判別式模型”;對聯合概率分布P(x,c)P(x,c)P(x,c)建模,然后再由此獲得P(c|x),“生成式模型”,Fisher判別式、支持向量機等,都可歸入判別式模型的范疇,

對生成式模型(貝葉斯分類器):對于每個特征x,我們想要知道樣本在這個特性x下屬于哪個類別,即求后驗概率P(c|x)最大的類標記,這樣基于貝葉斯公式,可以得到:

P(c)是類“先驗”概率,P(x|c)是樣本x相對于類標記c的類條件概率,或稱似然,p(x)是用于歸一化的“證據”因子,對于給定樣本x,證據因子p(x)與類標記無關,即在下面的示例中分母不做處理,于是,估計p(c|x)的問題變為基于訓練資料來估計先驗P(c)和似然P(x∣c),對于條件概率p(x|c)來說,它涉及x所有屬性的聯合概率,P(c)可通過各類樣本出現的頻率來進行估計,

 

逆概:(考慮事件)

貝葉斯分類器就是一種分類的方法,而且是一種基于貝葉斯原理,對聯合概率分布p(x,c)建模,之后由條件概率公式得出后驗概率的生成式模型的方法 ,因為后驗概率P(c∣x),在現實任務中通常難以直接獲得,所以樸素貝葉斯可以理解為求 "逆概" ,

例如:一座別墅在過去的 20 年里一共發生過 2 次被盜,別墅的主人有一條狗,狗平均每周晚上叫 3 次,在盜賊入侵時狗叫的概率被估計為 0.9,問題是:在狗叫的時候發生入侵的概率是多少?

假設 A 事件為狗在晚上叫,B 為盜賊入侵,

事件A(狗叫):P(A) = 3/7

事件B(被偷):P(B) = 2/(365*20+4)

盜賊入侵時狗叫的概率被估計為 0.9(先偷后叫):P(A|B) = 0.9

考慮事件(反過來,逆概):P(B|A) = P(A|B) * P(B) / P(A) = 0.9* (2/(365*20+4)) / (3/7)  = 0.000575

 

極大似然估計:

估計類條件概率的一種常用策略是先假定其具有某種確定的概率分布形式,再基于訓練樣本對概率分布的引數進行估計,

假設P(x∣c)具有確定的形式并且被引數向量θc唯一確定,則我們的任務就是利用訓練集D估計引數θc,我們將P(x|c)記為P(x∣θc)

引數估計有兩個學派:

1)頻率主義學派:認為引數雖然未知,但卻是客觀存在的固定值,可通過優化似然函式等準則來確定引數值,經典的方法:極大似然估計,

2)貝葉斯學派:認為引數是未觀察到的隨機變數, 可假定引數服從一個先驗分布,然后基于觀測到的資料來計算引數的后驗分布,

Dc表示訓練集D中第c類樣本組成的集合,假設這些樣本是獨立同分布的,則引數θc對于資料集Dc的似然是:

同時發生,因此連乘,對θc進行極大似然估計,就是去尋找能最大化似然P(Dc∣θc)的引數值θc,直觀上看,極大似然估計是試圖在θc所有可能的取值中,找到一個能使資料出現的“可能性”最大的值,

上式的連乘操作易造成下溢,通常使用對數似然:

連乘轉換為連加,更好處理,此時引數θc 的極大似然估計為:

在連續屬性情形下,假設概率密度函式,則引數和的極大似然估計為:

 

似然函式 L(x;θ)L(x;θ)L(x;θ)在形式上,其實就是樣本的聯合密度,把x1,x2,x3,…,xn看作常數,而把待定引數θ0,θ1,…,θn看作 L 的自變數,對連續型總體X 和離散型隨機變數X,樣本的似然函式分別是概率密度和分布率的連乘形式,

 

樸素貝葉斯演算法:

是在貝葉斯演算法的基礎上進行了相應的簡化,即假定給定目標值時屬性之間相互條件獨立,也就是說沒有哪個屬性變數對于決策結果來說占有著較大的比重,也沒有哪個屬性變數對于決策結果占有著較小的比重,雖然這個簡化方式在一定程度上降低了貝葉斯分類演算法的分類效果,但是在實際的應用場景中,極大地簡化了貝葉斯方法的復雜性,在所有的機器學習分類演算法中,樸素貝葉斯和其他絕大多數的分類演算法都不同,對于大多數的分類演算法,比如決策樹,KNN,邏輯回歸,支持向量機等,他們都是判別方法,也就是直接學習出特征輸出Y和特征X之間的關系,要么是決策函式Y=f(X),要么是條件分布P(Y|X),但是樸素貝葉斯卻是生成方法,也就是直接找出特征輸出Y和特征X的聯合分布P(X,Y),然后用P(Y|X)=P(X,Y)/P(X)得出,

基于貝葉斯公式來估計后驗概率P(c∣x)的主要困難:類條件概率P(x∣c)是所有屬性上的聯合概率,難以從有限的訓練樣本直接估計而得,樸素貝葉斯分類器采用了“屬性條件獨立性假設”:假設所有屬性相互獨立,基于屬性條件獨立性假設,貝葉斯公式可重寫為:

其中,d為屬性數目,xi為x在第i個屬性上的取值,由于對于所有的類別p(x)相同,即對于同一個樣本而言P(x)都是一樣的,對分類結果沒有什么影響,為了提高運行效率,我們在計算時可以不考慮證據因子P(x),最大化后驗概率便轉化為了最大化似然與先驗的乘積,基于上式的貝葉斯判定準則有:

 

這就是樸素貝葉斯分類器的運算式,樸素貝葉斯分類器的訓練程序就是基于訓練集D來估計類先驗概率P(c),并為每個屬性估計條件概率P(xi∣c)

類先驗概率:若Dc表示訓練集D中第c類樣本組成的集合,若有充足的獨立同分布樣本,則可容易的估計出來類先驗概率

 對于離散屬性而言,Dc,xi表示第c類第i個屬性上取值為xi的樣本,則條件概率P(xi∣c)可估計為:

cc

對于連續屬性可考慮為概率密度函式,假定  分別是第c類樣本在第i個屬性上取值的均值和方差,則有:

對于樸素貝葉斯還需要說明的一點是:若某種屬性值在訓練集中沒有與某個類同時出現過,則直接基于概率估計公式得出來概率為0,再通過各個屬性概率連乘式計算出的概率也為0,這就導致沒有辦法進行分類了,所以,為了避免屬性攜帶的資訊被訓練集未出現的屬性值“抹去”,在估計概率值時通常要進行“平滑”,常用“拉普拉斯修正”,具體來講,令N表示訓練集D中可能的類別數,Ni表示第i個屬性可能的取值數,

 

拉普拉斯修正避免了樣本不充分而導致概率估計為零的問題,并且在訓練集樣本變大的時候,修正程序所引入的先驗的影響也會逐漸變得可忽視,使得估計值越來越接近實際概率值,

 

案例分析1:

給定如下資料:

根據以上資料,現在有一對男女朋友,男生向女生求婚,男生的四個特點分別是不帥,性格不好,身高矮,不上進,請判斷女生是嫁還是不嫁?

該問題轉換為數學問題就是比較,該問題轉換為數學問題就是比較:P( 嫁 | 不帥,性格不好,身高矮,不上進 ) 與 P( 不嫁 | 不帥,性格不好,身高矮,不上進 ) 的概率,

由貝葉斯公式得:

 假設各個特征相互獨立,即:

 或者(其實沒區別):

首先我們整理訓練資料中:嫁的樣本數總共有6個,則 P(嫁) = 6 / 12 = 1 / 2;不帥,也嫁了的樣本數總共有6個,則 P(不帥 | 嫁) = 3 / 6 = 1 / 2;   性格不好,也嫁了的樣本數總共有1個,則 P(性格不好 | 嫁) = 1 / 6  ;身高矮,也嫁了的樣本數總共有1個,則 P(身高矮 | 嫁) = 1 / 6 ;不上進,也嫁了的樣本數總共有1個,則 P(不上進 | 嫁) = 1 / 6 ;

 

同理:

不嫁的樣本數總共有6個,則 P(不嫁) = 6 / 12 = 1 / 2;不帥,就不嫁的樣本數總共有1個,則 P(不帥 | 不嫁) = 1 / 6;性格不好,就不嫁的樣本數總共有3個,則P(性格不好 | 不嫁) = 3 / 6 = 1 / 2;   身高矮,就不嫁的樣本數總共有6個,則P(身高矮 | 不嫁) = 6 / 6 = 1;不上進,就不嫁的樣本數總共有3個,則P(不上進 | 不嫁) = 3 / 6 = 1 / 2;由于分母都相同,且分子(1 / 864) < (1 / 48) ,所以最后得出的結論是該女生不嫁給這個男生,

到此應該能整明白貝葉斯演算法是原理了,如果還沒整明白,沒關系,再來看一個例子,

案例決議2:

用西瓜資料集訓練一個樸素貝葉斯分類器,進行分類:

對下表示例進行預測:

 

 1. 求出先驗概率P(c)

 2. 求出每個屬性估計條件概率P(xi∣c):

     離散屬性:

     連續屬性:

3. 最大化后驗概率,即計算先驗與類條件概率的乘積,數值大的對應的分類為分類結果,即采用樸素貝葉斯分類器的方法,假設各屬性之間相互獨立;不考慮證據因子P(x),轉化為: P(c∣x)=P(x∣c)P(c);最大化后驗概率便轉化為了最大化似然與先驗的乘積,maxP(x∣c)P(c)轉化為:

 

 

4. 預測結果,由計算結果可知,由于0.038>6.80×10?5,即P(好瓜=是)>P(好瓜=否),此瓜更有可能是好瓜,因此樸素貝葉斯分類器將測驗樣本“測1”判別為“好瓜”,

5. 拉普拉斯修(補充)

 

樸素貝葉斯演算法實作原理總結:

貝葉斯分類器目的就是分類,即判斷含有屬性x的樣本屬于哪一類,也就是判斷后驗P(c│x)在不同的類別時概率的大小,后驗概率越大說明所屬的類別越有可能是正確的類別,因此,我們的目標就轉化為了最大化后驗概率,然后將后驗概率最大的類別判定為該樣本所屬的類別,例如:maxP(c∣x)=P(c2∣x)則x屬于c2,對于同一個樣本而言P(x)都是一樣的,對分類結果沒有什么影響,為了提高運行效率,我們在計算時可以不考慮證據因子P(x),最大化后驗概率便轉化為了最大化似然與先驗的乘積,則P(c∣x)=P(x∣c)P(c)/P(x)? ,在不考慮P(x)后轉化為: P(c∣x)=P(x∣c)P(c),

 

樸素貝葉斯的優缺點:
優點:

1. 對小規模的資料表現很好,適合多分類任務,適合增量式訓練,尤其是資料量超出記憶體時,我們可以一批批的去增量訓練;

2. 對缺失資料不太敏感,演算法也比較簡單,常用于文本分類;

3. 發源于古典數學理論,有著堅實的數學基礎,以及穩定的分類效率,當資料呈現不同的特點時,分類性能不會有太大的差異,健壯性好;

4. 當資料集屬性之間的關系相對比較獨立時,樸素貝葉斯分類演算法會有較好的效果,
缺點:

1. 對輸入資料的表達形式很敏感(離散、連續,值極大極小之類的);

2. 需要知道先驗概率,且先驗概率很多時候取決于假設,假設的模型可以有很多種,因此在某些時候會由于假設的先驗模型的原因導致預測效果不佳;

3. 由于我們是通過先驗和資料來決定后驗的概率從而決定分類,所以分類決策存在一定的錯誤率;

4. 理論上,樸素貝葉斯模型與其他分類方法相比具有最小的誤差率,但是實際上并非總是如此,這是因為樸素貝葉斯模型給定輸出類別的情況下,假設屬性之間相互獨立,這個假設在實際應用中往往是不成立的,在屬性個數比較多或者屬性之間相關性較大時,分類效果不好,而在屬性相關性較小時,樸素貝葉斯性能最為良好,對于這一點,有半樸素貝葉斯之類的演算法通過考慮部分關聯性適度改進,

 

補充:

1)半樸素貝葉斯分類器:(詳細內容待總結)在樸素的分類中, 我們假定了各個屬性之間的獨立,這是為了計算方便,防止過多的屬性之間的依賴導致的大量計算,這正是樸素的含義,雖然樸素貝葉斯的分類效果不錯,但是屬性之間畢竟是有關聯的, 某個屬性依賴于另外的屬性, 于是就有了半樸素貝葉斯分類器,

 2)樸素貝葉斯與LR的區別?簡單來說:樸素貝葉斯是生成模型,根據已有樣本進行貝葉斯估計學習出先驗概率P(Y)和條件概率P(X|Y),進而求出聯合分布概率P(XY),最后利用貝葉斯定理求解P(Y|X), 而LR是判別模型,根據極大化對數似然函式直接求出條件概率P(Y|X);樸素貝葉斯是基于很強的條件獨立假設(在已知分類Y的條件下,各個特征變數取值是相互獨立的),而LR則對此沒有要求;樸素貝葉斯適用于資料集少的情景,而LR適用于大規模資料集,

3)在估計條件概率P(X|Y)時出現概率為0的情況怎么辦?簡單來說:引入λ,當λ=1時稱為拉普拉斯平滑,

4)一句話概況樸素貝斯:是一個生成模型(很重要),其次它通過學習已知樣本,計算出聯合概率,再求條件概率,

5)生成模式和判別模式的區別:生成模式:由資料學得聯合概率分布,求出條件概率分布P(Y|X)的預測模型;常見的生成模型有:樸素貝葉斯、隱馬爾可夫模型、高斯混合模型、檔案主題生成模型(LDA)、限制玻爾茲曼機,判別模式:由資料學得決策函式或條件概率分布作為預測模型;常見的判別模型有:K近鄰、SVM、決策樹、感知機、線性判別分析(LDA)、線性回歸、傳統的神經網路、邏輯斯蒂回歸、boosting、條件隨機場,

 

 

 參考文章:

 1. https://blog.csdn.net/ch18328071580/article/details/94407134

 2. https://blog.csdn.net/yangjingjing9/article/details/79986371

 3. https://www.cnblogs.com/pinard/p/6069267.html

 4. https://blog.csdn.net/sinat_30353259/article/details/80932111

 

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/175009.html

標籤:Python

上一篇:java呼叫訊飛介面怎么實作離線語音合成?

下一篇:java和Go語言區別在哪?

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 【C++】Microsoft C++、C 和匯編程式檔案

    ......

    uj5u.com 2020-09-10 00:57:23 more
  • 例外宣告

    相比于斷言適用于排除邏輯上不可能存在的狀態,例外通常是用于邏輯上可能發生的錯誤。 例外宣告 Item 1:當函式不可能拋出例外或不能接受拋出例外時,使用noexcept 理由 如果不打算拋出例外的話,程式就會認為無法處理這種錯誤,并且應當盡早終止,如此可以有效地阻止例外的傳播與擴散。 示例 //不可 ......

    uj5u.com 2020-09-10 00:57:27 more
  • Codeforces 1400E Clear the Multiset(貪心 + 分治)

    鏈接:https://codeforces.com/problemset/problem/1400/E 來源:Codeforces 思路:給你一個陣列,現在你可以進行兩種操作,操作1:將一段沒有 0 的區間進行減一的操作,操作2:將 i 位置上的元素歸零。最終問:將這個陣列的全部元素歸零后操作的最少 ......

    uj5u.com 2020-09-10 00:57:30 more
  • UVA11610 【Reverse Prime】

    本人看到此題沒有翻譯,就附帶了一個自己的翻譯版本 思考 這一題,它的第一個要求是找出所有 $7$ 位反向質數及其質因數的個數。 我們應該需要質數篩篩選1~$10^{7}$的所有數,這里就不慢慢介紹了。但是,重讀題,我們突然發現反向質數都是 $7$ 位,而將它反過來后的數字卻是 $6$ 位數,這就說明 ......

    uj5u.com 2020-09-10 00:57:36 more
  • 統計區間素數數量

    1 #pragma GCC optimize(2) 2 #include <bits/stdc++.h> 3 using namespace std; 4 bool isprime[1000000010]; 5 vector<int> prime; 6 inline int getlist(int ......

    uj5u.com 2020-09-10 00:57:47 more
  • C/C++編程筆記:C++中的 const 變數詳解,教你正確認識const用法

    1、C中的const 1、區域const變數存放在堆疊區中,會分配記憶體(也就是說可以通過地址間接修改變數的值)。測驗代碼如下: 運行結果: 2、全域const變數存放在只讀資料段(不能通過地址修改,會發生寫入錯誤), 默認為外部聯編,可以給其他源檔案使用(需要用extern關鍵字修飾) 運行結果: ......

    uj5u.com 2020-09-10 00:58:04 more
  • 【C++犯錯記錄】VS2019 MFC添加資源不懂如何修改資源宏ID

    1. 首先在資源視圖中,添加資源 2. 點擊新添加的資源,復制自動生成的ID 3. 在解決方案資源管理器中找到Resource.h檔案,編輯,使用整個專案搜索和替換的方式快速替換 宏宣告 4. Ctrl+Shift+F 全域搜索,點擊查找全部,然后逐個替換 5. 為什么使用搜索替換而不使用屬性視窗直 ......

    uj5u.com 2020-09-10 00:59:11 more
  • 【C++犯錯記錄】VS2019 MFC不懂的批量添加資源

    1. 打開資源頭檔案Resource.h,在其中預先定義好宏 ID(不清楚其實ID值應該設定多少,可以先新建一個相同的資源項,再在這個資源的ID值的基礎上遞增即可) 2. 在資源視圖中選中專案資源,按F7編輯資源檔案,按 ID 型別 相對路徑的形式添加 資源。(別忘了先把檔案拷貝到專案中的res檔案 ......

    uj5u.com 2020-09-10 01:00:19 more
  • C/C++編程筆記:關于C++的參考型別,專供新手入門使用

    今天要講的是C++中我最喜歡的一個用法——參考,也叫別名。 參考就是給一個變數名取一個變數名,方便我們間接地使用這個變數。我們可以給一個變數創建N個參考,這N + 1個變數共享了同一塊記憶體區域。(參考型別的變數會占用記憶體空間,占用的記憶體空間的大小和指標型別的大小是相同的。雖然參考是一個物件的別名,但 ......

    uj5u.com 2020-09-10 01:00:22 more
  • 【C/C++編程筆記】從頭開始學習C ++:初學者完整指南

    眾所周知,C ++的學習曲線陡峭,但是花時間學習這種語言將為您的職業帶來奇跡,并使您與其他開發人員區分開。您會更輕松地學習新語言,形成真正的解決問題的技能,并在編程的基礎上打下堅實的基礎。 C ++將幫助您養成良好的編程習慣(即清晰一致的編碼風格,在撰寫代碼時注釋代碼,并限制類內部的可見性),并且由 ......

    uj5u.com 2020-09-10 01:00:41 more
最新发布
  • Rust中的智能指標:Box<T> Rc<T> Arc<T> Cell<T> RefCell<T> Weak

    Rust中的智能指標是什么 智能指標(smart pointers)是一類資料結構,是擁有資料所有權和額外功能的指標。是指標的進一步發展 指標(pointer)是一個包含記憶體地址的變數的通用概念。這個地址參考,或 ” 指向”(points at)一些其 他資料 。參考以 & 符號為標志并借用了他們所 ......

    uj5u.com 2023-04-20 07:24:10 more
  • Java的值傳遞和參考傳遞

    值傳遞不會改變本身,參考傳遞(如果傳遞的值需要實體化到堆里)如果發生修改了會改變本身。 1.基本資料型別都是值傳遞 package com.example.basic; public class Test { public static void main(String[] args) { int ......

    uj5u.com 2023-04-20 07:24:04 more
  • [2]SpinalHDL教程——Scala簡單入門

    第一個 Scala 程式 shell里面輸入 $ scala scala> 1 + 1 res0: Int = 2 scala> println("Hello World!") Hello World! 檔案形式 object HelloWorld { /* 這是我的第一個 Scala 程式 * 以 ......

    uj5u.com 2023-04-20 07:23:58 more
  • 理解函式指標和回呼函式

    理解 函式指標 指向函式的指標。比如: 理解函式指標的偽代碼 void (*p)(int type, char *data); // 定義一個函式指標p void func(int type, char *data); // 宣告一個函式func p = func; // 將指標p指向函式func ......

    uj5u.com 2023-04-20 07:23:52 more
  • Django筆記二十五之資料庫函式之日期函式

    本文首發于公眾號:Hunter后端 原文鏈接:Django筆記二十五之資料庫函式之日期函式 日期函式主要介紹兩個大類,Extract() 和 Trunc() Extract() 函式作用是提取日期,比如我們可以提取一個日期欄位的年份,月份,日等資料 Trunc() 的作用則是截取,比如 2022-0 ......

    uj5u.com 2023-04-20 07:23:45 more
  • 一天吃透JVM面試八股文

    什么是JVM? JVM,全稱Java Virtual Machine(Java虛擬機),是通過在實際的計算機上仿真模擬各種計算機功能來實作的。由一套位元組碼指令集、一組暫存器、一個堆疊、一個垃圾回收堆和一個存盤方法域等組成。JVM屏蔽了與作業系統平臺相關的資訊,使得Java程式只需要生成在Java虛擬機 ......

    uj5u.com 2023-04-20 07:23:31 more
  • 使用Java接入小程式訂閱訊息!

    更新完微信服務號的模板訊息之后,我又趕緊把微信小程式的訂閱訊息給實作了!之前我一直以為微信小程式也是要企業才能申請,沒想到小程式個人就能申請。 訊息推送平臺🔥推送下發【郵件】【短信】【微信服務號】【微信小程式】【企業微信】【釘釘】等訊息型別。 https://gitee.com/zhongfuch ......

    uj5u.com 2023-04-20 07:22:59 more
  • java -- 緩沖流、轉換流、序列化流

    緩沖流 緩沖流, 也叫高效流, 按照資料型別分類: 位元組緩沖流:BufferedInputStream,BufferedOutputStream 字符緩沖流:BufferedReader,BufferedWriter 緩沖流的基本原理,是在創建流物件時,會創建一個內置的默認大小的緩沖區陣列,通過緩沖 ......

    uj5u.com 2023-04-20 07:22:49 more
  • Java-SpringBoot-Range請求頭設定實作視頻分段傳輸

    老實說,人太懶了,現在基本都不喜歡寫筆記了,但是網上有關Range請求頭的文章都太水了 下面是抄的一段StackOverflow的代碼...自己大修改過的,寫的注釋挺全的,應該直接看得懂,就不解釋了 寫的不好...只是希望能給視頻網站開發的新手一點點幫助吧. 業務場景:視頻分段傳輸、視頻多段傳輸(理 ......

    uj5u.com 2023-04-20 07:22:42 more
  • Windows 10開發教程_編程入門自學教程_菜鳥教程-免費教程分享

    教程簡介 Windows 10開發入門教程 - 從簡單的步驟了解Windows 10開發,從基本到高級概念,包括簡介,UWP,第一個應用程式,商店,XAML控制元件,資料系結,XAML性能,自適應設計,自適應UI,自適應代碼,檔案管理,SQLite資料庫,應用程式到應用程式通信,應用程式本地化,應用程式 ......

    uj5u.com 2023-04-20 07:22:35 more