優(yōu)惠網(wǎng)站如何做南寧seo怎么做優(yōu)化團隊
目錄
1、什么是數(shù)據(jù)挖掘
2、為什么要有數(shù)據(jù)挖掘
3、數(shù)據(jù)挖掘用在分類任務中的算法
樸素貝葉斯算法
svm支持向量機算法
PCA主成分分析算法
k-means算法
決策樹
1、什么是數(shù)據(jù)挖掘
數(shù)據(jù)挖掘是從大量數(shù)據(jù)中發(fā)現(xiàn)隱藏在其中的模式、關系和規(guī)律的過程。它利用統(tǒng)計學、機器學習和數(shù)據(jù)庫技術等工具和方法來分析大規(guī)模數(shù)據(jù)集,以發(fā)現(xiàn)其中的信息,并將其轉(zhuǎn)化為可用的知識或決策支持。數(shù)據(jù)挖掘常用于預測、分類、聚類和關聯(lián)規(guī)則發(fā)現(xiàn)等任務。
2、為什么要有數(shù)據(jù)挖掘
數(shù)據(jù)挖掘的出現(xiàn)是為了解決大規(guī)模數(shù)據(jù)中存在的隱含信息和規(guī)律,并將其轉(zhuǎn)化為可用的知識或決策支持。
3、數(shù)據(jù)挖掘主要任務
通過數(shù)據(jù)挖掘技術,可以從大規(guī)模數(shù)據(jù)中挖掘出有用的信息和知識,為決策提供支持和指導,發(fā)現(xiàn)數(shù)據(jù)中的潛在規(guī)律和趨勢。
4、數(shù)據(jù)分析步驟
5、數(shù)據(jù)挖掘用在分類任務中的算法
-
樸素貝葉斯算法
樸素貝葉斯是一組基于貝葉斯定理的監(jiān)督學習算法。
先驗概率:基于統(tǒng)計規(guī)律,基于以往的歷史經(jīng)驗和分析得到的結果,不依賴于當前發(fā)生的條件。
后驗概率:由條件概率推理而來,由因推果,是計算在發(fā)生某事之后的概率,依賴于當前發(fā)生的條件。
條件概率:記事件A發(fā)生的概率為P(A),事件B發(fā)生的概率為P(B),則在事件B發(fā)生的條件下事件A發(fā)生的概率為P(A|B),
而貝葉斯公式就是基于條件概率,通過P(B|A)求解P(A|B)?,如下:
?由聯(lián)合公式可以推導如下,
?
P(A)和P(B)分別為先驗概率,P(A|B)和P(B|A)分別為后驗概率,P(A,B)則稱為聯(lián)合概率。??
全概率公式:表示若事件構成一個完備事件組且都有正概率,則對任意一個事件B都有公式成立,故有:
機器學習的最終目標就是回歸或者是分類,都可以看為是預測,分類則是預測屬于某一類的概率是多大,因此可以把上述貝葉斯表達式中的A看成是屬于某類的規(guī)律,把B看成是具有某種特征的現(xiàn)象,那么貝葉斯公式又可以表示為:
?樸素貝葉斯算法的原理:
特征條件假設:若假設各個特征之間沒有聯(lián)系,給定訓練數(shù)據(jù)集后,每個樣本都是n維特征,,類別標記中有m種類別,
。
樸素貝葉斯算法對條件概率分布做出了獨立性的假設,即個人維度上的特征相互獨立,那么在此假設前提下,條件概率可轉(zhuǎn)化為:
樸素貝葉斯算法是一組基于貝葉斯定理的監(jiān)督學習算法,樸素貝葉斯算法通過預測指定樣本屬于特定類別的概率來預測該樣本的所屬類別,即:
可以寫為,?
?其中,
對應為樣本的特征向量,p(x)為樣本的先驗概率,對于特定樣本x和任意類別yi,P(x)的取值均相同,并不會影響P(yi|x)取值的相對大小,因此在計算中可以被忽略(求解P(yi|x)就相當于求解P(x|yi)P(yi))。“樸素”特別之處就在于假設了特征
相互獨立,由此可以得到:
?上述等式的右邊即為連乘,將等式右邊的概率稱為判定函數(shù)。它的結果值不僅僅是代表概率,代表著判定值,,以及
均可以通過訓練樣本統(tǒng)計得到,最后的目標函數(shù)如下,
但是由于概率值為[0,1]的數(shù),作連乘運算時,容易讓最后的結果越來越趨近于0(數(shù)據(jù)下溢),故對其取log是一個常用的手段,并根據(jù)log(xy)=log(x)+log(y)將其轉(zhuǎn)換為相加的形式,
?這樣僅能預測出最后對應的最大的判定值,將上式中的max更改為argmax即可求出最大判定值所對應的類別。
-
svm支持向量機算法
支持向量機(Support Vector Machine,SVM)本身是一個二分類算法,是對感知器算法模型的一種擴展,現(xiàn)在的SVM算法支持線性分類和非線性分類的應用,并且也能通過將SVM應用于回歸應用中,在不考慮集成學習算法,不考慮特定數(shù)據(jù)集時,分類算法SVM是非常優(yōu)秀的。
支持向量:離分割超平面最近的那些點。
間隔:數(shù)據(jù)點到分割超平面的間距。
首先介紹一下感知器模型,感知器的思想就是在數(shù)據(jù)是線性可分(能找到一個平面將兩組數(shù)據(jù)給分開)的前提下任意空間中,感知器需要尋找一個超平面,能夠把所有的二分類別分割開。
感知器模型如下,目標是找到一個為0的超平面,然后分別根據(jù)神經(jīng)元的加權求和的結果判斷,大于0的為一個類別,小于0的為一個類別,因此,期望分類錯誤的樣本離超平面的距離之和最小,從而讓分類錯誤的樣本更快地朝著正確的方向進行更新,從而讓訓練成功。
?然后就是SVM算法,為什么感知器算法缺陷呢,下圖中兩條直線分別為感知器算法的超平面,它比較關注的是讓所有的點離超平面盡可能的遠,但實際上離超平面足夠遠的點基本都是被正確分類的,所以這個是沒有意義的,反而應該關注那些離超平面很近的點,這些點才容易出錯。如果測試時來了一個新的數(shù)據(jù)點(樣本),并位于這兩條藍色直線之間,那么就不能很好的處理這個新的數(shù)據(jù),由此引入了SVM支持向量機算法。
也就是說,如下圖所示,希望 找到一個最好的w和b固定一個超平面,使得這個超平面在能夠完美的區(qū)分正負例(分類)的基礎上,找到距離最近的點間隔最大。(后面的證明過程先不敘述,涉及到拉格朗日優(yōu)化目標函數(shù)過程)
?
-
PCA主成分分析算法
PCA是一種線性降維方法,他的思想主要是依靠將數(shù)據(jù)從高維空間映射到低維空間,同時在低維空間里的數(shù)據(jù)的方差被最大化。

