當前位置:首頁 » 操作系統 » 圖的演算法k

圖的演算法k

發布時間: 2022-09-10 13:03:34

A. 如圖是一個演算法流程圖,則輸出的k=________

5

B. k-means聚類演算法怎麼提取圖像特徵

一,K-Means聚類演算法原理
k-means 演算法接受參數 k
;然後將事先輸入的n個數據對象劃分為
k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。聚類相似度是利用各聚類中對象的均值所獲得一個「中心對
象」(引力中心)來進行計算的。
K-means演算法是最為經典的基於劃分的聚類方法,是十大經典數據挖掘演算法之一。K-means演算法的基本思想是:以空間中k個點為中心進行聚類,對最靠近他們的對象歸類。通過迭代的方法,逐次更新各聚類中心的值,直至得到最好的聚類結果。
假設要把樣本集分為c個類別,演算法描述如下:
(1)適當選擇c個類的初始中心;
(2)在第k次迭代中,對任意一個樣本,求其到c個中心的距離,將該樣本歸到距離最短的中心所在的類;
(3)利用均值等方法更新該類的中心值;
(4)對於所有的c個聚類中心,如果利用(2)(3)的迭代法更新後,值保持不變,則迭代結束,否則繼續迭代。
該演算法的最大優勢在於簡潔和快速。演算法的關鍵在於初始中心的選擇和距離公式。

C. 股票中日K和月K線圖下面都有MACD圖,演算法是怎樣的呢

樓主聰明,理解正確!

D. k近鄰演算法的案例介紹

如 上圖所示,有兩類不同的樣本數據,分別用藍色的小正方形和紅色的小三角形表示,而圖正中間的那個綠色的圓所標示的數據則是待分類的數據。也就是說,現在, 我們不知道中間那個綠色的數據是從屬於哪一類(藍色小正方形or紅色小三角形),下面,我們就要解決這個問題:給這個綠色的圓分類。我們常說,物以類聚,人以群分,判別一個人是一個什麼樣品質特徵的人,常常可以從他/她身邊的朋友入手,所謂觀其友,而識其人。我們不是要判別上圖中那個綠色的圓是屬於哪一類數據么,好說,從它的鄰居下手。但一次性看多少個鄰居呢?從上圖中,你還能看到:
如果K=3,綠色圓點的最近的3個鄰居是2個紅色小三角形和1個藍色小正方形,少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於紅色的三角形一類。 如果K=5,綠色圓點的最近的5個鄰居是2個紅色三角形和3個藍色的正方形,還是少數從屬於多數,基於統計的方法,判定綠色的這個待分類點屬於藍色的正方形一類。 於此我們看到,當無法判定當前待分類點是從屬於已知分類中的哪一類時,我們可以依據統計學的理論看它所處的位置特徵,衡量它周圍鄰居的權重,而把它歸為(或分配)到權重更大的那一類。這就是K近鄰演算法的核心思想。
KNN演算法中,所選擇的鄰居都是已經正確分類的對象。該方法在定類決策上只依據最鄰近的一個或者幾個樣本的類別來決定待分樣本所屬的類別。
KNN 演算法本身簡單有效,它是一種 lazy-learning 演算法,分類器不需要使用訓練集進行訓練,訓練時間復雜度為0。KNN 分類的計算復雜度和訓練集中的文檔數目成正比,也就是說,如果訓練集中文檔總數為 n,那麼 KNN 的分類時間復雜度為O(n)。
KNN方法雖然從原理上也依賴於極限定理,但在類別決策時,只與極少量的相鄰樣本有關。由於KNN方法主要靠周圍有限的鄰近的樣本,而不是靠判別類域的方法來確定所屬類別的,因此對於類域的交叉或重疊較多的待分樣本集來說,KNN方法較其他方法更為適合。
K 近鄰演算法使用的模型實際上對應於對特徵空間的劃分。K 值的選擇,距離度量和分類決策規則是該演算法的三個基本要素: K 值的選擇會對演算法的結果產生重大影響。K值較小意味著只有與輸入實例較近的訓練實例才會對預測結果起作用,但容易發生過擬合;如果 K 值較大,優點是可以減少學習的估計誤差,但缺點是學習的近似誤差增大,這時與輸入實例較遠的訓練實例也會對預測起作用,是預測發生錯誤。在實際應用中,K 值一般選擇一個較小的數值,通常採用交叉驗證的方法來選擇最優的 K 值。隨著訓練實例數目趨向於無窮和 K=1 時,誤差率不會超過貝葉斯誤差率的2倍,如果K也趨向於無窮,則誤差率趨向於貝葉斯誤差率。 該演算法中的分類決策規則往往是多數表決,即由輸入實例的 K 個最臨近的訓練實例中的多數類決定輸入實例的類別 距離度量一般採用 Lp 距離,當p=2時,即為歐氏距離,在度量之前,應該將每個屬性的值規范化,這樣有助於防止具有較大初始值域的屬性比具有較小初始值域的屬性的權重過大。 KNN演算法不僅可以用於分類,還可以用於回歸。通過找出一個樣本的k個最近鄰居,將這些鄰居的屬性的平均值賦給該樣本,就可以得到該樣本的屬性。更有用的方法是將不同距離的鄰居對該樣本產生的影響給予不同的權值(weight),如權值與距離成反比。該演算法在分類時有個主要的不足是,當樣本不平衡時,如一個類的樣本容量很大,而其他類樣本容量很小時,有可能導致當輸入一個新樣本時,該樣本的K個鄰居中大容量類的樣本佔多數。 該演算法只計算「最近的」鄰居樣本,某一類的樣本數量很大,那麼或者這類樣本並不接近目標樣本,或者這類樣本很靠近目標樣本。無論怎樣,數量並不能影響運行結果。可以採用權值的方法(和該樣本距離小的鄰居權值大)來改進。
該方法的另一個不足之處是計算量較大,因為對每一個待分類的文本都要計算它到全體已知樣本的距離,才能求得它的K個最近鄰點。目前常用的解決方法是事先對已知樣本點進行剪輯,事先去除對分類作用不大的樣本。該演算法比較適用於樣本容量比較大的類域的自動分類,而那些樣本容量較小的類域採用這種演算法比較容易產生誤分。
實現 K 近鄰演算法時,主要考慮的問題是如何對訓練數據進行快速 K 近鄰搜索,這在特徵空間維數大及訓練數據容量大時非常必要。

