當前位置:首頁 » 操作系統 » 零弦演算法

零弦演算法

發布時間: 2022-11-26 09:32:53

Ⅰ COS函數的計算方法

用具體的三角形來計算COS,實際上,VB的COS函數只需要輸入角度,是沒有3邊的參數的。

對於由角度計算餘弦演算法見圖,在實際實現時確定精度即可。

(1)零弦演算法擴展閱讀:

在三角形中說明。在直角三角形ABC中∠C=90°,則AB叫做斜邊,AC叫做∠A的鄰邊,BC叫做∠A的對邊。那麼若∠A的度數確定,這些邊的比就確定。於是:(1)零弦演算法擴展閱讀

∠A的對邊與斜邊的比叫做∠A的正弦,記sinA. 即sinA=BC/AB。

∠A的鄰邊與斜邊的比叫做∠A的餘弦,記cosA. 即cosA=AC/AB。

∠A的對邊與鄰邊的比叫做∠A的正切,記tanA. 即tanA=BC/AC。

∠A的鄰邊與對邊的比叫做∠A的餘切,記cotanA. 即cotanA=AC/BC。

Ⅱ 吉他1是三品五弦,2是五品五弦,3是二品四弦,5是五品四弦,6,7怎麼彈奏謝謝啦

最細的弦是1弦,最粗的是6弦,依此類推 1為六弦八品或五弦三品 2為五弦五品或四弦零品(空弦) 3為五弦七品或四弦二品 4為五弦八品或四弦三品 5為四弦五品或三弦零品(空弦) 6為四弦七品或三弦二品 7為三弦四品或二弦零品(空弦) 一弦空弦為低音3 二弦空弦為低音6 三弦空弦為2 四弦空弦為5 五弦空弦為7 六弦空弦為高音3 在吉他上每相鄰的兩個品是半音關系。比如一品到二品是半音,十二品到十三品也是半音,那麼一品到三品之間就是全音,零品(空弦)到二品也是全音。由此可以推出每根弦後面品位上音節的位置 .

Ⅲ 哪個是0弦

六線譜上的數字0,代表這根弦,左手不按,就是空弦的意思

c語言演算法

#include "stdio.h"
int f0(int n);
void main()
{
int i,count=0;
for(i=100;i<=200;i++)
if(f0(i))count++;
printf("%d",count);
}

int f0(int n)
{
int i,j;
for(i=1;i<n*n;i++)
for(j=1;j<(n*n-i*i);j++)
if(((i*i+j*j)==n*n))
return(1);
return(0);
}
你把if((i+j)*(i+j)==(n*n-2*i*j))
改成if((i+j)*(i+j)==(n*n+2*i*j))就行了,編程就是要細心

Ⅳ Kmeans聚類演算法簡介

由於具有出色的速度和良好的可擴展性,Kmeans聚類演算法算得上是最著名的聚類方法。Kmeans演算法是一個重復移動類中心點的過程,把類的中心點,也稱重心(centroids),移動到其包含成員的平均位置,然後重新劃分其內部成員。k是演算法計算出的超參數,表示類的數量;Kmeans可以自動分配樣本到不同的類,但是不能決定究竟要分幾個類。k必須是一個比訓練集樣本數小的正整數。有時,類的數量是由問題內容指定的。例如,一個鞋廠有三種新款式,它想知道每種新款式都有哪些潛在客戶,於是它調研客戶,然後從數據里找出三類。也有一些問題沒有指定聚類的數量,最優的聚類數量是不確定的。後面我將會詳細介紹一些方法來估計最優聚類數量。

Kmeans的參數是類的重心位置和其內部觀測值的位置。與廣義線性模型和決策樹類似,Kmeans參數的最優解也是以成本函數最小化為目標。Kmeans成本函數公式如下:

μiμi是第kk個類的重心位置。成本函數是各個類畸變程度(distortions)之和。每個類的畸變程度等於該類重心與其內部成員位置距離的平方和。若類內部的成員彼此間越緊湊則類的畸變程度越小,反之,若類內部的成員彼此間越分散則類的畸變程度越大。求解成本函數最小化的參數就是一個重復配置每個類包含的觀測值,並不斷移動類重心的過程。首先,類的重心是隨機確定的位置。實際上,重心位置等於隨機選擇的觀測值的位置。每次迭代的時候,Kmeans會把觀測值分配到離它們最近的類,然後把重心移動到該類全部成員位置的平均值那裡。

2.1 根據問題內容確定

這種方法就不多講了,文章開篇就舉了一個例子。

2.2 肘部法則

如果問題中沒有指定kk的值,可以通過肘部法則這一技術來估計聚類數量。肘部法則會把不同kk值的成本函數值畫出來。隨著kk值的增大,平均畸變程度會減小;每個類包含的樣本數會減少,於是樣本離其重心會更近。但是,隨著kk值繼續增大,平均畸變程度的改善效果會不斷減低。kk值增大過程中,畸變程度的改善效果下降幅度最大的位置對應的kk值就是肘部。為了讓讀者看的更加明白,下面讓我們通過一張圖用肘部法則來確定最佳的kk值。下圖數據明顯可分成兩類:

從圖中可以看出,k值從1到2時,平均畸變程度變化最大。超過2以後,平均畸變程度變化顯著降低。因此最佳的k是2。

2.3 與層次聚類結合

經常會產生較好的聚類結果的一個有趣策略是,首先採用層次凝聚演算法決定結果粗的數目,並找到一個初始聚類,然後用迭代重定位來改進該聚類。

2.4 穩定性方法

穩定性方法對一個數據集進行2次重采樣產生2個數據子集,再用相同的聚類演算法對2個數據子集進行聚類,產生2個具有kk個聚類的聚類結果,計算2個聚類結果的相似度的分布情況。2個聚類結果具有高的相似度說明kk個聚類反映了穩定的聚類結構,其相似度可以用來估計聚類個數。採用次方法試探多個kk,找到合適的k值。

2.5 系統演化方法

系統演化方法將一個數據集視為偽熱力學系統,當數據集被劃分為kk個聚類時稱系統處於狀態kk。系統由初始狀態k=1k=1出發,經過分裂過程和合並過程,系統將演化到它的穩定平衡狀態 kiki ,其所對應的聚類結構決定了最優類數 kiki 。系統演化方法能提供關於所有聚類之間的相對邊界距離或可分程度,它適用於明顯分離的聚類結構和輕微重疊的聚類結構。

2.6 使用canopy演算法進行初始劃分

基於Canopy Method的聚類演算法將聚類過程分為兩個階段

(1) 聚類最耗費計算的地方是計算對象相似性的時候,Canopy Method在第一階段選擇簡單、計算代價較低的方法計算對象相似性,將相似的對象放在一個子集中,這個子集被叫做Canopy,通過一系列計算得到若干Canopy,Canopy之間可以是重疊的,但不會存在某個對象不屬於任何Canopy的情況,可以把這一階段看做數據預處理;

(2) 在各個Canopy內使用傳統的聚類方法(如Kmeans),不屬於同一Canopy的對象之間不進行相似性計算。

從這個方法起碼可以看出兩點好處:首先,Canopy不要太大且Canopy之間重疊的不要太多的話會大大減少後續需要計算相似性的對象的個數;其次,類似於Kmeans這樣的聚類方法是需要人為指出K的值的,通過(1)得到的Canopy個數完全可以作為這個k值,一定程度上減少了選擇k的盲目性。

其他方法如貝葉斯信息准則方法(BIC)可參看文獻[4]。

選擇適當的初始質心是基本kmeans演算法的關鍵步驟。常見的方法是隨機的選取初始中心,但是這樣簇的質量常常很差。處理選取初始質心問題的一種常用技術是:多次運行,每次使用一組不同的隨機初始質心,然後選取具有最小SSE(誤差的平方和)的簇集。這種策略簡單,但是效果可能不好,這取決於數據集和尋找的簇的個數。

第二種有效的方法是,取一個樣本,並使用層次聚類技術對它聚類。從層次聚類中提取kk個簇,並用這些簇的質心作為初始質心。該方法通常很有效,但僅對下列情況有效:(1)樣本相對較小,例如數百到數千(層次聚類開銷較大);(2) kk相對於樣本大小較小。

第三種選擇初始質心的方法,隨機地選擇第一個點,或取所有點的質心作為第一個點。然後,對於每個後繼初始質心,選擇離已經選取過的初始質心最遠的點。使用這種方法,確保了選擇的初始質心不僅是隨機的,而且是散開的。但是,這種方法可能選中離群點。此外,求離當前初始質心集最遠的點開銷也非常大。為了克服這個問題,通常該方法用於點樣本。由於離群點很少(多了就不是離群點了),它們多半不會在隨機樣本中出現。計算量也大幅減少。

第四種方法就是上面提到的canopy演算法。

常用的距離度量方法包括:歐幾里得距離和餘弦相似度。兩者都是評定個體間差異的大小的。

歐氏距離是最常見的距離度量,而餘弦相似度則是最常見的相似度度量,很多的距離度量和相似度度量都是基於這兩者的變形和衍生,所以下面重點比較下兩者在衡量個體差異時實現方式和應用環境上的區別。

藉助三維坐標系來看下歐氏距離和餘弦相似度的區別:

從圖上可以看出距離度量衡量的是空間各點間的絕對距離,跟各個點所在的位置坐標(即個體特徵維度的數值)直接相關;而餘弦相似度衡量的是空間向量的夾角,更加的是體現在方向上的差異,而不是位置。如果保持A點的位置不變,B點朝原方向遠離坐標軸原點,那麼這個時候餘弦相似cosθ是保持不變的,因為夾角不變,而A、B兩點的距離顯然在發生改變,這就是歐氏距離和餘弦相似度的不同之處。

