1. 程式人生 > >第十章 k-均值演算法 10.4 對地圖上的點進行聚類

第十章 k-均值演算法 10.4 對地圖上的點進行聚類

將地圖上的點進行聚類,安排交通工具抵達這些簇的質心,然後步行到每個簇內地址。

這裡我們直接用給出的檔案進行操作,跳過10.4.1節。

新增程式碼:

def distSLC(vecA, vecB): # 返回地球表面兩點之間的距離
    a = sin(vecA[0,1] * pi / 180) * sin(vecB[0,1] * pi / 180)
    b = cos(vecA[0,1] * pi / 180) * cos(vecB[0,1] * pi / 180) * \
                        cos(pi * (vecB[0,0] - vecA[0,0]) / 180)
    return arccos(a + b) * 6371.0

import matplotlib
import matplotlib.pyplot as plt
def clusterClubs(numClust = 5): # 畫圖,引數為希望得到的簇數目
    datList = []
    for line in open('places.txt').readlines():
        lineArr = line.split('\t')
        datList.append([float(lineArr[4]), float(lineArr[3])])
    datMat = mat(datList)
    myCentroids, clustAssing = biKmeans(datMat, numClust, \
                                        distMeas = distSLC)
    fig = plt.figure()
    rect = [0.1, 0.1, 0.8, 0.8]
    scatterMarkers = ['s', 'o', '^', '8', 'p', \
                      'd', 'v', 'h', '>', '<']
    axprops = dict(xticks = [], yticks = [])
    ax0 = fig.add_axes(rect, label = 'ax0', **axprops)
    imgP = plt.imread('Portland.png') # imread 基於影象建立矩陣
    ax0.imshow(imgP)
    ax1 = fig.add_axes(rect, label = 'ax1', frameon = False)
    for i in range(numClust):
            ptsInCurrCluster = datMat[nonzero(clustAssing[:,0].A == i)[0],:]
            markerStyle = scatterMarkers[i % len(scatterMarkers)] # 使用索引來選擇標記形狀
            ax1.scatter(ptsInCurrCluster[:,0].flatten().A[0],\
                        ptsInCurrCluster[:,1].flatten().A[0],\
                        marker = markerStyle, s = 90)
    ax1.scatter(myCentroids[:,0].flatten().A[0],\
                    myCentroids[:,1].flatten().A[0], marker = '+', s = 300)
    plt.show()

執行程式碼:
import kMeans
from numpy import *

kMeans.clusterClubs(5)

得到結果:


==================================================================================

通過修改簇的數目,得到程式執行的效果。

比如4簇:


3簇:


================================================================================================

10.5 小結

聚類是一種無監督的學習方法。所謂無監督學習是指事先並不知道要尋找的內容,即沒有目標變數。聚類將資料點歸到多個簇中,其中相似資料點處於同一簇,而不相似資料點處於不同簇中。聚類中可以使用多種不同的方法計算相似度。

K-均值聚類演算法以 k 個隨機質心開始。演算法會計算每個點到質心的距離。每個點會被分配到距其最近的簇質心。然後緊接著基於新分配到簇的點更新簇質心。以上過程重複數次,直到質心不再改變。

為了得到更好地聚類效果,可以使用另一種稱為二分 k-均值 的聚類演算法。該方法首先將所有點作為一個簇,然後使用 k-均值 演算法對其劃分,下一次迭代時,選擇有最大誤差的簇進行劃分。這個過程重複直到 k 個簇建立為止。

相關推薦

k-均值演算法 10.4 地圖進行

將地圖上的點進行聚類,安排交通工具抵達這些簇的質心,然後步行到每個簇內地址。 這裡我們直接用給出的檔案進行操作,跳過10.4.1節。 新增程式碼: def distSLC(vecA, vecB):

K-means演算法地圖進行(未修訂篇)

# -*- coding: utf-8 -*- """ In the general case, we have a "target function" that we want to minimize, and we also have its "gradie

grokking algorithms K-nearest neighbors K-鄰近演算法 中文翻譯

說明:《grokking algorithms》演算法講解的非常深入淺出,用好多幅圖以及日常常用的例子講演算法講解的非常好,若是英文還可以的話,建議看英文原版,非常喜歡作者的寫作風格,將複雜的演算法用簡單的方式描述出來,真的好厲害!! 第十章. K-鄰近演算法

C++ primer學習筆記—— 泛型演算法

標準庫容器定義的操作集合驚人的小。標準庫並未給每個容器新增大量功能,而是提供了一組演算法,這些演算法中的大多數都獨立於任何特定的容器。這些演算法是通用的(generic,或稱泛型的):它們可以用於不同型別的容器和不同型別的元素 一、概述 大多數演算法都定義在標頭檔案alg

《Machine Learning in Action》| 1 k-近鄰演算法

準備:使用 Python 匯入資料 """ @函式說明: 建立資料集 """ def createDataSet(): # 四組二維特徵 group = np.array([[3,104],[2,100],[101,10],[99,5]])

《web安全之機器學習入門》5K近鄰演算法讀書筆記【下】