E. 圖是一個演算法流程圖,則輸出的k的值是______

1-5+4=0>0,不滿足判斷框.則k=2,22-10+4=-2>0,不滿足判斷框的條件,
則k=3,32-15+4=-2>0,不成立,則k=4,42-20+4=0>0,不成立,則k=5,52-25+4=4>0,成立,
所以結束循環,
輸出k=5.
故答案為:5.

F. 下圖是一個演算法流程圖,則輸出的k的值是

5。

G. 右圖是一個演算法的流程圖,最後輸出的k=______

首先給循環變數k和累加變數S賦值1和0,
判斷0<20,執行S=0+1=1,k=1+2=3;
判斷1<20,執行S=1+3=4,k=3+2=5;
判斷4<20,執行S=4+5=9,k=5+2=7;
判斷9<20,執行S=9+7=16,K=7+2=9;
判斷16<20,執行S=16+9=25,k=9+2=11;
判斷25>20,輸出k的值為11,演算法結束.
故答案為11.

H. K近鄰演算法的理論基礎

  從理論基礎、手寫數字識別演算法、手寫數字識別實例等角度介紹K近鄰演算法。

   K近鄰演算法的本質是將指定對象根據已知特徵值分類。
  例如,看到一對父子,一般情況下,通過判斷他們的年齡,能夠馬上分辨出哪位是父親,哪位是兒子。這是通過年齡屬性的特徵值來劃分的。

  上述例子是最簡單的根據單個特徵維度做的分類,在實際場景中,情況可能更復雜,有多個特徵維度。
  例如,為一段運動視頻分類,判斷這段視頻是乒乓球比賽還是足球比賽。

  為了確定分類,需要定義特徵。這里定義兩個特徵,一個是運動員「揮手」的動作,另一個是運動員「踢腳」的動作。當然,我們不能一看到「揮手」動作就將視頻歸類為「乒乓球比賽」,因為我們知道某些足球運動員習慣在運動場上通過揮手來跟隊友進行交流。同樣,我們也不能一看到「踢腳」動作就將視頻歸類為「足球比賽」,因為有些乒乓球運動員會通過「踢腳」動作來表達自己的感情。

  我們分別統計在某段特定時間內,視頻中「揮手」和「踢腳」動作的次數,發現如下規律:
