• 欢迎访问搞代码网站,推荐使用最新版火狐浏览器和Chrome浏览器访问本网站!
  • 如果您觉得本站非常有看点,那么赶紧使用Ctrl+D 收藏搞代码吧

python怎么实现canopy聚类

python 搞代码 4年前 (2022-01-09) 15次浏览 已收录 0个评论

Canopy算法是2000年由Andrew McCallum, Kamal Nigam and Lyle Ungar提出来的,它是对k-means聚类算法和层次聚类算法的预处理。众所周知,kmeans的一个不足之处在于k值需要通过人为的进行调整,后期可以通过肘部法则(Elbow Method)和轮廓系数(Silhouette Coefficient)来对k值进行最终的确定,但是这些方法都是属于“事后”判断的,而Canopy算法的作用就在于它是通过事先粗聚类的方式,为k-means算法确定初始聚类中心个数和聚类中心点。

使用的包:

import mathimport randomimport numpy as npfrom datetime import datetimefrom pprint import pprint as pimport matplotlib.pyplot as plt

1.首先我在算法中预设了一个二维(为了方便后期画图呈现在二维平面上)数据dataset。

当然也可以使用高纬度的数据,并且我将canopy核心算法写入了类中,后期可以通过直接调用的方式对任何维度的数据进行处理,当然只是小批量的,大批量的数据可以移步Mahout和Hadoop了。

# 随机生成500个二维[0,1)平面点dataset = np.random.rand(500, 2)

相关推荐:《Python视频教程》

2.然后生成个两类,类的属性如下:

class Canopy:    def __init__(self, dataset):                self.dataset = dataset                self.t1 = 0      self.t2 = 0

加入设定t1和t2初始值以及判断大小函数

   # 设置初始阈值  def setThreshold(self, t1, t2):            if t1 > t2:        self.t1 = t1                    self.t2 = t2            else:        print('t1 needs to be larger than t2!')

3.距离计算,各个中心点之间的距离计算方法我使用的欧式距离。

#使用欧式距离进行距离的计算def euclideanDistance(self, vec1, vec2):            return math.sqrt(((vec1 - vec2)**2).sum())

4.再写个从dataset中根据dataset的长度随机选择下标的函数

# 根据当前dataset的长度随机选择一个下标 def getRandIndex(self):            return random.randint(0, len(self.dataset) - 1)

5.核心算法

def clustering(self):                if self.t1 == 0:            print('Please set the threshold.')                else:            canopies = []  # 用于存放最终归类结果            while len(self.dataset) != 0:                rand_index = self.getRandIndex()                current_center = self.dataset[rand_index]  # <div>本文来源gaodai.ma#com搞##代!^码@网3</div>随机获取一个中心点,定为P点                current_center_list = []  # 初始化P点的canopy类容器                delete_list = []  # 初始化P点的删除容器                self.dataset = np.delete(                                         self.dataset, rand_index, 0)  # 删除随机选择的中心点P                for datum_j in range(len(self.dataset)):                    datum = self.dataset[datum_j]                    distance = self.euclideanDistance(                        current_center, datum)  # 计算选取的中心点P到每个点之间的距离                    if distance < self.t1:                        # 若距离小于t1,则将点归入P点的canopy类                        current_center_list.append(datum)                                        if distance < self.t2:                        delete_list.append(datum_j)  # 若小于t2则归入删除容器                # 根据删除容器的下标,将元素从数据集中删除                self.dataset = np.delete(self.dataset, delete_list, 0)                canopies.append((current_center, current_center_list))                  return canopies

搞代码网(gaodaima.com)提供的所有资源部分来自互联网,如果有侵犯您的版权或其他权益,请说明详细缘由并提供版权或权益证明然后发送到邮箱[email protected],我们会在看到邮件的第一时间内为您处理,或直接联系QQ:872152909。本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:python怎么实现canopy聚类

喜欢 (0)
[搞代码]
分享 (0)
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址