根據歐氏距離和餘弦相似度各自的計算方式和衡量特徵,分別適用於不同的數據分析模型:歐氏距離能夠體現個體數值特徵的絕對差異,所以更多的用於需要從維度的數值大小中體現差異的分析,如使用用戶行為指標分析用戶價值的相似度或差異;而餘弦相似度更多的是從方向上區分差異,而對絕對的數值不敏感,更多的用於使用用戶對內容評分來區分用戶興趣的相似度和差異,同時修正了用戶間可能存在的度量標准不統一的問題(因為餘弦相似度對絕對數值不敏感)。

因為歐幾里得距離度量會受指標不同單位刻度的影響,所以一般需要先進行標准化,同時距離越大,個體間差異越大;空間向量餘弦夾角的相似度度量不會受指標刻度的影響,餘弦值落於區間[-1,1],值越大,差異越小。但是針對具體應用,什麼情況下使用歐氏距離,什麼情況下使用餘弦相似度?

從幾何意義上來說,n維向量空間的一條線段作為底邊和原點組成的三角形,其頂角大小是不確定的。也就是說對於兩條空間向量,即使兩點距離一定,他們的夾角餘弦值也可以隨意變化。感性的認識,當兩用戶評分趨勢一致時,但是評分值差距很大,餘弦相似度傾向給出更優解。舉個極端的例子,兩用戶只對兩件商品評分,向量分別為(3,3)和(5,5),這兩位用戶的認知其實是一樣的,但是歐式距離給出的解顯然沒有餘弦值合理。

我們把機器學習定義為對系統的設計和學習,通過對經驗數據的學習,將任務效果的不斷改善作為一個度量標准。Kmeans是一種非監督學習,沒有標簽和其他信息來比較聚類結果。但是,我們還是有一些指標可以評估演算法的性能。我們已經介紹過類的畸變程度的度量方法。本節為將介紹另一種聚類演算法效果評估方法稱為輪廓系數(Silhouette Coefficient)。輪廓系數是類的密集與分散程度的評價指標。它會隨著類的規模增大而增大。彼此相距很遠,本身很密集的類,其輪廓系數較大,彼此集中,本身很大的類,其輪廓系數較小。輪廓系數是通過所有樣本計算出來的,計算每個樣本分數的均值,計算公式如下:

aa是每一個類中樣本彼此距離的均值,bb是一個類中樣本與其最近的那個類的所有樣本的距離的均值。

輸入:聚類個數k,數據集XmxnXmxn。

輸出:滿足方差最小標準的k個聚類。

(1) 選擇k個初始中心點,例如c[0]=X[0] , … , c[k-1]=X[k-1];

(2) 對於X[0]….X[n],分別與c[0]…c[k-1]比較,假定與c[i]差值最少,就標記為i;

(3) 對於所有標記為i點,重新計算c[i]={ 所有標記為i的樣本的每個特徵的均值};

(4) 重復(2)(3),直到所有c[i]值的變化小於給定閾值或者達到最大迭代次數。

Kmeans的時間復雜度:O(tkmn),空間復雜度:O((m+k)n)。其中,t為迭代次數,k為簇的數目,m為樣本數,n為特徵數。

7.1 優點

(1). 演算法原理簡單。需要調節的超參數就是一個k。

(2). 由具有出色的速度和良好的可擴展性。

7.2 缺點

(1). 在 Kmeans 演算法中 kk 需要事先確定,這個 kk 值的選定有時候是比較難確定。

(2). 在 Kmeans 演算法中,首先需要初始k個聚類中心,然後以此來確定一個初始劃分,然後對初始劃分進行優化。這個初始聚類中心的選擇對聚類結果有較大的影響,一旦初始值選擇的不好,可能無法得到有效的聚類結果。多設置一些不同的初值,對比最後的運算結果,一直到結果趨於穩定結束。

(3). 該演算法需要不斷地進行樣本分類調整,不斷地計算調整後的新的聚類中心,因此當數據量非常大時,演算法的時間開銷是非常大的。

(4). 對離群點很敏感。

(5). 從數據表示角度來說,在 Kmeans 中,我們用單個點來對 cluster 進行建模,這實際上是一種最簡化的數據建模形式。這種用點來對 cluster 進行建模實際上就已經假設了各 cluster的數據是呈圓形(或者高維球形)或者方形等分布的。不能發現非凸形狀的簇。但在實際生活中,很少能有這種情況。所以在 GMM 中,使用了一種更加一般的數據表示,也就是高斯分布。

(6). 從數據先驗的角度來說,在 Kmeans 中,我們假設各個 cluster 的先驗概率是一樣的,但是各個 cluster 的數據量可能是不均勻的。舉個例子,cluster A 中包含了10000個樣本,cluster B 中只包含了100個。那麼對於一個新的樣本,在不考慮其與A cluster、 B cluster 相似度的情況,其屬於 cluster A 的概率肯定是要大於 cluster B的。