● 在乒乓球比賽的視頻中,「揮手」的次數遠多於「踢腳」的次數。
● 在足球比賽的視頻中,「踢腳」的次數遠多於「揮手」的次數。

根據對一組視頻的分析,得到如表20-1所示的數據。

為了方便觀察,將上述數據繪制為散點圖,如圖20-1所示。

從圖20-1中可以看到,數據點呈現聚集特徵:
● 乒乓球比賽視頻中的數據點聚集在x軸坐標為[3000, 5000], y軸坐標為[1,500]的區域。
● 足球比賽視頻中的數據點聚集在y軸坐標為[3000, 5000], x軸坐標為[1,500]的區域。

  此時,有一個視頻Test,經過統計得知其中出現2000次「揮手」動作,100次「踢腳」動作。如果在圖20-1中標注其位置,可以發現視頻Test的位置最近的鄰居是乒乓球比賽視頻,因此可判斷該視頻是乒乓球比賽視頻。

  上面的例子是一個比較極端的例子,非黑即白,而實際的分類數據中往往參數非常多,判斷起來也不會如此簡單。因此,為了提高演算法的可靠性,在實施時會取k個近鄰點,這k個點中屬於哪一類的較多,然後將當前待識別點劃分為哪一類。為了方便判斷,k值通常取奇數,這和為了能得到明確的投票結果通常將董事會成員安排為奇數的道理是一樣的。

  例如,已知某知名雙胞胎藝人A和B長得很像,如果要判斷一張圖像T上的人物到底是藝人A還是藝人B,則採用K近鄰演算法實現的具體步驟如下:

以上所述就是K近鄰演算法的基本思想。

I. 農夫過河的圖演算法

#include<iostream>

using namespace std;

#define VertexNum 16 //最大頂點數

typedef struct // 圖的頂點
{
int farmer; // 農夫
int wolf; // 狼
int sheep; // 羊
int veget; // 白菜
}Vertex;

typedef struct
{
int vertexNum; // 圖的當前頂點數
Vertex vertex[VertexNum]; // 頂點向量(代表頂點)
bool Edge[VertexNum][VertexNum]; // 鄰接矩陣. 用於存儲圖中的邊,其矩陣元素個數取決於頂點個數,與邊數無關
}AdjGraph; // 定義圖的鄰接矩陣存儲結構

bool visited[VertexNum] = {false}; // 對已訪問的頂點進行標記(圖的遍歷)
int retPath[VertexNum] = {-1}; // 保存DFS搜索到的路徑,即與某頂點到下一頂點的路徑

// 查找頂點(F,W,S,V)在頂點向量中的位置
int locate(AdjGraph *graph, int farmer, int wolf, int sheep, int veget)
{
// 從0開始查找
for (int i = 0; i < graph->vertexNum; i++)
{
if ( graph->vertex[i].farmer == farmer && graph->vertex[i].wolf == wolf
&& graph->vertex[i].sheep == sheep && graph->vertex[i].veget == veget )
{
return i; //返回當前位置
}
}

return -1; //沒有找到此頂點
}

// 判斷目前的(F,W,S,V)是否安全
bool isSafe(int farmer, int wolf, int sheep, int veget)
{
//當農夫與羊不在一起時,狼與羊或羊與白菜在一起是不安全的
if ( farmer != sheep && (wolf == sheep || sheep == veget) )
{
return false;
}
else
{
return true; // 安全返回true
}
}