算法步驟:
- 建立數(shù)據(jù)的協(xié)方差矩陣
- 計算矩陣的多個特征向量
- 對應有最大幾個特征值的特征向量被應用于重新建立數(shù)據(jù),這樣就會使新建的數(shù)據(jù)包含有大量原本數(shù)據(jù)的方差(信息量)。
主要包含最大投影方差和最小投影距離兩種方法證明PCA的有效性,下面用最大投影方差的方法證明一下。
最大投影方差(證明)
數(shù)據(jù)的離散性越大,代表數(shù)據(jù)在所投影的維度具有更高的區(qū)分度,這個區(qū)分度(方差)就是信息量,我們希望降維之后還能更多的保留原來的信息量,而且降維后不同維度的相關性為0,這樣即使是去掉某些相對不重要的維度也不會干擾到剩余的維度信息。

如圖2所示,使用PCA主成分分析,并不會改變原始數(shù)據(jù)的分布,只是換個角度解決問題,本質(zhì)上相當于是重新定義坐標系,找到一個更好的角度去審視數(shù)據(jù)。如圖2,舉個例子,對于同一數(shù)據(jù)分布,原坐標系橫軸縱軸比例為(5:5)1:1,采用等長的橫縱坐標,但經(jīng)過重新找定坐標系(圖2中紫色),新的坐標系橫縱軸比例可能為7:3,那這樣的話,采用主成分分析PCA,選取占比70%這條軸線進行降維,這就可以在降維的同時保留較大的信息量。