(7). 在 Kmeans 中,通常採用歐氏距離來衡量樣本與各個 cluster 的相似度。這種距離實際上假設了數據的各個維度對於相似度的衡量作用是一樣的。但在 GMM 中,相似度的衡量使用的是後驗概率 αcG(x|μc,∑c)αcG(x|μc,∑c) ,通過引入協方差矩陣,我們就可以對各維度數據的不同重要性進行建模。

(8). 在 Kmeans 中,各個樣本點只屬於與其相似度最高的那個 cluster ,這實際上是一種 hard clustering 。

針對Kmeans演算法的缺點,很多前輩提出了一些改進的演算法。例如 K-modes 演算法,實現對離散數據的快速聚類,保留了Kmeans演算法的效率同時將Kmeans的應用范圍擴大到離散數據。還有K-Prototype演算法,可以對離散與數值屬性兩種混合的數據進行聚類,在K-prototype中定義了一個對數值與離散屬性都計算的相異性度量標准。當然還有其它的一些演算法,這里我 就不一一列舉了。

Kmeans 與 GMM 更像是一種 top-down 的思想,它們首先要解決的問題是,確定 cluster 數量,也就是 k 的取值。在確定了 k 後,再來進行數據的聚類。而 hierarchical clustering 則是一種 bottom-up 的形式,先有數據,然後通過不斷選取最相似的數據進行聚類。

Ⅵ 吉他高把位和弦推演算法

根據十二個調之間的半音關系,相鄰兩個和弦之間差半音(對應在吉他上就是一個品格);
那麼,根據低把位的和弦指法就能推出高把位的;
舉個例子,比如低把位的C和弦,整體向高把位移動一個品格就得到了C#和弦,但是沒按住的空弦理應也升高一個格,因此需要用一個大橫按放在一品(就是相當於把琴頭向高位移動了一格);
那麼,以此類推,理論上所有低把位的指法都可以推算出任意位置的和弦;
但是,許多指法無法實現在按下的同時再加上大橫按;
因此,經驗規律總結出常用的、比較容易按的一些指法;
比如:大三和弦:由F和弦指法推導出的各種高把位指法;(或者由B和弦推導)(其實F和弦是由E和弦推導出來的)
小三和弦:由Bm和弦指法推倒出的高把位指法;(或者由Fm)(其實Bm是由Am推導來的)

大七和弦:由F7或者B7推導

小七和弦:由Bm7或者Fm7推導
另外:其實許多低把位的和弦可以直接按在高把位上(需要按住4-5根弦的都可以),只要不彈奏沒按住的音就可以了,比如C7和弦、A7和弦等等

給你個網址吧,和弦很全的
http://www.ijita.com/tool/chord/
純手打,望採納,不明白之處追問即可~~

Ⅶ sin30度是多少 正弦值的演算法

1、sin30度是1/2。

2、要知道正弦(sin)是數學術語,在直角三角形中,任意一銳角∠A的對邊與斜邊的比叫做∠A的正弦,記作sinA,即sinA=∠A的對邊/斜邊。sin是正弦,對邊比斜邊,0度角對應的對邊長度就是0,而90度對邊就是斜邊,所以sin90=1,所以以此類推sin30=1/2。

Ⅷ 倒角度數演算法

正弦sin =對邊除以斜邊。

餘弦COS=鄰邊除以斜邊。

正切Tan=對邊除以鄰邊

對邊=斜邊乘以正弦Sin

對邊=鄰邊乘以正切tan

鄰邊=斜邊乘以餘弦COS

鄰邊=對邊除以正切sin

斜邊=對邊除以正弦sin

斜邊=鄰邊除以餘弦cos

正弦,餘弦,正切他們都是度數。多少度換算成數字是在計算器上按多少度後在按對應的符號就出來了。正弦對應的是SiN,餘弦對應的是COS,正切對應的是tan.

例如:已知斜邊是20,角度35度,求對邊和鄰邊是多少?

解:對邊=斜邊乘以正弦sin =斜邊20乘以正弦sin度數。度數35度在計算器上35度等於0.57356,所以對邊等於20乘以0.57356等於11.471,

如果C1或者R1,那麼就是單邊,倒角是求雙邊的所以要乘以2,X軸,Z軸是不要乘

平行與Z軸的公式:錐度長度=(大端-小端)除以2在除以tan1/2a度數

平行Z軸的度數:大端=(錐度長度乘以tan1/2a乘以2)加上小端

平行Z軸的度數:小端=(大端-錐度長度乘以tan1/2a乘以2)

平行Z軸的度數:錐度長度=(大端—小端)除以2在除以tan1/2a

平行Z軸的度數:tanA度=【(大端-小端)除以2除以錐度長度】乘以2

說明:1錐度:錐度是指圓錐的底面直徑大端或小端與錐體高度之比。

2勾股定理必須有一角為90度,任何一個角都是180度