// 判斷狀態i與狀態j之間是否可轉換
bool isConnect(AdjGraph *graph, int i, int j)
{
int k = 0;

if (graph->vertex[i].wolf != graph->vertex[j].wolf)
{
k++;
}

if (graph->vertex[i].sheep != graph->vertex[j].sheep)
{
k++;
}

if (graph->vertex[i].veget != graph->vertex[j].veget)
{
k++;
}

// 以上三個條件不同時滿足兩個且農夫狀態改變時,返回真, 也即農夫每次只能帶一件東西過橋
if (graph->vertex[i].farmer != graph->vertex[j].farmer && k <= 1)
{
return true;
}
else
{
return false;
}
}

// 創建連接圖
void CreateG(AdjGraph *graph)
{
int i = 0;
int j = 0;

// 生成所有安全的圖的頂點
for (int farmer = 0; farmer <= 1; farmer++)
{
for (int wolf = 0; wolf <= 1; wolf++)
{
for (int sheep = 0; sheep <= 1; sheep++)
{
for (int veget = 0; veget <= 1; veget++)
{
if (isSafe(farmer, wolf, sheep, veget))
{
graph->vertex[i].farmer = farmer;
graph->vertex[i].wolf = wolf;
graph->vertex[i].sheep = sheep;
graph->vertex[i].veget = veget;
i++;
}
}
}
}
}

// 鄰接矩陣初始化即建立鄰接矩陣
graph->vertexNum = i;
for (i = 0; i < graph->vertexNum; i++)
{
for (j = 0; j < graph->vertexNum; j++)
{
// 狀態i與狀態j之間可轉化,初始化為1,否則為0
if (isConnect(graph, i, j))
{
graph->Edge[i][j] = graph->Edge[j][i] = true;
}
else
{
graph->Edge[i][j] = graph->Edge[j][i] = false;
}
}
}

return;
}

// 判斷在河的那一邊
char* judgement(int state)
{
return ( (0 == state) ? "左岸" : "右岸" );
}

// 輸出從u到v的簡單路徑,即頂點序列中不重復出現的路徑
void printPath(AdjGraph *graph, int start, int end)
{
int i = start;

cout << "farmer" << ", wolf" << ", sheep" << ", veget" << endl;

while (i != end)
{
cout << "(" << judgement(graph->vertex[i].farmer) << ", " << judgement(graph->vertex[i].wolf)
<< ", " << judgement(graph->vertex[i].sheep) << ", " << judgement(graph->vertex[i].veget) << ")";
cout << endl;

i = retPath[i];
}

cout << "(" << judgement(graph->vertex[i].farmer) << ", " << judgement(graph->vertex[i].wolf)
<< ", " << judgement(graph->vertex[i].sheep) << ", " << judgement(graph->vertex[i].veget) << ")";
cout << endl;
}

// 深度優先搜索從u到v的簡單路徑 //DFS--Depth First Search
void dfsPath(AdjGraph *graph, int start, int end)
{
int i = 0;
visited[start] = true; //標記已訪問過的頂點

if (start == end)
{
return ;
}

for (i = 0; i < graph->vertexNum; i++)
{
if (graph->Edge[start][i] && !visited[i])
{
retPath[start] = i;
dfsPath(graph, i, end);
}
}
}

int main()
{
AdjGraph graph;
CreateG(&graph);

int start = locate(&graph, 0, 0, 0, 0);
int end = locate(&graph, 1, 1, 1, 1);
dfsPath(&graph, start, end);

if (visited[end]) // 有結果
{
printPath(&graph, start, end);
return 0;
}

return -1;
}

熱點內容
app什麼情況下找不到伺服器 發布:2025-05-12 15:46:25 瀏覽:714
php跳過if 發布:2025-05-12 15:34:29 瀏覽:467
不定時演算法 發布:2025-05-12 15:30:16 瀏覽:131
c語言延時1ms程序 發布:2025-05-12 15:01:30 瀏覽:166
動物園靈長類動物配置什麼植物 發布:2025-05-12 14:49:59 瀏覽:737
wifi密碼設置什麼好 發布:2025-05-12 14:49:17 瀏覽:150
三位數乘兩位數速演算法 發布:2025-05-12 13:05:48 瀏覽:399
暴風影音緩存在哪裡 發布:2025-05-12 12:42:03 瀏覽:545
access資料庫exe 發布:2025-05-12 12:39:04 瀏覽:632
五開的配置是什麼 發布:2025-05-12 12:36:37 瀏覽:367