对需要聚类的数据使用canopy做初步的计算

K值聚类的时候,需要自己指定cluster的数目。

这个cluster数目一般是通过canopy算法进行预处理来确定的。

canopy具体描述可以参考这里

下面是 golang语言的一个实现(对经纬度距离计算进行cluster)。

package main

import (
    "fmt"
    "math"
)

const (
    EARTH_RADIUS = 6371
)

type Point struct {
    lat float64
    lng float64
}

func Pop(points []Point) (p Point, newPoints []Point) {
    if len(points) > 0 {
        p = points[0]
        newPoints = points[1:]
    }
    return
}

func Push(p Point, points []Point) []Point {
    points = append(points, p)
    return points
}

// Calculates the Haversine distance between two points in kilometers.
// Original Implementation from: http://www.movable-type.co.uk/scripts/latlong.html
func GreatCircleDistance(p1, p2 Point) float64 {
    dLat := (p2.lat - p1.lat) * (math.Pi / 180.0)
    dLon := (p2.lng - p1.lng) * (math.Pi / 180.0)

    lat1 := p1.lat * (math.Pi / 180.0)
    lat2 := p2.lat * (math.Pi / 180.0)

    a1 := math.Sin(dLat/2) * math.Sin(dLat/2)
    a2 := math.Sin(dLon/2) * math.Sin(dLon/2) * math.Cos(lat1) * math.Cos(lat2)

    a := a1 + a2

    c := 2 * math.Atan2(math.Sqrt(a), math.Sqrt(1-a))
    return EARTH_RADIUS * c
}

/*
while(没有标记的数据点){
    选择一个没有强标记的数据点p
    把p看作一个新Canopy c的中心
    离p距离<x1的所有点都认为在c中,给这些点做上弱标记  //纳入canopy,有可能会纳入其它canopy
    离p距离<x2的所有点都认为在c中,给这些点做上强标记  //不会再纳入其它canopy
}
*/

//目前只实现了经纬度以及经纬度的距离计算,这里可以是一个向量
func CanopyCluster(points []Point, x1, x2 float64) {
    var tmp []Point
    var cluster [][]Point

    for len(points) > 0 {
        var center Point
        center, points = Pop(points)
        index := len(cluster)
        var cpList []Point
        cpList = append(cpList, center)
        cluster = append(cluster, cpList)
        var cur Point
        for len(points) > 0 {
            cur, points = Pop(points)
            distance := GreatCircleDistance(center, cur)
            if distance <= x1 {
                cluster[index] = append(cluster[index], cur)
                if distance > x2 {
                    tmp = Push(cur, tmp)
                }
            } else {
                tmp = Push(cur, tmp)
            }
        }
        fmt.Printf("current number of items in this canopy %d\n", center)
        var t []Point
        points = tmp
        tmp = t
    }
    for k, c := range cluster {
        fmt.Println("canopy", k, "has", len(c), "items:")
        for _, v := range c {
            fmt.Println("\t", v.lat, v.lng)
        }
    }
}

func main() {
    pointsList := []Point{
        {34.28637, -110.12059},
        {34.28638, -110.1206},
        {34.29077, -110.12078},
        {34.29111, -110.11941},
        {34.29113, -110.11938},
        {34.29116, -110.1194},
        {34.29145, -110.12043},
        {34.29146, -110.12063},
        {34.29154, -110.11873},
        {34.3141, -110.11556},
        {34.31411, -110.11557},
        {34.31411, -110.11556},
        {34.31412, -110.11556},
        {34.31412, -110.11557},
        {34.31415, -110.11552},
        {34.31415, -110.11556},
    }
    CanopyCluster(pointsList, 1.0, 0.8)
}
时间: 2024-10-13 14:44:42

对需要聚类的数据使用canopy做初步的计算的相关文章

oracle恢复案例:rename一个数据文件后做不完全恢复

案例:rename一个数据文件后做不完全恢复 SQL>startup mount:   //启动到mount状态 SQL> show parameter control_files    //查看控制文件的位置信息 NAME                                 TYPE        VALUE ------------------------------------ ----------- ------------------------------ contro

大数据分析师是做什么的?需要掌握哪些技能?

数据分析师是做什么的: 1.支持各种常规或临时数据分析需求: 2.提供各类业务相关的分析及建议: 3.通过建模深入挖掘用户或产品方面的有价值的信息: 4.和各部门沟通协调需求并提出各种新的数据分析项目或方案: 5.持续地改进数据采集.处理.分析.报告等各个流程上的工作. 数据分析师的基本工作流程: 1.定义问题 确定需要的问题,以及想得出的结论.需要考虑的选项有很多,要根据所在业务去判断.常见的有:变化趋势.用户画像.影响因素.历史数据等. 2.数据获取 数据获取的方式有很多种: 一是直接从企业

