1. 程式人生 > >K-means演算法對地圖上點進行聚類(未修訂篇)

K-means演算法對地圖上點進行聚類(未修訂篇)

# -*- coding: utf-8 -*-
"""
In the general case, we have a "target function" that we want to minimize,
and we also have its "gradient function". Also, we have chosen a starting
value for the parameters "theta_0".
"""
#### K-均值聚類支援函式
from numpy import *
#import kMeans_my
#from numpy import *



#import kMeans_my
#from numpy import * ###匯入資料 def loadDataSet(fileName): #general function to parse tab -delimited floats dataMat = [] #assume last column is target value fr = open(fileName) for line in fr.readlines(): curLine = line.strip().split('\t') fltLine = map(float,curLine) #map all elements to float()
dataMat.append(fltLine) return dataMat #dataMat = mat(kMeans_my.loadDataSet('testSet.txt')) #定義兩個向量的歐氏距離。 def distEclud(vecA,vecB): return sqrt(sum(power(vecA-vecB,2))) ## 構建簇質心 #初始化k個簇的質心函式centroid #傳入的資料是Numpy的矩陣格式。 def randCent(dataSet,k): n = shape(dataSet)[1] centroids = mat(zeros((k,n))) for
j in range(n): minJ = min(dataSet[:,j]) #找出矩陣dataMat第J列最小值。 rangeJ = float(max(dataSet[:,j])-minJ) #計算第J列最大值最小值之差。 #賦予一個隨機質心,它的值在整個資料集的邊界之內。 centroids[:,j] = minJ + rangeJ * random.rand(k,1) return centroids #返回一個隨機的質心矩陣 # import kMeans_my # from numpy import * # dataMat = mat(kMeans_my.loadDataSet('testSet.txt')) # min(dataMat[:,0]) # min(dataMat[:,1]) # max(dataMat[:,1]) # max(dataMat[:,0]) # kMeans_my.randCent(dataMat,2) #kMeans_my.distEclud(dataMat[0],dataMat[1]) ### k-均值聚類演算法 def kMeans(dataSet,k,distMeas=distEclud,createCent = randCent): m = shape(dataSet)[0] # 獲得行數m clusterAssment = mat(zeros((m,2))) #初始化一個矩陣,用來記錄簇索引和儲存誤差。 centroids = createCent(dataSet,k) #隨機的得到一個質心矩陣簇。 clusterChanged = True while clusterChanged: clusterChanged = False for i in range(m): #對每個點尋找最近的質心 minDist= inf minIndex = -1 for j in range(k): #遍歷質心簇,尋找最近質心 distJI = distMeas(centroids[j,:],dataSet[i,:]) #計算資料點和質心的歐氏距離 if distJI < minDist: minDist = distJI minIndex = j if clusterAssment[i,0] != minIndex: clusterChanged =True clusterAssment[i,:] = minIndex, minDist**2 print centroids for cent in range(k): #更新質心位置。 ptsInClust = dataSet[nonzero(clusterAssment[:,0].A==cent)[0]] # print clusterAssment[:,0].A; #print clusterAssment[:,0].A==cent; print nonzero(clusterAssment[:,0].A==cent); print nonzero(clusterAssment[:,0].A==cent)[0]; centroids[cent,:] = mean(ptsInClust,axis=0) print centroids[cent,:] return centroids,clusterAssment # myCentroids, clusteAssing = kMeans_my.kMeans(dataMat, 4) #dataMat = mat(kMeans_my.loadDataSet('testSet.txt')) #kMeans(dataMat,4); ###二分K-均值聚類演算法 import kMeans_my dataMat3 = mat(kMeans_my.loadDataSet('testSet2.txt')) def biKmeans(dataSet,k,distMeas=distEclud): m = shape(dataSet) [0] clusterAssment = mat(zeros((m,2))) centroid0 = mean(dataSet,axis=0).tolist()[0] #tolist()生成list。 axis=0 為列 centList = [centroid0] for j in range(m): # 按行 clusterAssment[j,1] = distMeas(mat(centroid0),dataSet[j,:])**2 # 求距離 ###對簇劃分 while (len(centList) < k): lowestSSE = inf for i in range(len(centList)): # len(centList) <= k ptsInCurrCluster = \ dataSet[nonzero(clusterAssment[:,0].A == i)[0],:] # 列[:,0] 每個簇所有點視為一個小資料集。 i 第i個簇 。 取出第i個簇的所有資料,返回行號,對應到資料集的行。 centroidMat, splitClustAss = \ kMeans(ptsInCurrCluster,2,distMeas) # 對每個簇劃為2,距離度量。 返回質心和簇劃分(索引,距離) sseSplit = sum(splitClustAss[:, 1]) #誤差 sseNotSplit = \ sum(clusterAssment[nonzero(clusterAssment[:,0].A != i)[0],1]) #簇誤差 print "sseSplit, and notSplit:",sseSplit,sseNotSplit # 返回 centroidMat,splitClustAss ####實際劃分簇操作 if (sseSplit + sseNotSplit) < lowestSSE: bestCentToSplit = i bestNewCents = centroidMat bestClustAss = splitClustAss.copy() lowestSSE = sseSplit + sseNotSplit bestClustAss[nonzero(bestClustAss[:0].A==1)[0],0] = len(centList) #編號為0 , 1 的結果簇。 bestClustAss[nonzero(bestClustAss[:,0].A==0)[0],0] = bestCentToSplit print 'the bestCentToSplit is:' , bestCentToSplit print 'the len of bestClustAss is:' , len(bestClustAss) centList[bestCentToSplit] = bestNewCents[0,:] # 簇bestCentToSplit的質心座標 centList.append(bestNewCents[1,:]) # 簇bestCentToSplit的質心座標新增到質心矩陣 clusterAssment[nonzero(clusterAssment[:,0].A == bestCentToSplit)[0],:] = bestClustAss # clusterAssment的行座標更新為splitClustAss某簇的行座標。 return mat(centList), clusterAssment #返回質心座標,簇的行 #dataMat3 = mat(kMeans_my.loadDataSet('testSet2.txt')) # centList, myNewAssments = kMeans_my.biKmeans(dataMat3,3) # centList ###雅虎提供API,給定地址返回地址對應的經度緯度。 import urllib import json ###對一個地址進行地理編碼 def geoGrab(stAddress, city): #從雅虎返回一個字典 apiStem = 'http://where.yahooapis.com/geocode?' #create a dict and constants for the goecoder params = {} #建立字典,為字典設定值。 params['flags'] = 'J'#JSON return type params['appid'] = 'aaa0VN6k' params['location'] = '%s %s' % (stAddress, city) url_params = urllib.urlencode(params) #字典轉換為字串。 yahooApi = apiStem + url_params #print url_params print yahooApi c=urllib.urlopen(yahooApi) #開啟URL讀取,URL傳遞字串 return json.loads(c.read()) #將json格式解碼為字典。 from time import sleep def massPlaceFind(fileName): #封裝資訊,並儲存到檔案。 fw = open('places.txt', 'w') #開啟一個以tab分隔的文字檔案 for line in open(fileName).readlines(): line = line.strip() lineArr = line.split('\t') retDict = geoGrab(lineArr[1], lineArr[2]) #獲取第2,3列結果 if retDict['ResultSet']['Error'] == 0: #輸出字典看有沒有錯誤 lat = float(retDict['ResultSet']['Results'][0]['latitude']) #若無錯誤,則讀取經緯度。 lng = float(retDict['ResultSet']['Results'][0]['longitude']) print "%s\t%f\t%f" % (lineArr[0], lat, lng) fw.write('%s\t%f\t%f\n' % (line, lat, lng)) #新增到原來對應的行,同時寫到新檔案中。 else: print "error fetching" sleep(1) #休眠,防止頻繁呼叫。 fw.close() #import kMeans_my #geoResults = kMeans_my.geoGrab('1 VA Center','Augusta,ME') #geoResults #####對地理座標進行聚類 ###球面距離計算 def distSLC(vecA, vecB): #球面餘弦定理 a = sin(vecA[0,1]*pi/180) * sin(vecB[0,1]*pi/180) #pi/180轉換為弧度 ,pi ,numpy 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): #希望得到簇數目為5 datList = [] # 初始化,建立新列表 #####將文字檔案的解析、聚類及畫圖都封裝在一起 ##檔案解析 for line in open('places.txt').readlines(): #對於讀取檔案的行,for迴圈。 lineArr = line.split('\t') datList.append([float(lineArr[4]), float(lineArr[3])]) #獲取文字第5,4列;這兩列分別對應著經度和緯度。並新增到建立的新列表datList中。 dataMat = mat(datList) #將基於經緯度建立的列表datList矩陣化。 ##聚類 myCentroids, clustAssing = biKmeans(dataMat, numClust, distMeas=distSLC) #呼叫Kmeans函式,並使用球面餘弦定理計算距離,返回myCentroids, clustAssing。 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) #繪製一幅圖,圖0 imgP = plt.imread('Portland.png') #呼叫 imread 函式,基於一幅影象,來建立矩陣。 ax0.imshow(imgP) #呼叫imshow ,繪製(基於影象建立)矩陣的圖。 ax1 = fig.add_axes(rect, label='ax1', frameon=False) #繪製衣服新圖,圖1。 作用:使用兩套座標系統(不做任何偏移或縮放)。 ###遍歷每個簇,把它畫出來。 for i in range(numClust): # 簇號迴圈。 ptsInCurrCluster = dataMat[nonzero(clustAssing[:, 0].A == i)[0], :] #挑選出該簇所有點。 markerStyle = scatterMarkers[i % len(scatterMarkers)] #從前面建立的標記列表中獲得標記。使用索引i % len(scatterMarkers)選擇標記形狀。 作用:更多的圖可以使用這些標記形狀。 ax1.scatter(ptsInCurrCluster[:, 0].flatten().A[0], ptsInCurrCluster[:, 1].flatten().A[0], marker=markerStyle,s=90) #每個簇的所有點ptsInCurrCluster,根據標記畫出圖形。 ax1.scatter(myCentroids[:, 0].flatten().A[0], myCentroids[:, 1].flatten().A[0], marker='+', s=300) #使用 + 標記來表示簇中心,並在圖中顯示。 plt.show()

