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均值聚類演算法,將圖片中所有的顏色值做聚類。 然後用聚類中心的顏色代替原來的顏色值。 形成新的圖片。 觀察原始圖片與新圖片所佔用記憶體的大小。 將原始圖片與新圖片儲存成檔案,觀察檔案的大小。