asp.net采用OLEDB方式导入Excel数据时提示:未在本地计算机上注册&quot;Microsoft.Jet.OLEDB.4.0&quot; 提供程序&quot;

asp.net采用OLEDB方式导入Excel数据时提示:未在本地计算机上注册"Microsoft.Jet.OLEDB.4.0" 提供程序" 笔者在项目中做做了一个从Excel表格中导入数据的模块.大体上asp.net项目中导入Excel大体分成三类: 1)采用c#内置方案System.Data.OleDb(限制较小, 通用) 2)采用Excel的COM组件(会有版本问题) 3)采用伪Excel文件.即使用文本流的方式根据需求自己定义数据格式.同时在服务端进行反格式化 笔者采

获取Excel部分数据并很据项目要求计算适宜性等级综合指数判断该地区的土壤适宜性

代码运行前请先导入jxl架包,以下代码仅供学习参考: 下图为项目中的Excel: ExcelTest02类代码如下: // 读取Excel的类 import java.io.BufferedWriter; import java.io.File; import java.io.FileWriter; import jxl.Cell; import jxl.Sheet; import jxl.Workbook; public class ExcelTest02 { /* *该代码需要先获得exce

mysql数据导出到excel以及相关计算

mysql 查询出数据之后, 可以选择导出文件 默认是csv文件  如果是整数类型的数据 可以CONCAT('\'', filed) 多加个'就可以变成文本了, 然后以文本编辑器打开csv文件 把'等字符替换为空字符串. 新建一个excel文件,找到数据-->自文本,选择下一步 格式为文本  确定即可 一些基本的excel函数: 计算某个字符或数字等的个数:=COUNTIF(A:A,"测试") 就是在A列的'测试'这个字符串出现的个数 根据身份证号计算性别:=IF(MOD(MID

数据信息价值的初步展现:可视化

图 / 文  易網°情深″ 数据信息价值的初步展现:可视化 我曾说过,因我在本职工作中带出来的一个 “良好” 习惯——随时记录.保存一切数据信息,不丢失第一手资料的价值,从而延伸到我键盘不辍地利用各个网络平台给我的生活作纪实,努力为自己的工作和生活留下凭证的习惯,每天都会将生活琐事和相关工作的细节内容,或通过文字.或通过照片截图,甚至是录音.微视频的方式,发送到自己的 QQ 上永久地保存起来. 但随着时间的推移,久而久之,这些海量的.繁杂的图文.多媒体信息都零散地存储在我电脑硬盘上的某些个文件里

机器学习(6)之聚类算法(k-means\Canopy\层次聚类\谱聚类)

目录 1 聚类的定义 1.1 距离公式(相似度) 1.2 聚类的思想 2 K-means算法 2.1 K-means算法的思考 2.2 总结 3 二分K-Means算法 4 K-Means++算法 4.1 K-Means||算法 5 Canopy算法 5.1 应用场景 6 Mini Batch K-Means算法 7 层次聚类方法 7.1 AGNES算法中簇间距离 7.2 层次聚类优化算法 8 密度聚类 8.1 DBSCAN算法 8.1.1 基本概念 8.1.2 算法流程 8.1.3 DBSCA

刚在美国上市的万国数据,要做百亿美金估值独角兽?

(上图为万国数据创始人.董事长兼首席执行官黄伟) 2016年9月,著名投资人李开复纠正了独角兽的门槛,从10亿美金估值提高到了100亿美金估值,他认为10亿美元估值的独角兽活得很艰难而只有百亿美元估值才能常青.李开复本来是给互联网独角兽下的判断,但到了12月却有一家数据中心服务商提出来也要做百亿美金独角兽,这就是刚在美国纳斯达克上市的万国数据. 2016年11月2日,国内的高性能数据中心开发商和运营商万国数据在美国纳斯达克成功IPO,定价为每份10美元并以10.41美元收盘价收尾.2016年12

企业采用云存储数据之前需做足准备

昂贵的硬件设备,不菲的制冷设施,再加上人员维护费用,处处都是用钱才能 堆砌出来的数据中心.这庞大的数字都预示着建立自己的数据中心是一项多么具有挑战的任务,且不说环保问题.所以企业建立自己的数据中心以达到存储数据的目 的,要付出昂贵的代价.在这种情况下,云存储的出现,就好似数据存储界的救世主降临一般,帮助企业利用零碎的成本进行数据存储,而且越来越受欢迎. 但是,也不能盲目地把数据全部迁移到云中存储,在决定采用云存储数据之前企业还是有一些准备工作要做的: 1.确保云厂商数据中心实时更新,并有行业认证