相關推薦

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

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

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

python 使用K-Means演算法資料進行

K-Means是聚類演算法的一種,以距離來判斷資料點間的相似度並對資料進行聚類。前面的文章中我們介紹過K-Means聚類演算法的原理及實現。本篇文章使用scikit-learn庫對資料進行聚類分析。準備工作開始之前先匯入要使用的各種庫檔案,首先是scikit-learn庫,然

利用k-means演算法灰度影象分割

本文主要利用k-means來對灰度影象進行分割。首先對k-means進行簡單的介紹,然後直接上程式碼。那麼什麼是k-means演算法?K-means演算法是硬聚類演算法,是典型的基於原型的目標函式聚類方法的代表,它是資料點到原型的某種距離作為優化的目標函式,利用函式求極值的方法得到迭代運算的調整規則

memset 每個字節進行初始化 0,-1

依靠 初始 結果 memset 二進制 size 字節 mem -1 memset是依靠二進制進行初始化,int是4個字節,memset把每個字節都賦值,也就是說, 比如memset(a,2,sizeof(a)) 則00000010 00000010 00000010 00

k-means+python︱scikit-learn中的KMeans實現( + MiniBatchKMeans)

CP lan sina QQ mmx 機制 意義 預測 內容 之前一直用R,現在開始學python之後就來嘗試用Python來實現Kmeans。 之前用R來實現kmeans的博客:筆記︱多種常見聚類模型以及分群質量評估(聚類註意事項、使用技巧) 聚類分析在客戶