3:銳角:指大於0度而小於90度的直角

4鈍角:比90度大的角叫鈍角三角形

5:C1就是45度角,就是X2MM Z軸1MM

6:R1是圓角,就是X2MM,Z軸1MM

7:垂直於X軸的度數:(大頭-小頭)除以 2乘以度數=Z軸的長度。

垂直於X軸的度數:大端=(錐度長度乘以2)除以度數tan+小端。

垂直於X軸的度數:小端=大端-錐度長度乘以2在除以度數。

錐度:錐度

1:已知錐度1:12,小端直徑22,錐度長度50,那麼大端直徑是多少?
公式:大端=小端+錐度比乘以長度。
所以大端等於22+(1/12)乘以50=26.166

2:已知錐度a/2=4度5分8秒,小端直徑35,錐度長度70,那麼大端直徑是多少?
公式:因為已知a/2=4度5分8秒,要換算成度數後找出正切tan,因為1度等於60分,1分等於60秒。那麼8秒除以60等於0.1333分,那麼5分加上0.1333分等於5.1333分,在除以60等於0.0855度。那麼4度加上0.0855度=4.0855度,換算Tan等於0.7142。
那麼公式:大端直徑=小端直徑+(錐度長度乘以度數換算的數0.7142)乘以2。等於44.9997。

3:已知圓錐孔錐度比是1:10,錐度長30,錐度大端是24,那麼小端是多少。
公式:小端直徑=大端-錐度比乘以長度
小端=24-(1/10)乘以30=24-3=21

4:已知錐度大端19,錐度小端18,錐度長度20,那麼錐度比是多少?
公式:(大端-小端)/錐度長度。C=1:20

5:已知錐度大端50,錐度小端30,a/2錐度角9度27分44秒,求L長度。
所以9度27分44秒,那麼要把度數換算成Tan正弦算,44秒除以60等於0.733分,27分加上0.7333分等於27.733分,除以60,等於0.462度在加上9度等於9.462度,換算正弦等於0.16666。那麼他的錐度長度L=(50-30)/(2乘以0.1666)等於60。

Ⅸ 常見的相似度度量演算法




本文目錄:




  定義在兩個向量(兩個點)上:點x和點y的歐式距離為:

  常利用歐幾里得距離描述相似度時,需要取倒數歸一化,sim = 1.0/(1.0+distance),利用numpy實現如下:

python實現歐式距離

  從名字就可以猜出這種距離的計算方法了。想像你在曼哈頓要從一個十字路口開車到另外一個十字路口,駕駛距離是兩點間的直線距離嗎?顯然不是,除非你能穿越大樓。實際駕駛距離就是這個「曼哈頓距離」。而這也是曼哈頓距離名稱的來源, 曼哈頓距離也稱為城市街區距離(City Block distance)。

  (1)二維平面兩點a(x1,y1)與b(x2,y2)間的曼哈頓距離

  (2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的曼哈頓距離

   python實現曼哈頓距離:


  國際象棋玩過么?國王走一步能夠移動到相鄰的8個方格中的任意一個。那麼國王從格子(x1,y1)走到格子(x2,y2)最少需要多少步?自己走走試試。你會發現最少步數總是max( | x2-x1 | , | y2-y1 | ) 步 。有一種類似的一種距離度量方法叫切比雪夫距離。

  (1)二維平面兩點a(x1,y1)與b(x2,y2)間的切比雪夫距離

  (2)兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的切比雪夫距離

   python實現切比雪夫距離:


  閔氏距離不是一種距離,而是一組距離的定義。

  兩個n維變數a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的閔可夫斯基距離定義為:

  其中p是一個變參數。

  當p=1時,就是曼哈頓距離

  當p=2時,就是歐氏距離

  當p→∞時,就是切比雪夫距離

  根據變參數的不同,閔氏距離可以表示一類的距離。

  閔氏距離,包括曼哈頓距離、歐氏距離和切比雪夫距離都存在明顯的缺點。

  舉個例子:二維樣本(身高,體重),其中身高范圍是150 190,體重范圍是50 60,有三個樣本:a(180,50),b(190,50),c(180,60)。那麼a與b之間的閔氏距離(無論是曼哈頓距離、歐氏距離或切比雪夫距離)等於a與c之間的閔氏距離,但是身高的10cm真的等價於體重的10kg么?因此用閔氏距離來衡量這些樣本間的相似度很有問題。

  簡單說來,閔氏距離的缺點主要有兩個:

  (1)將各個分量的量綱(scale),也就是「單位」當作相同的看待了。

  (2)沒有考慮各個分量的分布(期望,方差等)可能是不同的。


  標准歐氏距離的定義

  標准化歐氏距離是針對簡單歐氏距離的缺點而作的一種改進方案。標准歐氏距離的思路:既然數據各維分量的分布不一樣,好吧!那我先將各個分量都「標准化」到均值、方差相等吧。均值和方差標准化到多少呢?這里先復習點統計學知識吧,假設樣本集X的均值(mean)為m,標准差(standard deviation)為s,那麼X的「標准化變數」表示為:

  而且標准化變數的數學期望為0,方差為1。因此樣本集的標准化過程(standardization)用公式描述就是:

  標准化後的值 = ( 標准化前的值 - 分量的均值 ) /分量的標准差

  經過簡單的推導就可以得到兩個n維向量a(x11,x12,…,x1n)與 b(x21,x22,…,x2n)間的標准化歐氏距離的公式:

  如果將方差的倒數看成是一個權重,這個公式可以看成是一種加權歐氏距離(Weighted Euclidean distance)。


  有M個樣本向量X1~Xm,協方差矩陣記為S,均值記為向量μ,則其中樣本向量X到u的馬氏距離表示為:

  而其中向量Xi與Xj之間的馬氏距離定義為:

  若協方差矩陣是單位矩陣(各個樣本向量之間獨立同分布),則公式就成了:

  也就是歐氏距離了。

  若協方差矩陣是對角矩陣,公式變成了標准化歐氏距離。

  馬氏距離的優缺點:量綱無關,排除變數之間的相關性的干擾。


  幾何中夾角餘弦可用來衡量兩個向量方向的差異,機器學習中借用這一概念來衡量樣本向量之間的差異。

  在二維空間中向量A(x1,y1)與向量B(x2,y2)的夾角餘弦公式:

  兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n)的夾角餘弦

  類似的,對於兩個n維樣本點a(x11,x12,…,x1n)和b(x21,x22,…,x2n),可以使用類似於夾角餘弦的概念來衡量它們間的相似程度。

  即:

  夾角餘弦取值范圍為[-1,1]。夾角餘弦越大表示兩個向量的夾角越小,夾角餘弦越小表示兩向量的夾角越大。當兩個向量的方向重合時夾角餘弦取最大值1,當兩個向量的方向完全相反夾角餘弦取最小值-1。