?既然希望用樣本點投影的方式希望投影之后的數(shù)據(jù)點會有更大的方差,那么不妨把投影之后的數(shù)值表達出來,如圖3中的一個數(shù)據(jù)點A(x1,y1),將原點O與其的連線構成的向量A投影到向量B所在的方向上,得:
?那既然這樣的話,單位向量不也能表示方向嗎,讓B為單位向量,|B|=1,可由上式推出,
?投影之后的新坐標系,每個軸用單位向量表示,新坐標系設置為標準正交基;即既保證了每個主成分向量wi的模為1,即
,又保證了各個主成分之間互不干擾(不疊加、不覆蓋),
。
對于任意一個點xi投影到某個坐標軸w上,則投影后的值為。
由上面的方差公式可以推出,
其中,mean表示投影后的均值。
?又因為PCA會對未投影前的原始數(shù)據(jù)進行標準歸一化操作:
- 均值歸一化/中心化:經(jīng)過如下證明得投影后的mean也為0.
- 方差歸一化:即為無量綱化,歸一到某范圍內(nèi),這樣在投影之后方差不會受到某些維度的主導。
故將mean=0帶入計算方差的式子中得,
?注意,在前面是兩個向量的內(nèi)積運算,在上述式子中,xi被看成為一個列向量,因此
((m*n)*(n*m)=m*m),接著把上面的每個樣本點運算求和轉(zhuǎn)換為原始數(shù)據(jù)X(shape:d*n,d指原始數(shù)據(jù)維度,n代表原始數(shù)據(jù)的樣本數(shù)),得
接著代入?yún)f(xié)方差(用來衡量兩個隨機變量之間關系的統(tǒng)計量,通過計算變量之間的協(xié)方差矩陣,可以找到數(shù)據(jù)中最具代表性和最重要的方向(主成分))公式中得,
?若將協(xié)方差矩陣用符號表示,則優(yōu)化目標最大化投影后方差等價于,
?然后按照構建拉格朗日函數(shù),g(x)為約束條件,引入拉格朗日乘子lamda,這樣就把具有約束條件的最優(yōu)問題轉(zhuǎn)化為無約束條件的最優(yōu)化問題,對w求偏導得,
?這樣就可以看出,w是 的特征向量,lamda是對應特征向量的特征值,最大化投影后的方差,等價于
?這樣一來,要尋找的第一主成分就是使得投影方差最大的坐標軸就是最大特征值對應的特征向量。最終保留幾個維度,就按照大小順序選取前幾個最大的特征值對應的特征向量,然后把原始數(shù)據(jù)進行投影即可,比如取出前k個大的特征值對應的特征向量w1,w2,...,wk,通過以下映射將d維樣本降低到k維度,
?如此一來,新的的第j維就是xi在第j個主成分wj方向上的投影,如果通過選取最大的k個特征值對應的特征向量,將方差小的特征拋棄,使得每個d維列向量xi被映射為k維列向量xi',
和
為對應維度上的方差,那么定義降維后的信息占比如下,可以反過來通過
決定該選擇保留下多少維度:
-
k-means算法
聚類算法是一種無監(jiān)督學習的方法,用于將數(shù)據(jù)集中的對象按照特征的相似度或者距離進行分組,并且每個分組被稱為一個簇。聚類即是讓同一個簇內(nèi)的樣本相互之間更加相似,而不同的簇之間差異較大。
(了解)監(jiān)督學習則是指模型根據(jù)已知的輸入輸出關系學習一個映射函數(shù),以便于對新的數(shù)據(jù)進行預測或分類。在監(jiān)督學習中,訓練數(shù)據(jù)集包括帶有標簽的樣本數(shù)據(jù)對(樣本加標簽)。這些標簽可以是已知的正確輸出(回歸問題)或事先定義好的類別樣本(分類問題)。
K-Means算法又稱K均值算法,屬于聚類算法的一種。聚類算法就是根據(jù)相似性原則,將具有較高相似度的數(shù)據(jù)對象劃分至同一類簇,將具有較高相異度的數(shù)據(jù)對象劃分至不同類簇,簡而言之,就是把一些沒有標簽(label)的數(shù)據(jù)通過聚類算法打上標簽分為不同的組/簇。
聚類與分類的最大區(qū)別就是在于聚類屬于無監(jiān)督過程(處理事務無先驗知識),而分類過程為有監(jiān)督過程(存在有先驗知識的訓練數(shù)據(jù)集)。
最優(yōu)的劃分其實也就是最優(yōu)的中心點的位置,未來的數(shù)據(jù)求出其與不同中心點的距離實現(xiàn)對其的預測。?
對于預測問題,大體流程如圖1所示,

