Part3-Chapter10-利用k均值聚类算法对未标注数据分组(4)

该博客讲述了作者利用k均值聚类算法对国内城市的酒吧进行分组分析,原本计划使用Yahoo地图API,但因在国内,改用高德API获取经纬度数据。在实现过程中,作者遇到一些调试难题,特别是Python数组和numpy矩阵的存取方式差异导致的bug。最终,通过不断打印和检查数据找到问题并解决了它。
摘要由CSDN通过智能技术生成

书上用的是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):
    #得到初始化质点矩阵
    Clu = initClu(dataSet,k)
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值