python實現餘弦相似度:


  兩個等長字元串s1與s2之間的漢明距離定義為將其中一個變為另外一個所需要作的最小替換次數。例如字元串「1111」與「1001」之間的漢明距離為2。

  應用:信息編碼(為了增強容錯性,應使得編碼間的最小漢明距離盡可能大)。

python實現漢明距離:


  兩個集合A和B的交集元素在A,B的並集中所佔的比例,稱為兩個集合的傑卡德相似系數,用符號J(A,B)表示。

  傑卡德相似系數是衡量兩個集合的相似度一種指標。

  與傑卡德相似系數相反的概念是傑卡德距離(Jaccard distance)。傑卡德距離可用如下公式表示:

  傑卡德距離用兩個集合中不同元素占所有元素的比例來衡量兩個集合的區分度。

  可將傑卡德相似系數用在衡量樣本的相似度上。

  樣本A與樣本B是兩個n維向量,而且所有維度的取值都是0或1。例如:A(0111)和B(1011)。我們將樣本看成是一個集合,1表示集合包含該元素,0表示集合不包含該元素。

  p :樣本A與B都是1的維度的個數

  q :樣本A是1,樣本B是0的維度的個數

  r :樣本A是0,樣本B是1的維度的個數

  s :樣本A與B都是0的維度的個數

  這里p+q+r可理解為A與B的並集的元素個數,而p是A與B的交集的元素個數。

  而樣本A與B的傑卡德距離表示為:


  皮爾遜相關系數即為相關系數 ( Correlation coefficient )與相關距離(Correlation distance)

  相關系數的定義

  相關系數是衡量隨機變數X與Y相關程度的一種方法,相關系數的取值范圍是[-1,1]。相關系數的絕對值越大,則表明X與Y相關度越高。當X與Y線性相關時,相關系數取值為1(正線性相關)或-1(負線性相關)。








1. 機器學習中的相似性度量

2. 推薦演算法入門(1)相似度計算方法大全

3. Python Numpy計算各類距離

4. 皮爾遜積矩相關系數