Rootkit是一種特殊的惡意軟體,它的功能是在安裝目標上隱藏自身及指定的檔案、程序和網路連線等資訊。待分析資料集:KDD-99資料集,連結:http://kdd.ics.uci.edu/databases/kddcup99/kddcup99.html該資料集是從一個模擬的美

《web安全之機器學習入門》5K近鄰演算法讀書筆記【

K近鄰演算法的思路:如果一個樣本在空間上最近的K鄰居大多數都屬於M類,則該樣本屬於M類。在本章中,使用K近鄰演算法識別使用者操作序列中的異常命令。分析資料集url:http://www.schonlau.net/資料集說明:50個使用者的linux操作日誌以User開頭的檔案

【機器學習實戰】2 K-近鄰演算法(k-NearestNeighbor,KNN)

第2章 k-近鄰演算法 <script type="text/javascript" src="http://cdn.mathjax.org/mathjax/latest/MathJax.js?config=default"></script>

程式碼註釋:機器學習實戰2 k-近鄰演算法

寫在開頭的話:在學習《機器學習實戰》的過程中發現書中很多程式碼並沒有註釋,這對新入門的同學是一個挑戰,特此貼出我對程式碼做出的註釋,僅供參考,歡迎指正。 1、匯入資料: #coding:gbk from numpy import * import operator de

Python 編程快速上手 讓繁瑣工作自動化-實踐項目 10.8 調試硬幣拋擲

技術 http watermark db4 二次 兩個 圖片 簡單 -o 下面程序的意圖是一個簡單的硬幣拋擲猜測遊戲。玩家有兩次猜測機會(這是一個簡單的遊戲)。但是,程序中有一些缺陷。讓程序運行幾次,找出缺陷,使該程序能正確運行。上面的是書中的代碼找到兩個缺陷1、沒有指明0

Fisco Bcos 許可權控制下的資料鍊實操演練

一、目的 前面已經完成fisco bcos 相關底層搭建、sdk使用、控制檯、webase中介軟體平臺等系列實戰開發, 本次進行最後一個部分,體系化管理區塊鏈底層,建立有序的底層控管制度,實現許可權化管理。 完成:鏈管理、系統管理、資料上鍊操作等。 其中資料上鍊分為:合約版本上鍊、cru

K-means演算法(將表中的分為n

客戶分類: 1、將客戶分為三類:超級VIP、vip、普通使用者 2、需要你將不同的類的資料,在圖上顯示出來,用不同的顏色 3、返回三個類中,各包含哪些點 資料在下面的的表中,因為無法上傳表格所以截了個圖! import matplotlib.pyplot as plt

演算法筆記 -- 提高篇(4) --圖演算法專題

讀書筆記 圖的定義 圖由頂點Vertex和邊Edge組成,每條邊的兩端都必須是圖的兩個頂點。而記號G(V,E)表示圖G的頂點集合為V,邊集為E。 一般來說:圖可以分為有向圖和無向圖。有向圖是所有邊都有方向,無向圖是所有邊都是雙向的。 頂點的度是指和該頂點相連的邊的條數。對於有向圖來說

2018.10.16——-10.1概述-10.2初識泛型演算法

10.1 #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { int val = 1;

八次作業----K均值演算法:自主實現與sklearn.cluster.KMeans呼叫

import numpy as np x = np.random.randint(1,100,[20,1]) y = np.zeros(20) k = 3 x def initcenter(x, k):#初始聚類中心陣列 return x[:k] kc = initcenter

吳恩達機器學習()---神經網路的反向傳播演算法

一、簡介 我們在執行梯度下降的時候,需要求得J(θ)的導數,反向傳播演算法就是求該導數的方法。正向傳播,是從輸入層從左向右傳播至輸出層;反向傳播就是從輸出層,算出誤差從右向左逐層計算誤差,注意:第一層不計算,因為第一層是輸入層,沒有誤差。 二、如何計算 設為第l層,第j個的誤差。

八次作業-----#--K均值演算法:自主實現與sklearn.cluster.KMeans呼叫

1. 用python實現K均值演算法 K-means是一個反覆迭代的過程,演算法分為四個步驟: (x,k,y) 1) 選取資料空間中的K個物件作為初始中心,每個物件代表一個聚類中心; def initcenter(x, k): kc 2) 對於樣本中的資料物件,根據它們與這些聚類中心的歐氏距離,按距

演算法部分程式 part 10

▶ 書中第四章部分程式,包括在加上自己補充的程式碼,包括無向圖連通分量,Kosaraju - Sharir 演算法、Tarjan 演算法、Gabow 演算法計算有向圖的強連通分量 ● 無向圖連通分量 1 package package01; 2 3 import edu.princet

SLAM從入門到放棄:SLAM四講習題(1-4

以下均為簡單筆記,如有錯誤,請多多指教。 證明式 K =

為什麼我要放棄javaScript資料結構與演算法)—— 排序和搜尋演算法

本章將會學習最常見的排序和搜尋演算法,如氣泡排序、選擇排序、插入排序、歸併排序、快速排序和堆排序,以及順序排序和二叉搜尋演算法。 第十章 排序和搜尋演算法 排序演算法 我們會從一個最慢的開始,接著是一些效能好一些的方法 先建立一個數組(列表)來表示待排序和搜尋的資料結構。 function Arra