书上用的是portland的几个小县的酒吧作为数据点,使用yahoo的地图API得到其经纬度,并进行聚类,从而得知在哪停车可以最好地遍历所有酒吧。因为我在国内,所以用的是高德的API。因为担心它在计算国外地点时效果不好,干脆使用国内的城市作为初始数据。后来发现这样做聚类效果很差,最后取了几个省的市作为数据。
import numpy as np
import random
import math
import matplotlib
import matplotlib.pyplot as plt
import requests
#载入数据
#filename:载入文件名
def loadData(fileName):
dataMat = []
fr = open(fileName)
for line in fr.readlines():
curline = line.strip().split("\t")
fltLine = list(map(float,curline))
dataMat.append(fltLine)
return np.mat(dataMat)
#随机选取k个点作为起始质点
#dataSet:数据集
#k:指定聚类数
#Clu:初始化的质点矩阵
#initClu:最初的选取质点矩阵:防止选取重复初始质点
def initClu(dataSet,k):
list(map(lambda x: [int(x[0]), x[1]], [np.matrix.tolist(i)[0] for i in dataSet]))
m,n = np.shape(np.mat(dataSet))
Clu = np.zeros((k,n))
initClu = np.zeros((k,1)).astype(int)
#检查是否重复
check = 0
for i in range(k):
newClu = math.ceil(random.random()*m)
for j in range(k):
checkClu = initClu[j][0]
if checkClu == 0:
break
if newClu == checkClu:
check = 1
if check == 1:
raise Exception("Invalid Cluster!")
else:
initClu[i] = newClu
Clu[i] = dataSet[newClu]
return Clu
def calDis(vecA,vecB):
return np.sqrt(np.sum(np.power(vecA - vecB,2)))
#聚类函数
#dataSet:数据集
#k:制定聚类数
#inDat:带有自身类别的数据矩阵
def kMean(dataSet,k,distMeas = calDis):
#得到初始化质点矩阵
C