?對于聚類算法,大體的流程如圖2所示,

?為什么要叫KMeans?因為K代表著最終的簇數(shù)量,或者說目標簇數(shù)量,需要手動設置,是一個超參數(shù)。Means是因為算法過程中需要計算平均值,下面描述一下KMeans的流程,
隨機初始化簇中心點個數(shù)K
輸入:樣本
輸出:樣本所屬簇
// 當樣本分配到K個簇不再變化時end
While(樣本的分配發(fā)生改變)for i=1,2,...,N then do樣本被分配到距離其最近的中心點根據(jù)當前每個簇中的樣本更新K個簇中心點:采用平均值計算end
end
-
決策樹
決策樹是一種有監(jiān)督學習,有明確的標簽用于劃分樹的分支,符合直覺且非常直觀,非葉子節(jié)點均為決策節(jié)點,每個葉子節(jié)點對應的標簽即為對應的樣本的預測值。需要知道回歸與分類問題的區(qū)別,回歸針對于連續(xù)問題,分類針對于離散問題。
特點:
決策樹可以處理非線性問題,可解釋性強(無seta參數(shù)),模型簡單且預測效率高;不容易顯示的使用函數(shù)表達,不可微XGBoost。
對于一個好的模型對一個數(shù)據(jù)集進行分類,希望得到以下兩種分割方式中的哪一種?當然是分割方式2,它可以保證分割后的兩個類別中,分錯的類別占比很低,下面介紹一下決策樹的流程。
?遞歸解釋:
上圖中的b(x)=c就相當于是對應的走的子樹的所在路徑的值,一般為0或1,即走哪條路徑哪條路徑對應的值就為1。
算法描述(遞歸):
一共有n條樣本,gt(x)表示第t個節(jié)點所對應的分值,如果節(jié)點不允許再繼續(xù)分裂,即當前到達葉子節(jié)點,返回gt(x)。否則,學習分裂的條件,使得節(jié)點能不斷向下分裂(就是把數(shù)據(jù)集進行劃分),然后把分割后的數(shù)據(jù)(遞歸調(diào)用)分別重新傳入DecisionTree(),構造子樹,如果條件判定b(x)也不可再構造出來,構造子樹結束。最后需要返回Gc(x)的加權和。
四個選擇會導致決策樹的形狀并不唯一:分支數(shù)量、分裂的條件(用于切分數(shù)據(jù)集)、分支終止條件、基礎假設(子樹的葉子結點的分值如何計算,G(x))。
-
隨機森林(集成學習方法)
集成學習是指通過結合多個基礎學習器的預測結果提高整體的預測性能,旨在利用多個模型的優(yōu)勢彌補單個模型的缺點(組合多個弱學習器構建一個強學習器)。
- Bagging(自舉匯聚法):通過在原始數(shù)據(jù)集上進行有放回抽樣,生成多個子數(shù)據(jù)集,然后分別訓練單獨的基礎學習器,將他們的結果進行組合。隨機森林就是這種思想。
- Boosting(提升法):依次訓練一系列基礎學習器,每個學習器都試圖修正前一個學習器的錯誤,最終將它們的預測結果進行加權組合。
如下圖所示,從分類的角度分析(直觀敘述),每個決策樹都是一個分類器,對于一個輸入樣本,每棵樹都會給出一個分類結果,而隨機森林就是集成所有投票結果,根據(jù)少數(shù)服從多數(shù)的原則(使多數(shù)靠譜糾正少數(shù)不靠譜)選出最終的類別,這就是一種簡單的隨機森林(Bagging思想)。
有不同的樹構成,每棵樹的訓練都相互獨立,各自學習,可以實現(xiàn)并行,效率很高。
6、預測題案例
可以利用任意一個編程語言,或者偽代碼,實現(xiàn)對樹的定義(主要這里樹的定義要根據(jù)你測量結果或者預測一棵樹的樣子來定義) 在圖片中說明變量代表的含義,并通過代碼實現(xiàn)對原始圖片的數(shù)據(jù)分析,最終實現(xiàn)根據(jù)求出的關系比例來得到你預測樹的結果。
import random
class Tree:def __init__(self, height, diameter, leaf_area):self.height = height # 樹高self.diameter = diameter # 樹徑樹干直徑self.leaf_area = leaf_area # 葉面積def calculate_ratios(self):"""1、通過繪制樣本數(shù)據(jù)固定某一屬性為x軸導入matplotlib使用scatter繪制各個屬性的散點圖,分析為線性還是非線性關系2、或者是使用相關性分析通過結果值判斷各個屬性的相關性。3、假設經(jīng)分析后,高與直徑之間存在線性關系,葉面積與高之間存在線性關系,求解比例關系如下。"""# 數(shù)據(jù)分析部分,假設通過求高徑比,葉面積與高的比,進行預測height_to_diameter_ratio = self.height/self.diameter if self.diameter != 0 else 0leaf_area_to_height_ratio = self.leaf_area/self.height if self.height != 0 else 0return height_to_diameter_ratio, leaf_area_to_height_ratiodef predict_tree(height_to_diameter_ratio, leaf_area_to_height_ratio):# 基于高徑比預測直徑predicted_diameter = random.uniform(0.5, 2) * height_to_diameter_ratio# 基于葉面積與樹高比例預測葉面積predicted_leaf_area = random.uniform(10, 100) * leaf_area_to_height_ratioreturn predicted_diameter, predicted_leaf_area# 樣本數(shù)據(jù)
trees = [Tree(10, 1, 50), # 樹高 10, 樹徑 1, 葉面積 50Tree(12, 1.2, 60), # 樹高 12, 樹徑 1.2, 葉面積 60Tree(9, 0.8, 40) # 樹高 9, 樹徑 0.8, 葉面積 40
]for tree in trees:height_to_diameter_ratio, leaf_area_to_height_ratio = tree.calculate_ratios()print("樹木信息:")print("樹高:", tree.height)print("樹徑:", tree.diameter)print("葉面積:", tree.leaf_area)print("高徑比:", height_to_diameter_ratio)print("葉面積與樹高比例:", leaf_area_to_height_ratio)# 預測新樹木的屬性predicted_diameter, predicted_leaf_area = predict_tree(height_to_diameter_ratio, leaf_area_to_height_ratio)print("預測的樹徑:", predicted_diameter)print("預測的葉面積:", predicted_leaf_area)print("\n")
class Tree:def __init__(self, height, crown_diameter, trunk_diameter):self.height = height # 樹的高度self.crown_diameter = crown_diameter # 樹冠直徑self.trunk_diameter = trunk_diameter # 樹干直徑def analyze_tree_image(image):# 使用圖像處理和計算機視覺算法提取樹的相關參數(shù)height = measure_height(image) # 測量樹的高度crown_diameter = measure_crown_diameter(image) # 測量樹冠直徑trunk_diameter = measure_trunk_diameter(image) # 測量樹干直徑return Tree(height, crown_diameter, trunk_diameter)def predict_tree(tree):# 根據(jù)測量結果和定義的樹的結構,進行預測predicted_height = tree.height * scale_factor_height # 預測樹的高度predicted_crown_diameter = tree.crown_diameter * scale_factor_crown_diameter # 預測樹冠直徑predicted_trunk_diameter = tree.trunk_diameter * scale_factor_trunk_diameter # 預測樹干直徑return Tree(predicted_height, predicted_crown_diameter, predicted_trunk_diameter)
7、2d和3d問題
- 2d(二維):指平面上的形狀或?qū)ο?#xff0c;具有兩個坐標軸,通常為水平軸和垂直軸,在二維空間中物體只有長度和寬度兩個方向的尺寸,例如平面圖和照片等都是二維的。
- 3d(三維):指具有三個坐標軸的空間,通常為長度、寬度和高度三個方向的尺寸,可以從各個角度觀察,例如實物體、建筑物、立體圖形等。
問題描述:考慮光照,是否穿過方格,是不是球體,由3d到2d都可以應該怎么做?
- 光照影響:考慮光照時,可以使用陰影和高光來呈現(xiàn)3D物體在2D平面上的視覺效果。這可以通過計算每個表面的光照情況,并相應地調(diào)整其在2D表示中的亮度和顏色來實現(xiàn)。
- 是否穿過方格:如果物體在3D空間中與方格相交,需要確定交點并將其投影到2D平面上。這可以通過計算光線與物體的相交點,然后將其映射到2D平面上的對應位置來實現(xiàn)。
- 形狀是否為球體:如果物體的形狀為球體,則可以使用球體的投影公式將其投影到2D平面上。這可以通過計算球體與投影平面的交點來確定投影位置,并考慮球體的曲面特性來確定投影的形狀和大小。
function convert3DTo2D(object3D, lightSource, grid, isSphere):result2D = empty 2D arrayfor each point in object3D:# 光照影響brightness = calculateBrightness(point, lightSource)# 是否穿過方格if intersectsGrid(point, grid):adjustPointPosition(point, grid)# 形狀是否為球體if isSphere:projectedPoint = projectSphereTo2D(point)else:projectedPoint = projectPointTo2D(point)# 在2D數(shù)組中記錄點的亮度result2D[projectedPoint.x][projectedPoint.y] = brightnessreturn result2D# 計算點的亮度
function calculateBrightness(point, lightSource):# 根據(jù)光照方向和點的法向量計算亮度# 這里可以使用光照模型(如Phong光照模型)進行計算# 判斷點是否與方格相交
function intersectsGrid(point, grid):# 判斷點是否與方格相交的邏輯# 調(diào)整點的位置,確保不穿過方格
function adjustPointPosition(point, grid):# 調(diào)整點的位置,確保不穿過方格的邏輯# 將點投影到2D平面上
function projectPointTo2D(point):# 使用投影方法將點投影到2D平面上# 將球體投影到2D平面上
function projectSphereTo2D(point):# 使用球體投影公式將點投影到2D平面上
function isLightPassingThrough(grid, sphere_radius, light_position, grid_position):// 3D空間到2D投影,假設光源位于 (0, 0, 0)light_x = light_position.xlight_y = light_position.ylight_z = light_position.zgrid_x = grid_position.xgrid_y = grid_position.ygrid_z = grid_position.z// 確定光線是否經(jīng)過方格的投影if (light_x == grid_x && light_y == grid_y):// 光源與方格在同一平面,無法穿過方格return falseelse if (light_x == grid_x):// 光線平行于 YZ 平面,檢查 YZ 投影是否相交if (abs(light_y - grid_y) <= sphere_radius && abs(light_z - grid_z) <= sphere_radius):return trueelsereturn falseelse if (light_y == grid_y):// 光線平行于 XZ 平面,檢查 XZ 投影是否相交if (abs(light_x - grid_x) <= sphere_radius && abs(light_z - grid_z) <= sphere_radius):return trueelsereturn falseelse if (light_z == grid_z):// 光線平行于 XY 平面,檢查 XY 投影是否相交if (abs(light_x - grid_x) <= sphere_radius && abs(light_y - grid_y) <= sphere_radius):return trueelsereturn falseelse {// 光線不平行于任何平面,計算光線是否穿過方格// 利用球體方程 (x - light_x)^2 + (y - light_y)^2 + (z - light_z)^2 <= sphere_radius^2// 在 XY 平面上的方程a = 1b = 1c = 0d = -sphere_radius^2// 計算方格的四個頂點vertices = [(grid_x - 0.5, grid_y - 0.5),(grid_x + 0.5, grid_y - 0.5),(grid_x + 0.5, grid_y + 0.5),(grid_x - 0.5, grid_y + 0.5)]// 檢查光線是否穿過方格的投影for each vertex in vertices {if (a * vertex.x + b * vertex.y + c * light_z + d >= 0) {return true}}return false}end function