如果在ubuntu安裝軟體異常結束正常安裝處理方法

當使用 sudo apt-get install xxxx 意外結束程序時, 再次安裝提示“...... is lock” 1    可以通過 ps -aux | grep xxxx 檢視是那個軟體程序在使用apt,然後kill 他的PID 2&nbs

omapl138移植uboot系列之新增亮led命令第六

int do_led(cmd_tbl_t *cmdtp, int flag, int argc, char * const argv[]) {          char *cmd,*num;          static char init = 0;        

文字演算法之一趟One-pass Cluster演算法的python實現

一、演算法簡介 一趟聚類演算法是由蔣盛益教授提出的無監督聚類演算法,該演算法具有高效、簡單的特點。資料集只需要遍歷一遍即可完成聚類。演算法對超球狀分佈的資料有良好的識別,對凸型資料分佈識別較差。一趟聚類可以在大規模資料,或者二次聚類中,或者聚類與其他演算法結合的情況下,發

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

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

地圖到範圍的最短距離演算法

今天是七夕,應該留點什麼才對。恰好遇到地圖上點與多邊形的距離計算問題,如果是Oracle Spatial控制元件函式計算的話,有如下幾個缺點:耗時久、計算範圍有侷限。所以我想要在前端地圖上計算該點到範圍的最短距離。 海倫公式計算面積 : S=P

人工智慧考試——k近鄰演算法鳶尾花iris資料集進行分析

一、題目 通過修改提供的k_nn.c檔案,讀取鳶尾花的資料集,其中iris_training_set.txt和iris_test_set.txt分別為訓練集和測試集,兩個資料集中最後一列為類別標籤,其餘列為表示花瓣和萼片長度和寬度的輸入特徵。通過計算測試集中的每個輸入行和訓

【文字】用k-means文字進行

# -*- coding: utf-8 -*- """ Created on Thu Nov 16 10:08:52 2017 @author: li-pc """ import jieba fr

Python之使用K-Means演算法消費行為特徵資料分析異常檢測

源資料(這裡僅展示10行):程式:#-*- coding: utf-8 -*- #使用K-Means演算法聚類消費行為特徵資料 import numpy as np import pandas as pd #引數初始化 inputfile = '../data/consu

機器學習——K-means演算法演算法

聚類 在說K-means聚類演算法之前必須要先理解聚類和分類的區別。 分類其實是從特定的資料中挖掘模式,作出判斷的過程。比如Gmail郵箱裡有垃圾郵件分類器,一開始的時候可能什麼都不過濾,在日常使用過程中,我人工對於每一封郵件點選“垃圾”或“不是垃圾”,過一段時間,Gmail就體現出

第九次作業---K-means演算法應用:圖片壓縮

讀取一張示例圖片或自己準備的圖片,觀察圖片存放資料特點。 from sklearn.datasets import load_sample_image from sklearn.cluster import KMeans import matplotlib.pyplot as plt import

K-means演算法應用:圖片壓縮

from sklearn.datasets import load_sample_image from matplotlib import pyplot as plt from sklearn.cluster import KMeans import numpy as np #讀取一張示例圖片或自己準

使用PIL和幾種分類演算法標準數字圖片進行識別

詳細程式碼見GitHub: https://github.com/nickliqian/simple_number_recognition simple_number_recognition 使用PIL和幾種分類演算法對標準數字圖片進行識別。 背景 在採集某

吳恩達機器學習 - 無監督學習——K-means演算法 吳恩達機器學習 - 無監督學習——K-means演算法

原 吳恩達機器學習 - 無監督學習——K-means演算法 2018年06月25日 12:02:37 離殤灬孤狼 閱讀數:181

第九次作業——K-means演算法應用:圖片壓縮

一.讀取一張示例圖片或自己準備的圖片,觀察圖片存放資料特點。 根據圖片的解析度,可適當降低解析度。 再用k均值聚類演算法,將圖片中所有的顏色值做聚類。 然後用聚類中心的顏色代替原來的顏色值。 形成新的圖片。 觀察原始圖片與新圖片所佔用記憶體的大小。 將原始圖片與新圖片儲存成檔案,觀察檔案的大小。