张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

这篇具有很好参考价值的文章主要介绍了张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

pycharm使用的简单教程

作者介绍

张伟伟,男,西安工程大学电子信息学院,2019级硕士研究生,张宏伟人工智能课题组。
研究方向:机器视觉与人工智能。
电子邮件:zhangweiweicpp@163.com
个人CSDN主页:欢迎关注和相互交流学习.

1. 安装包的准备:

pip install sklearn
pip install matplotlib
pip install opencv-python

代码的百度网盘链接:https://pan.baidu.com/s/1neOlGt-3240B9tjhJVOy0A
链接提取码:2021

2. Mean-shift原理及实现

2.1 Mean-shift原理

Mean-shift(均值迁移)的基本思想:在数据集中选定一个点,然后以这个点为圆心,r为半径,画一个圆(二维下是圆)先算出当前点的偏移均值,移动该点到其偏移均值,然后以此为新的起始点,继续移动,然后迭代此过程,直到满足一点的条件结束。Mean-shift 算法的核心思想就是不断的寻找新的圆心坐标,直到密度最大的区域。
张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

2.2 主要参数

  • bandwidth :半径(或带宽),float型。如果没有给出,则使用- - sklearn.cluster.estimate_bandwidth计算出半径(带宽).(可选)
  • seeds :圆心(或种子),数组类型,即初始化的圆心。(可选)
  • bin_seeding :布尔值。如果为真,初始内核位置不是所有点的位置,而是点的离散版本的位置,其中点被分类到其粗糙度对应于带宽的网格上。将此选项设置为True将加速算法,因为较少的种子将被初始化。默认值:False.如果种子参数(seeds)不为None则忽略。

2.3 实现

# -*- coding:utf-8 -*-
from sklearn.datasets import make_blobs
from sklearn.cluster import MeanShift, estimate_bandwidth
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle  ##python自带的迭代器模块

##产生随机数据的中心
centers = [[1, 1], [-1, -1], [1, -1]]
##产生的数据个数
n_samples=10000
##生产数据
X, _ = make_blobs(n_samples=n_samples, centers= centers, cluster_std=0.6,
                  random_state =0)

##带宽,也就是以某个点为核心时的搜索半径
bandwidth = estimate_bandwidth(X, quantile=0.2, n_samples=500)
##设置均值偏移函数
ms = MeanShift(bandwidth=bandwidth, bin_seeding=True)
##训练数据
ms.fit(X)
##每个点的标签
labels = ms.labels_
print(labels)
##簇中心的点的集合
cluster_centers = ms.cluster_centers_
print('cluster_centers:',cluster_centers)
##总共的标签分类
labels_unique = np.unique(labels)
##聚簇的个数,即分类的个数
n_clusters_ = len(labels_unique)
print("number of estimated clusters : %d" % n_clusters_)

##绘图
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = labels == k
    cluster_center = cluster_centers[k]
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
    plt.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
             markeredgecolor='k', markersize=14)
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

2.4 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

2.5 实例扩展:利用Meanshift进行目标追踪

# -*- coding:utf-8 -*-
__author__ = 'Microcosm'

import cv2
import numpy as np

cap=cv2.VideoCapture(0)
# 获取第一帧
ret, frame = cap.read()
# 设置初始跟踪对象的窗口大小
# r,h,c,w = 120,100,253,100
# r, h, c, w = 180, 80, 140, 90
r, h, c, w = 0, 80, 0, 80
track_window = (c, r, w, h)

cv2.rectangle(frame, (c, r), (c + w, r + h), 255, 2)
cv2.imshow("frame", frame)
cv2.waitKey(0)
# 设置感兴趣的区域
roi = frame[r:r + h, c:c + w]
# cv2.imshow("roi",roi)
# cv2.waitKey(0)
hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 0., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], None, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)

term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)