Ⅹ 音頻演算法入門-傅里葉變換

    上一篇文章中講了一個時域處理的演算法wsola,接下來會學習頻域處理演算法,在這之前必須得對頻域有所了解,這就不得不提傅里葉變換了,本文的目的是讓大家學會用傅里葉變換公式和傅里葉逆變換公式進行計算。數學公式是人們對世界中的現象的描述,我們學習數學公式也不該只停留在使用公式來解決問題的層次,得明白公式到底在描述什麼現象,從這些天才數學家的角度來看世界。懂的地方可跳過。項目地址在文章末尾給出。

   我直接說結論,傅里葉級數公式包含了傅里葉變換和傅里葉逆變換(不嚴謹的說就是這么回事)。
    先簡單說下具體關系,法國數學家傅里葉發現,任何周期函數都可以用正弦函數和餘弦函數構成的無窮級數來表示,這種表示方式就是傅里葉級數。假如有個波形比較復雜的周期函數,那麼找出能用來構成這個周期函數的正弦函數和餘弦函數的頻率的方法就叫做傅里葉變換,用這些頻率的正弦函數和餘弦函數疊加起來表示這個周期函數的方法就叫做傅里葉逆變換。
    再從公式中看下他們的關系,首先介紹傅里葉級數到底是什麼,首先級數是指將數列的項依次用加號連接起來的函數。這么說可能大家還不理解,舉個例子:e^x=1+x/1!+x^2/2!+...x^n/n!....,等號左邊是指數函數,等號右邊就是級數。傅里葉級數公式如下:

    我們主要看這個指數形式的傅里葉級數公式,把求和符號去掉,展開一下就是f(t)=Fa*e^jaω0t+Fb*e^jbω0t+Fc*e^jcω0t+Fd*e^jdω0.....。現在看下面的周期函數疊加效果圖,圖中顯示的是3個周期函數分別在坐標軸(橫軸時間,縱軸幅度)的圖像,寫成傅里葉級數形式就是f(t)=fa(t)+fb(t)+0+0....,這就是傅里葉級數公式要描述的現象。其中Fa*e^jaω0t=fa(t),Fb*e^jbω0t=fb(t),Fc*e^jcω0t=0....。

    看下圖的傅里葉變換和逆變換公式,你會發現傅里葉逆變換公式和傅里葉級數公式極其相似,而傅里葉級數系數公式Fn又和傅里葉變換公式極其相似。所以對一個周期函數進行傅里葉級數展開的過程可以認為是先做傅里葉變換再做傅里葉逆變換的過程。

    上圖就是傅里葉變換公式也叫連續傅里葉變換公式,有個很重要的事情,就是傅里葉變換公式和逆變換公式一定要一起給出,不然就會讓人誤解,你們在網上會看到各種各樣的寫法,但這些寫法都是對的,常見的如下圖所示。

    為了方便後面的講解我把角頻率ω換成2πf,如上圖所示,ω是希臘字母讀作Omega,大寫是Ω,小寫是ω,以後這兩個字母會經常看到,都是等於2πf。不要和電學中的電阻單位搞混了,要明白字母只不過是一個符號而已,在不同學科領域都是混著用的,只要不和自己公式中其他字母沖突就行,例如上圖傅里葉變換公式中的j其實就是虛數單位i,一般時候我們會把虛數單位寫成i,但因為傅立葉變換經常用於電學解決一些問題,為了不和電流符號i混淆,所以公式就把i寫成j 。
    要想了解傅里葉變換公式,首先要了解歐拉公式e^ix=cosx+isinx在圖像中的含義。以實部的值cosx作為橫坐標值,虛部sinx的值作為縱坐標值,x的取值從負無窮到正無窮,畫出所有的e^ix點後,你會發現這些點會形成一個周期為2π的圓。如下圖1所示(如果不理解,建議看3Blue1Brown的視頻,視頻連接:https://www.bilibili.com/video/BV1pW411J7s8)

    所以歐拉公式e^ix其實就是隨著x的增大而在坐標繫上逆時針畫圓的過程,那麼e^-ix就表示順時針畫圓,e^-i2πx就表示畫圓的速度提高2π倍,也就是說x從0到1的過程就是順時針畫出一個完整圓的過程(當然x從1到2或者2到3等等,都能畫出一個完整的圓),把x換成t後,e^-i2πt表示每秒都會順時針畫出一個圓。e^-i2πft表示每秒都會順時針畫出f個圓。f(t)表示t時刻的振幅,f(t)函數畫出來就是時域波形圖。f(t)*e^-i2πft表示每經過1秒會順時針畫出f個圓,並在畫圓的同時,t時刻的圓半徑要乘上t時刻的振幅,其實就是以每秒的音頻振幅數據繞f圈的速度進行旋轉纏繞(為了方便理解,沒有用復雜的音頻數據,用的是一個頻率為3的正弦波音頻做的實驗,請看下圖2,圖的上半部分是時域波形圖,圖的左下角是f等於0.4的時候,用公式f(t)*e^-i2πft在實部和虛部構成的坐標系畫的圖,圖的右下角是頻譜圖,頻譜圖的橫坐標是頻率,縱坐標是振幅,振幅的值就是左下角圖中數據形成的圖案的質心(圖中的紅點)到坐標系原點的距離的2倍)。當改變f的值,你會發現數據大多數時候是和我們想的一樣,以坐標系原點為圓心環繞著,也就是振幅一直都是0,但是當f的值,也就每秒的圈數等於該音頻數據的頻率時,你會發現一個神奇的現象,那就是所有的數據會在實部或虛部坐標軸的一側形成一個圓(如下圖3所示,如此一來就知道這段音頻數據包含了一個頻率為3振幅為0.5的正弦波)。所以將多個正弦波疊加的音頻數據用傅里葉公式,f從負無窮到正無窮遍歷一遍,就可以把這個音頻數據里包含的正弦波都一一找出來。(如果不理解,建議看3Blue1Brown的視頻,視頻連接:https://www.bilibili.com/video/BV1pW411J7s8)

    平時我們說的對音頻進行傅里葉變換處理,其實說的是短時離散傅里葉變換。短時離散傅里葉變換的公式(也可以直接叫做離散傅里葉變換公式)如下。

    下面將教大家如何理解這個公式。上面說的連續傅里葉變換公式中有兩個原因導致我們無法使用,第一點要求是音頻數據的時間從負無窮到正無窮,第二點要求是任意時間t都要有幅度值x(t)才能代入公式進行計算。所以為了解決這兩個問題,把公式變為短時且離散的傅里葉變換公式,這個公式可以把一段時間(時間假設為Ts秒)的離散音頻數據(有N個采樣數據)進行傅里葉變換。你可以把離散傅里葉變換公式理解成連續傅里葉變換的變形,最重要的一點是連續傅里葉變換公式的f和離散傅里葉變換公式的k不是一個意思,他們的關系是k=f*Ts。所以離散傅里葉變換公式也可以寫成F(f)=1/n*∑f(t)*e^-j2πf*Ts*n/N,其中的Ts*n/N對應的就是連續傅里葉變換公式的t,只不過這個t沒辦法取任意時間了,t的取值也就隨著n的取值成為了離散的時間點,所以前面的系數由1/2π變為1/N。這樣這兩個公式就對應起來了。下面將進一步詳細介紹這個公式。
    上一段說了k=f*Ts,這段我來解釋下為什麼,其實離散傅里葉變換公式中k表示的是這段Ts秒的音頻數據環繞坐標系原點的圈數,所以k並不是連續傅里葉變換公式里的頻率f,而頻率f指的是1秒鍾震盪的次數,在這個公式中頻率f也對應著1秒的音頻數據環繞的圈數,所以真正的頻率f=k/Ts。
    有人可能會好奇,那為什麼不把離散傅里葉變換公式的自變數k換成f呢,這樣不是更好理解嗎?是會更好理解,但是沒有必要,用f的話還要做一次無用的換算。因為采樣點只有N個的原因,k的取值范圍就被限制住了,k的取值范圍只能是0~N-1的整數,這也是為什麼用k來做自變數而不是用f的原因。
    還有人可能會好奇,傅里葉逆變換到底是怎麼把頻域的信息還原回時域的,其實公式計算出來的F(k)是一個復數,這個復數包含了這個頻率的周期函數的振幅和相位的信息,假設F(k)=a+ib,,F(k)的模|F(k)|=(a^2+b^2)^1/2,頻率f=k/Ts時的振幅為|F(k)|*2(因為求出來的值相當於圓心,但實際上振幅是圓離圓心最遠點到坐標原點的距離,所以要乘2),頻率f=k/Ts時的相位為arctan(b/a)。所以如果你知道一個周期函數包含了哪些頻率的周期函數,並且你這到這些周期函數的振幅和相位,你就可以像下圖一樣把fa(t)和fb(t)疊加在一起還原回f(t)。傅里葉逆變換的做法略有不同,但意思就是這么個意思,理解了離散傅里葉變換公式的計算,逆變換其實也是差不多代入數值計算就是了。(如果不理解怎麼用離散傅里葉變換公式計算,建議看視頻,視頻里有離散傅里葉變換完整的計算過程,視頻連接:https://www.hu.com/zvideo/1276595628009377792)

快速傅里葉變換推薦看下面兩個視頻
https://www.bilibili.com/video/BV1za411F76U
https://www.bilibili.com/video/BV1Jh411d7CN
下面是我用java實現的離散傅里葉變換及逆變換和快速傅里葉變換及逆變換,從他們的運行時間就可以看出來快速傅里葉變換快得多。(學完快速傅里葉變換再想想頻譜為何Y軸對稱?為何N/2對稱?)

熱點內容
g92編程 發布:2025-05-17 21:00:31 瀏覽:170
匯編語言第三版腳本之家 發布:2025-05-17 20:54:26 瀏覽:399
資源配置最佳狀態叫什麼 發布:2025-05-17 20:48:58 瀏覽:84
定義dns伺服器的ip 發布:2025-05-17 20:32:37 瀏覽:954
android判斷圖片 發布:2025-05-17 20:32:33 瀏覽:833
安卓12什麼時候適配小米 發布:2025-05-17 20:31:47 瀏覽:71
c語言字元串初始化 發布:2025-05-17 20:18:43 瀏覽:37
安卓融e聯推送需要什麼許可權 發布:2025-05-17 20:18:39 瀏覽:269
我的世界無限武魂伺服器 發布:2025-05-17 20:17:09 瀏覽:372
安卓手游腳本語言 發布:2025-05-17 19:53:07 瀏覽:22