while (True):
    ret, frame = cap.read()

    if ret is True:
        hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
        dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)

        # 调用meanshift获取新的位置
        ret, track_window = cv2.meanShift(dst, track_window, term_crit)

        # 画出它的位置
        x, y, w, h = track_window

        cv2.rectangle(frame, (x, y), (x + w, y + h), 255, 2)
        cv2.imshow("frame", frame)

        k = cv2.waitKey(60) & 0xff
        if k == 27:
            break
        # else:
        #    cv2.imwrite(chr(k)+".jpg",frame)

    else:
        break

cv2.destroyAllWindows()
cap.release()

3. Spectral Clustering原理及实现

3.1 Spectral Clustering原理

  • Spectral Clustering(SC,即谱聚类),是一种基于图论的聚类方法,它能够识别任意形状的样本空间且收敛于全局最有解,其基本思想是利用样本数据的相似矩阵进行特征分解后得到的特征向量进行聚类.它与样本特征无关而只与样本个数有关。

  • 基本思路:将样本看作顶点,样本间的相似度看作带权的边,从而将聚类问题转为图分割问题:找到一种图分割的方法使得连接不同组的边的权重尽可能低(这意味着组间相似度要尽可能低),组内的边的权重尽可能高(这意味着组内相似度要尽可能高).

  • 张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法如上图所示,断开虚线,六个数据被聚成两类。

3.2 主要参数

因为是基于图论的算法,所以输入必须是对称矩阵。

  • 主要参数(参数较多,详细参数)

  • n_clusters:聚类的个数。(官方的解释:投影子空间的维度)

  • affinity:核函数,默认是’rbf’,可选:“nearest_neighbors”,“precomputed”,"rbf"或sklearn.metrics.pairwise_kernels支持的其中一个内核之一。

  • gamma :affinity指定的核函数的内核系数,默认1.0

3.3 实现

from sklearn.datasets import make_blobs
from sklearn.cluster import spectral_clustering
import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from itertools import cycle  ##python自带的迭代器模块

##产生随机数据的中心
centers = [[1, 1], [-1, -1], [1, -1]]
##产生的数据个数
n_samples=3000
##生产数据
X, lables_true = make_blobs(n_samples=n_samples, centers= centers, cluster_std=0.6, 
                  random_state =0)

##变换成矩阵,输入必须是对称矩阵
metrics_metrix = (-1 * metrics.pairwise.pairwise_distances(X)).astype(np.int32)
metrics_metrix += -1 * metrics_metrix.min()
##设置谱聚类函数
n_clusters_= 4
lables = spectral_clustering(metrics_metrix,n_clusters=n_clusters_)

##绘图
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = lables == k
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
    
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

3.4 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

4.Hierarchical Clustering原理及实现

4.1 Hierarchical Clustering原理

简介:Hierarchical Clustering(层次聚类):就是按照某种方法进行层次分类,直到满足某种条件为止。

主要分成两类:

a)凝聚:从下到上。首先将每个对象作为一个簇,然后合并这些原子簇为越来越大的簇,直到所有的对象都在一个簇中,或者某个终结条件被满足。

b)分裂:从上到下。首先将所有对象置于同一个簇中,然后逐渐细分为越来越小的簇,直到每个对象自成一簇,或者达到了某个终止条件。(较少用)
步骤:
a)将每个对象归为一类, 共得到N类, 每类仅包含一个对象. 类与类之间的距离就是它们所包含的对象之间的距离.

b)找到最接近的两个类并合并成一类, 于是总的类数少了一个.

c)重新计算新的类与所有旧类之间的距离.
d)重复第2步和第3步, 直到最后合并成一个类为止(此类包含了N个对象).

4.2 主要参数

sklearn.cluster.AgglomerativeClustering

  • n_clusters:聚类的个数

  • linkage:指定层次聚类判断相似度的方法,有以下三种:

  • ward:组间距离等于两类对象之间的最小距离。(即single-linkage聚类)

  • average:组间距离等于两组对象之间的平均距离。(average-linkage聚类)

  • complete:组间距离等于两组对象之间的最大距离。(complete-linkage聚类)

4.3 实现

from sklearn.datasets import make_blobs
from sklearn.cluster import AgglomerativeClustering
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle  ##python自带的迭代器模块

##产生随机数据的中心
centers = [[1, 1], [-1, -1], [1, -1]]
##产生的数据个数
n_samples=3000
##生产数据
X, lables_true = make_blobs(n_samples=n_samples, centers= centers, cluster_std=0.6, 
                  random_state =0)


##设置分层聚类函数
linkages = ['ward', 'average', 'complete']
n_clusters_ = 3
ac = AgglomerativeClustering(linkage=linkages[2],n_clusters = n_clusters_)
##训练数据
ac.fit(X)

##每个数据的分类
lables = ac.labels_

##绘图
plt.figure(1)
plt.clf()

colors = cycle('bgrcmykbgrcmykbgrcmykbgrcmyk')
for k, col in zip(range(n_clusters_), colors):
    ##根据lables中的值是否等于k,重新组成一个True、False的数组
    my_members = lables == k
    ##X[my_members, 0] 取出my_members对应位置为True的值的横坐标
    plt.plot(X[my_members, 0], X[my_members, 1], col + '.')
    
plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

4.3 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

5.DBSCAN原理及实现

5.1 DBSCAN原理

简介
DBSCAN(Density-Based Spatial Clustering of Applications with Noise,具有噪声的基于密度的聚类方法)是一种基于密度的空间聚类算法。该算法将具有足够密度的区域划分为簇(即要求聚类空间中的一定区域内所包含对象的数目不小于某一给定阈值),并在具有噪声的空间数据库中发现任意形状的簇,它将簇定义为密度相连的点的最大集合。
步骤
a)遍历所有点,寻找核心点

b)连通核心点,并且在此过程中扩展某个分类集合中点的个数
张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法
在上图中,第一步就是寻找红色的核心点,第二步就是用绿色箭头联通红色点。图中点以绿色线条为中心被分成了两类。没在黑色圆中的点是噪声点。

5.2 主要参数

DBSCAN需要二个参数:扫描半径 (eps)和最小包含点数(min_samples)

5.3 实现

from sklearn.datasets import make_blobs
from sklearn.cluster import DBSCAN
import numpy as np
import matplotlib.pyplot as plt
from itertools import cycle  ##python自带的迭代器模块
from sklearn.preprocessing import StandardScaler

##产生随机数据的中心
centers = [[1, 1], [-1, -1], [1, -1]]
##产生的数据个数
n_samples = 750
##生产数据:此实验结果受cluster_std的影响,或者说受eps 和cluster_std差值影响
X, lables_true = make_blobs(n_samples=n_samples, centers=centers, cluster_std=0.4,
                            random_state=0)

##设置分层聚类函数
db = DBSCAN(eps=0.3, min_samples=10)
##训练数据
db.fit(X)
##初始化一个全是False的bool类型的数组
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
'''
   这里是关键点(针对这行代码:xy = X[class_member_mask & ~core_samples_mask]):
   db.core_sample_indices_  表示的是某个点在寻找核心点集合的过程中暂时被标为噪声点的点(即周围点
   小于min_samples),并不是最终的噪声点。在对核心点进行联通的过程中,这部分点会被进行重新归类(即标签
   并不会是表示噪声点的-1),也可也这样理解,这些点不适合做核心点,但是会被包含在某个核心点的范围之内
'''
core_samples_mask[db.core_sample_indices_] = True

##每个数据的分类
lables = db.labels_

##分类个数:lables中包含-1,表示噪声点
n_clusters_ = len(np.unique(lables)) - (1 if -1 in lables else 0)

##绘图
unique_labels = set(lables)
'''
   1)np.linspace 返回[0,1]之间的len(unique_labels) 个数
   2)plt.cm 一个颜色映射模块
   3)生成的每个colors包含4个值,分别是rgba
   4)其实这行代码的意思就是生成4个可以和光谱对应的颜色值
'''
colors = plt.cm.Spectral(np.linspace(0, 1, len(unique_labels)))

plt.figure(1)
plt.clf()

for k, col in zip(unique_labels, colors):
    ##-1表示噪声点,这里的k表示黑色
    if k == -1:
        col = 'k'

    ##生成一个True、False数组,lables == k 的设置成True
    class_member_mask = (lables == k)

    ##两个数组做&运算,找出即是核心点又等于分类k的值  markeredgecolor='k',
    xy = X[class_member_mask & core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', c=col, markersize=14)
    '''
       1)~优先级最高,按位对core_samples_mask 求反,求出的是噪音点的位置
       2)& 于运算之后,求出虽然刚开始是噪音点的位置,但是重新归类却属于k的点
       3)对核心分类之后进行的扩展
    '''
    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(xy[:, 0], xy[:, 1], 'o', c=col, markersize=6)

plt.title('Estimated number of clusters: %d' % n_clusters_)
plt.show()

5.4 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

6.Birch原理及实现

6.1 Birch原理

Birch(利用层次方法的平衡迭代规约和聚类):就是通过聚类特征(CF)形成一个聚类特征树,root层的CF个数就是聚类个数。
聚类特征(CF):每一个CF是一个三元组,可以用(N,LS,SS)表示.其中N代表了这个CF中拥有的样本点的数量;LS代表了这个CF中拥有的样本点各特征维度的和向量,SS代表了这个CF中拥有的样本点各特征维度的平方和。

6.2 主要参数

  • n_clusters :聚类的目标个数。(可选)

  • threshold :扫描半径(个人理解,官方说法比较绕口),设置小了分类就多。

  • branches_factor:每个节点中CF子集群的最大数量,默认为50。

6.3 实现

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.cluster import Birch

# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.3, 0.4, 0.3],
                  random_state =9)

##设置birch函数
birch = Birch(n_clusters = None)
##训练数据
y_pred = birch.fit_predict(X)
##绘图
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

6.4 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法

7 GaussianMixtureModel原理及实现

7.1 GaussianMixtureModel原理

正太分布也叫高斯分布,正太分布的概率密度曲线也叫高斯分布概率曲线。

GaussianMixtureModel(混合高斯模型,GMM)。

聚类算法大多数通过相似度来判断,而相似度又大多采用欧式距离长短作为衡量依据。而GMM采用了新的判断依据:概率,即通过属于某一类的概率大小来判断最终的归属类别。

GMM的基本思想就是:任意形状的概率分布都可以用多个高斯分布函数去近似,也就是说GMM就是有多个单高斯密度分布(Gaussian)组成的,每个Gaussian叫一个"Component",这些"Component"线性加成在一起就组成了 GMM 的概率密度函数,也就是下面的函数

7.2 主要参数

  • n_components :高斯模型的个数,即聚类的目标个数

  • covariance_type : 通过EM算法估算参数时使用的协方差类型,默认是"full"

  • full:每个模型使用自己的一般协方差矩阵

  • tied:所用模型共享一个一般协方差矩阵

  • diag:每个模型使用自己的对角线协方差矩阵

  • spherical:每个模型使用自己的单一方差

7.3 实现

import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.mixture import GaussianMixture

# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,簇中心在[-1,-1], [0,0],[1,1], [2,2]
X, y = make_blobs(n_samples=1000, n_features=2, centers=[[-1,-1], [0,0], [1,1], [2,2]], cluster_std=[0.4, 0.3, 0.4, 0.3],
                  random_state = 0)

##设置gmm函数
gmm = GaussianMixture(n_components=4, covariance_type='full').fit(X)
##训练数据
y_pred = gmm.predict(X)

##绘图
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()

7.4 结果

张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法
参考链接:
反向投影的理解.文章来源地址https://www.toymoban.com/news/detail-442328.html

到了这里,关于张伟伟-层次1 Mean_shift聚类算法和其他的聚类算法的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 层次聚类算法的实现

    杨金花,女,西安工程大学电子信息学院,21级硕士研究生 研究方向:基于学习方法的运动目标检测 电子邮件:2902551510@qq.com 孟莉苹,女,西安工程大学电子信息学院,2021级硕士研究生,张宏伟人工智能课题组 研究方向:机器视觉与人工智能 电子邮件:2425613875@qq.com 假设有

    2023年04月08日
    浏览(25)
  • 常见聚类算法及使用--层次聚类(Agglomerative clustering)

    前言 层次聚类顾名思义就是按照某个层次对样本集进行聚类操作,这里的层次实际上指的就是某种距离定义。 层次聚类最终的目的是消减类别的数量,所以在行为上类似于树状图由叶节点逐步向根节点靠近的过程,这种行为过程又被称为“自底向上”。 更通俗的,层次聚类

    2024年01月16日
    浏览(29)
  • 【Python】sklearn机器学习之层次聚类算法AgglomerativeClustering

    和Birch聚类相似,层次聚类也是一种依赖树结构实现的聚类方法,其核心概念是相似度。根据相似度,可以将所有样本组织起来,从而构建一棵层次聚类树。 其中Birch算法的核心,叫做聚类特征树(Clustering Feature Tree),简称CF树。CF树由CF构成,每个CF都是三元组,表示为(N, LS,

    2024年02月03日
    浏览(25)
  • 层次聚类算法在人工智能医疗中的应用

    作者:禅与计算机程序设计艺术 引言 1.1. 背景介绍 随着人工智能技术的快速发展,医疗领域也逐渐迎来了信息化的春天。医疗数据的丰富性和复杂性为人工智能提供了大量的应用场景。层次聚类算法作为数据挖掘领域的一种经典算法,在医疗领域有着广泛的应用前景。本文

    2024年02月08日
    浏览(36)
  • 基于SPSS的聚类分析原理概述

    在声音样本数目比较多的情况下,直接进行成对比较法,工作量非常大,且评价者容易疲劳,在很大程度上影响评价结果的一致性和准确性。对于这种情况,采用聚类分析,从 30 个声音样本中选择有代表性的样本进行主观评价试验,大大降低了主观评价试验的工作量 1 。 [

    2024年02月06日
    浏览(29)
  • 无监督学习的集成方法:相似性矩阵的聚类

    在机器学习中,术语Ensemble指的是并行组合多个模型,这个想法是利用群体的智慧,在给出的最终答案上形成更好的共识。 这种类型的方法已经在监督学习领域得到了广泛的研究和应用,特别是在分类问题上,像RandomForest这样非常成功的算法。通常应用一些投票/加权系统,将

    2024年02月05日
    浏览(32)
  • 图论中的聚类系数(Clustering coefficient)简单介绍

    在GraphSage论文的理论分析部分,涉及到一个概念叫做“ Clustering coefficient” ,直译过来就是 聚类系数 ,解释为“节点的一跳邻域内封闭的三角形的比例”,本文对其做一个简单的介绍。本文参考了 Wiki百科-Clustering coefficient。 更:关于GraphSage论文详解,请参见博文《GraphSag

    2023年04月09日
    浏览(20)
  • 专栏十:10X单细胞的聚类树绘图

    经常在文章中看到对细胞群进行聚类,以证明两个cluster之间的相关性,这里总结两种绘制这种图的方式和代码,当然我觉得这些五颜六色的颜色可能是后期加的,本帖子只总结画树状图的方法 文章Single-cell analyses implicate ascites in remodeling the ecosystems of primary and metastatic tumors

    2024年02月07日
    浏览(50)
  • 【聚类】K-modes和K-prototypes——适合离散数据的聚类方法

    假设一批数据,每一个样本中,有唯一标识(id)、品类(cate_id)、受众(users, 小孩、老人、中年等)等属性,希望从其中找出一些样本,使得这些样本覆盖的品类、受众等最广。 思路是使用聚类的方式,每个簇选一个样本。观察数据,都为类别特征,常用的kmeans聚类方法

    2024年02月03日
    浏览(23)
  • 数据挖掘18大算法实现以及其他相关经典DM算法:决策分类,聚类,链接挖掘,关联挖掘,模式挖掘、图算法,搜索算法等

    【机器学习入门与实践】入门必看系列,含数据挖掘项目实战:模型融合、特征优化、特征降维、探索性分析等,实战带你掌握机器学习数据挖掘 专栏详细介绍:【机器学习入门与实践】合集入门必看系列,含数据挖掘项目实战:数据融合、特征优化、特征降维、探索性分析

    2024年02月09日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包