机器学习(五) -- 无监督学习(1) --聚类2

news2024/9/22 3:59:36

系列文章目录及链接

上篇:机器学习(五) -- 无监督学习(1) --聚类1
下篇:


前言

tips:标题前有“***”的内容为补充内容,是给好奇心重的宝宝看的,可自行跳过。文章内容被“文章内容”删除线标记的,也可以自行跳过。“!!!”一般需要特别注意或者容易出错的地方。

本系列文章是作者边学习边总结的,内容有不对的地方还请多多指正,同时本系列文章会不断完善,每篇文章不定时会有修改。

由于作者时间不算富裕,有些内容的《算法实现》部分暂未完善,以后有时间再来补充。见谅!

文中为方便理解,会将接口在用到的时候才导入,实际中应在文件开始统一导入。


 三、**算法实现

四、接口实现

1、K-means

1.1、API

sklearn.cluster.KMeans
 
导入:
from sklearn.cluster import KMeans
 
语法:
KMeans(n_clusters=8,init=‘k-means++’,n_init='warn', max_iter=300, tol=0.0001, verbose=0, random_state=None, copy_x=True, algorithm='lloyd')
参数:
    n_clusters:开始的聚类中心数量,默认=8,
    init:初始化方法,默认为‘k-means ++

属性:
KMeans.cluster_centers_:簇中心的坐标
KMeans.labels_:每个样本的标签

方法:
KMeans.fit(x)
KMeans.predict(x)
KMeans.fit_predict(x)
    计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

1.2、流程

1.2.1、获取数据
from sklearn.datasets import load_iris

from sklearn.cluster import KMeans

# 获取数据
iris = load_iris()
1.2.2、数据预处理
# 划分数据集
x=iris.data
y=iris.target
1.2.3、特征工程
1.2.4、模型训练
# 实例化学习器
kmeans = KMeans(n_clusters=3, random_state=1473, n_init='auto')

# 模型训练
kmeans.fit(x)
1.2.5、模型评估
# 用模型计算测试值,得到预测值
y_pre = kmeans.predict(x)

# 可视化
plt.figure(figsize=(14,7))
plt.subplot(121)
# 绘制iris原本的类别
plt.scatter(x[:, 0], x[:, 1], c=y)

plt.subplot(122)
# 绘制kmeans聚类结果
plt.scatter(x[:, 0], x[:, 1], c=y_pre)
plt.show()
from sklearn.metrics import jaccard_score, fowlkes_mallows_score, adjusted_rand_score, davies_bouldin_score
print('K均值聚类模型的Jaccard系数:', jaccard_score(y, y_pre,average='micro'))
print('K均值聚类模型的FM系数:', fowlkes_mallows_score(y, y_pre))
print('K均值聚类模型的调整Rand指数:', adjusted_rand_score(y, y_pre))
print('K均值聚类模型的DB指数:', davies_bouldin_score(x, kmeans.labels_))

1.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2、K-Medoids

make_blobs的API:

        生成聚类数据集

sklearn.datasets.make_blobs

导入:
from sklearn.datasets import make_blobs

方法:
x, y = make_blobs(n_samples=1000, 
                  n_features=2, 
                  centers=[[-1, -1], [0, 0], [1, 1], [2, 2]],
                  cluster_std=[0.4, 0.2, 0.2, 0.2],
                  random_state=1473)
    x为样本特征,y为样本簇类别
    n_samples:样本数,默认=100;
    n_features:样本特征数(样本维度),默认=2;
    centers:族中心个数,可以是数字,也可以是点坐标,默认=3;
    cluster_std:簇标准差,默认=10;

2.1、获取数据

from sklearn.datasets import make_blobs

# 获取数据
x,y = make_blobs(n_samples=150, centers=3, n_features=2, random_state=1734)

# 可视化
plt.figure()
plt.scatter(x[:, 0], x[:, 1], c='b')
plt.show()

2.2、数据预处理

2.3、特征工程

2.4、模型训练

class KMedoids1:
    def __init__(self,k=3,max_iter=100):
        self.k = k
        self.max_iter = max_iter

    def euclidean_distance(self, x1, x2):
        return np.sqrt(np. sum( (x1 - x2) **2))

    def fit(self, X):
        n_samples,n_features = X.shape

        #初始化聚类中心,从样本点中随机选取k个点作为聚类中心
        centers = np.sort(np.random.choice(n_samples,self.k,replace=False))
        medoids = X[centers]

        for i in range(self.max_iter) :
            #计算每个样本点到每个聚类中心之间的距离
            distances = np.zeros((n_samples,self.k))
            for j in range(self.k):
                distances[:,j] = np.apply_along_axis(self.euclidean_distance,1,X,medoids[j])

            #找到距离每个聚类中心最近的点,作为新的聚类中心
            closest_centroid = np.argmin(distances,axis=1)
            for j in range(self.k):
                medoids[j] = np.median( X[closest_centroid == j],axis=0)

        self.medoids = medoids
        self.labels = closest_centroid
        return self
kmedoids=KMedoids1(3)
kmedoids.fit(x)

2.5、模型评估

plt.figure()
plt.scatter(x[:, 0], x[:, 1], c=kmedoids.labels, cmap='viridis', marker='o', label='Data points')
plt.scatter(kmedoids.medoids[:,0],kmedoids.medoids[:,1], c='red', marker='X', s=100, label='Medoids')
plt.title('K-medoids聚类')
plt.xlabel('特征 1')
plt.ylabel('特征 2')
plt.show()

2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

3、层次聚类--AGNES

2.1、API

sklearn.cluster.AgglomerativeClustering
 
导入:
from sklearn.cluster import AgglomerativeClustering
 
语法:
AgglomerativeClustering(n_clusters=2, *, affinity='euclidean', memory=None, connectivity=None, compute_full_tree='auto', linkage='ward', distance_threshold=None)
参数:
    n_clusters:指定聚类的簇数。
    affinity:指定距离度量的方式,可以是预定义的
            (如"euclidean"、"l1"、"l2"、"manhattan"等)或者自定义的距离度量函数。
    linkage:指定连接方式,用于计算两个簇之间的距离,可以是预定义的字符串
            (如" single"、"ward"、"complete"、"average"等)或者自定义的连接函数。
    connectivity:指定连接矩阵,用于限制哪些样本可以连接到一起的布尔数组或可调用对象。
    compute_full_tree:指定是否计算完整的层次聚类树。
    distance_threshold:指定停止合并簇的距离阈值。
    memory:指定内存缓存的路径,以便加速计算。
    compute_distances:指定是否在计算连接矩阵时计算距离矩阵。


属性:


方法:

2.2、流程

2.2.1、获取数据
from scipy.cluster.hierarchy import linkage          #导入linage函数用于层次聚类
from scipy.cluster.hierarchy import dendrogram       #dendrogram函数用于将聚类结果绘制成树状图
from scipy.cluster.hierarchy import fcluster         #fcluster函数用于提取出聚类的结果
from sklearn.datasets import make_blobs              #make_blobs用于生成聚类算法的测试数据
from sklearn.cluster import AgglomerativeClustering  #自底向上层次聚类算法

# 获取数据
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(n_samples=750, centers=centers, cluster_std=0.4, random_state=1473)

# 可视化
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c='b')
plt.show()

 

2.2.2、数据预处理
2.2.3、特征工程
2.2.4、模型训练
#层次聚类实现
Z = linkage(X,  method='ward', metric='euclidean')
print(Z.shape)
print(Z[: 5])
2.2.5、模型评估
# 用模型计算测试值,得到预测值


# 
#画出树状图
plt.figure()
dendrogram(Z, truncate_mode='lastp', p=20, show_leaf_counts=False, leaf_rotation=90, leaf_font_size=15,
           show_contracted=True)
plt.show()

#根据临界距离返回聚类结果
d = 15
labels_1 = fcluster(Z, t=d, criterion='distance')
print(labels_1[: 100])  # 打印聚类结果
print(len(set(labels_1)))  # 看看在该临界距离下有几个 cluster

#根据聚类数目返回聚类结果
k = 3
labels_2 = fcluster(Z, t=k, criterion='maxclust')
print(labels_2[: 100])
list(labels_1) == list(labels_2)  # 看看两种不同维度下得到的聚类结果是否一致

#聚类的结果可视化,相同的类的样本点用同一种颜色表示
plt.figure()
plt.scatter(X[:, 0], X[:, 1], c=labels_2, cmap='prism')
plt.show()

 

2.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

2.2.7、对比不同方法聚类效果
from time import time
import numpy as np
from sklearn.datasets import make_blobs
from scipy.cluster.hierarchy import linkage, fcluster
from sklearn.metrics.cluster import adjusted_mutual_info_score
import matplotlib.pyplot as plt

#生成样本点
centers = [[1, 1], [-1, -1], [1, -1]]
X, labels = make_blobs(n_samples=750, centers=centers,
                       cluster_std=0.4, random_state=0)


#可视化聚类结果
def plot_clustering(X, labels, title=None):
    plt.scatter(X[:, 0], X[:, 1], c=labels, cmap='prism')
    if title is not None:
        plt.title(title, size=17)
    plt.axis('off')
    plt.tight_layout()

#进行 Agglomerative 层次聚类
linkage_method_list = ['single', 'complete', 'average', 'ward']

plt.figure(figsize=(10, 8))
ncols, nrows = 2, int(np.ceil(len(linkage_method_list) / 2))
plt.subplots(nrows=nrows, ncols=ncols)
for i, linkage_method in enumerate(linkage_method_list):
    print('method %s:' % linkage_method)
    start_time = time()
    Z = linkage(X, method=linkage_method)
    labels_pred = fcluster(Z, t=3, criterion='maxclust')
    print('Adjust mutual information: %.3f' % adjusted_mutual_info_score(labels, labels_pred))
    print('time used: %.3f seconds' % (time() - start_time))
    plt.subplot(nrows, ncols, i + 1)
    plot_clustering(X, labels_pred, '%s linkage' % linkage_method)
plt.show()

 

4、密度聚类--DBSCAN

4.1、API

sklearn.cluster.DBSCAN
 
导入:
from sklearn.cluster import DBSCAN
 
语法:
DBSCAN(eps=0.5, min_samples=5, metric='euclidean', algorithm='auto', leaf_size=30, p=None, n_jobs=1)
参数:
    eps:两个样本之间的最大距离,即扫描半径
    min_samples :作为核心点的话邻域(即以其为圆心,eps为半径的圆,含圆上的点)中的最小样本数(包括点本身)。
    metric :度量方式,默认为欧式距离,还有metric=‘precomputed’(稀疏半径邻域图)
    algorithm:近邻算法求解方式,有四种:‘auto’, ‘ball_tree’, ‘kd_tree’, ‘brute’
    leaf_size:叶的大小,在使用BallTree or cKDTree近邻算法时候会需要这个参数
    n_jobs :使用CPU格式,-1代表全开


属性:
DBSCAN.core_sample_indices_:核心样本指数。(此参数在代码中有详细的解释)
DBSCAN.labels_:数据集中每个点的集合标签给,噪声点标签为-1。
DBSCAN.components_ :核心样本的副本

方法:
DBSCAN.fit(x)
DBSCAN.predict(x)
DBSCAN.fit_predict(x)
    计算聚类中心并预测每个样本属于哪个类别,相当于先调用fit(x),然后再调用predict(x)

 make_circles的API:

生成数据集,形成一个二维的大圆,包含一个小圆

sklearn.datasets.make_circles

导入:
from sklearn.datasets import make_circles

方法:
x, y = make_circles(n_samples=5000, factor=.6, noise=.05, random_state=1473)
    x为样本特征,y为样本簇类别
    n_samples:样本数,默认=100;
    factor:0 < double <1 默认值0.8,内外圆之间的比例因子
    noise:设置噪声,小的话比较集中

4.2、流程

4.2.1、获取数据
from sklearn import datasets
from sklearn.cluster import DBSCAN

# 获取数据
# 生成两簇非凸数据
x1, y2 = make_blobs(n_samples=1000, n_features=2,
                             centers=[[1.2, 1.2]], cluster_std=[[.1]],
                             random_state=9)

# 一簇对比数据
x2, y1 = datasets.make_circles(n_samples=5000, factor=.6, noise=.05)
x = np.concatenate((x1, x2))
plt.scatter(x[:, 0], x[:, 1], marker='o')
plt.show()

 

4.2.2、数据预处理
4.2.3、特征工程
4.2.4、模型训练
# 实例化学习器
dbs = DBSCAN(eps=0.1, min_samples=12).fit(x)
print('DBSCAN模型:\n', dbs)

# 模型训练+预测
ds_pre = dbs.fit_predict(x)

4.2.5、模型评估
# 用模型计算测试值,得到预测值


# 
# 绘制DBSCAN模型聚类结果
plt.scatter(x[:, 0], x[:, 1], c=ds_pre)
plt.title('DBSCAN', size=17)
plt.show()

 

4.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。

5、高斯混合模型(GMM)

5.1、API

sklearn.cluster.KMeans
 
导入:
from sklearn.cluster import KMeans
 
语法:
KMeans(n_clusters=8,init=‘k-means++’)
    n_clusters:开始的聚类中心数量
    init:初始化方法,默认为'k-means ++’
    labels_:默认标记的类型,可以和真实值比较(不是值比较)

5.2、流程

5.2.1、获取数据

# API导入
from sklearn.mixture import GaussianMixture

# 获取数据
# 生成模拟数据
X, _ = make_blobs(n_samples=300, centers=4, cluster_std=0.60, random_state=0)

5.2.2、数据预处理

5.2.3、特征工程

5.2.4、模型训练

# 实例化学习器
gmm = GaussianMixture(n_components=4)


# 模型训练
gmm.fit(X)

5.2.5、模型评估

# 预测测试集结果
clusters = gmm.predict(X)


# 可视化
plt.scatter(X[:, 0], X[:, 1], c=clusters, cmap='viridis', marker='o', s=50)
plt.title("Gaussian Mixture Model Clustering")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()

 

5.2.6、结果预测

经过模型评估后通过的模型可以代入真实值进行预测。


旧梦可以重温,且看:机器学习(五) -- 无监督学习(1) --聚类1
欲知后事如何,且看:

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1945028.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

微服务(网关路由)

目录 一&#xff1a;网关路由 1&#xff1a;认识网关 2&#xff1a;快速入门 2.1&#xff1a;创建项目 2.2&#xff1a;引入依赖 2.3&#xff1a;启动类 2.4&#xff1a;路由配置 2.5&#xff1a;测试 3&#xff1a;路由过滤 二&#xff1a;网关登录校验 1&…

OpenWrt 为软件包和docker空间扩容

参考资料 【openwrt折腾日记】解决openwrt固件刷入后磁盘空间默认小的问题&#xff0c;关联openwrt磁盘扩容空间扩容【openwrt分区扩容】轻松解决空间可用不足的尴尬丨老李一瓶奶油的YouTube 划分空间 参考一瓶奶油的YouTube 系统 -> 磁盘管理 -> 磁盘 -> 修改 格…

探索Linux-1

Linux是什么&#xff1f; Linux是一个开源的操作系统内核&#xff0c;由林纳斯托瓦兹&#xff08;Linus Torvalds&#xff09;于1991年首次发布。它基于Unix操作系统&#xff0c;但提供了更多的自由和灵活性。Linux内核是操作系统的核心部分&#xff0c;负责管理系统资源、处理…

编程中的智慧四:设计模式总览

前面三篇我们通过从一些零散的例子&#xff0c;和简单应用来模糊的感受了下设计模式在编程中的智慧&#xff0c;从现在开始正式进入设计模式介绍&#xff0c;本篇将从设计模式的7大原则、设计模式的三大类型、与23种设计模式的进行总结&#xff0c;和描述具体意义。 设计模式体…

LeetCode 860柠檬水找零(贪心算法)/406根据身高重建队列(贪心算法)

1. 柠檬水找零 思路分析 只需要维护三种金额的数量&#xff0c;5&#xff0c;10和20。 有如下三种情况&#xff1a; 情况一&#xff1a;账单是5&#xff0c;直接收下。情况二&#xff1a;账单是10&#xff0c;消耗一个5&#xff0c;增加一个10情况三&#xff1a;账单是20&am…

(35)远程识别(又称无人机识别)(二)

文章目录 前言 4 ArduRemoteID 5 终端用户数据的设置和使用 6 测试 7 为OEMs添加远程ID到ArduPilot系统的视频教程 前言 在一些国家&#xff0c;远程 ID 正在成为一项法律要求。以下是与 ArduPilot 兼容的设备列表。这里(here)有一个关于远程 ID 的很好解释和常见问题列表…

【linux】Shell脚本三剑客之awk命令的详细用法攻略

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全…

[用AI日进斗金系列③]用CodeFlying在企微接单自动生成一个固定资产管理系统

今天是【日进斗金】系列的第三期文章。 给新朋友简单介绍一下&#xff0c;我们这个系列主要是教大家如何在企业微信的工作台上接单赚米。 详细介绍可以看看前两期的文章 [用AI日进斗金系列]用码上飞在企微接单开发一个项目管理系统&#xff01;-CSDN博客 [用AI日进斗金系列…

【Android】性能实践—编码优化与布局优化学习笔记

【Android】性能实践—编码优化与布局优化学习笔记 编码优化 使用场景 如果需要拼接字符串&#xff0c;优先使用StringBuffer和StringBuilder进行凭借&#xff0c;他们的性能优于直接用加号进行拼接&#xff0c;因为使用加号连接符会创建多余的对象一般情况下使用基本数据类…

有监督学习基础

基本概念 给定输入有为&#xff08;x,y&#xff09;&#xff0c;其中x表示学习特征&#xff0c;y表示输出&#xff0c;m表示输入总数&#xff0c;有监督学习旨在根据输入建立能够预测可能输出的模型&#xff0c;大致可以分为回归和分类两种&#xff0c;代表可能输出是无限的或…

vue 实战 tab标签页+el-card+流式布局+异步接口调用

<template><div><!-- 布局按钮 --><el-button click"dialogVisible true">布局配置查看</el-button><!-- 布局配置对话框 --><el-dialog :visible.sync"dialogVisible" title"布局配置查看" width"…

nature reviews genetics | 单细胞基因组eQTL发展历程

– https://doi.org/10.1038/s41576-023-00599-5 留意更多内容&#xff0c;欢迎关注微信公众号&#xff1a;组学之心 Single-cell genomics meets human genetics 单细胞基因组技术已经扩展到可以检测数千个个体的样本的程度。将大规模的单细胞信息与基因型数据相结合&#x…

STM32F103C8T6基于YMODEM协议的串口IAP升级实践

一.为什么要做IAP升级 1.不易拆卸的设备&#xff0c;可以使用IAP升级&#xff0c;方便用户升级固件 2.YMODEM协议是串口传输协议&#xff0c;传输速率较高&#xff0c;传输文件较大时&#xff0c;传输时间较短 3.不想给别人源代码&#xff0c;但是项目有bug&#xff0c;需要修…

【PLC】三菱FX3U下载程序通讯中断问题解决方法之一

博主最近买了一个三菱PLC FX3U&#xff0c;然后随意在GX Works中编写了一段带有子程序的程序&#xff0c;后来发现刷写程序过程中&#xff0c;会突然出现通讯中断的情况&#xff0c;然后切断PLC电源&#xff0c;变更COM口&#xff0c;重启PLC后&#xff0c;通讯才可以连接上&am…

鸿蒙OpenHarmony Native API【drawing_pen.h】 头文件

drawing_pen.h Overview Related Modules: [Drawing] Description: 文件中定义了与画笔相关的功能函数 Since: 8 Version: 1.0 Summary Enumerations Enumeration NameDescription[OH_Drawing_PenLineCapStyle] { [LINE_FLAT_CAP], [LINE_SQUARE_CAP], [LINE_ROUND_…

PMP考试难度大吗?

由于目前的PMP考试主要以新大纲为主&#xff0c;许多内容都已经发生了变化&#xff0c;因此学习新内容以适应这些变化仍然是非常必要的。 一、新版考试题量和答题时间有何变化&#xff1f; 题量由200道减少到180道&#xff0c;因此答题时间相对更充裕。 二、新版考试的整体难…

洛谷 P1035 [NOIP2002 普及组] 级数求和 题解

思路1&#xff08;68分&#xff0c;测3&#xff0c;测5TLE&#xff09; &#xff1a; #include<bits/stdc.h> using namespace std; int a[100005]; int main() {int k,i;cin >> k;for(i1;;i){double sum0;//要在这里初始化for(int j1;j<i;j){double s1*1.0/j;…

php接口返回的json字符串,json_decode()失败,原来是多了红点

问题&#xff1a; 调用某个接口返回的json&#xff0c;json_decode()失败&#xff0c;返回数据为null&#xff0c; echo json_last_error();返回错误码 4 经过多次调试发现&#xff1a;多出来一个红点&#xff0c;预览是看不到的。 解决&#xff1a;要去除BOM头部 $resul…

Pytorch transforms 的研究

绝对路径与相对路径差别 transforms的使用 from torchvision import transforms from PIL import Imageimg_path "dataset/train/bees/16838648_415acd9e3f.jpg" img Image.open(img_path) tensor_trans transforms.ToTensor() tensor_img tensor_trans(img) prin…

优选算法之二分查找(上)

目录 一、二分查找 1.题目链接&#xff1a;704. 二分查找 2.题目描述&#xff1a; 3.算法流程&#xff1a; 4.算法代码&#xff1a; 二、在排序数组中查找元素的第一个和最后一个位置 1.题目链接&#xff1a;34. 在排序数组中查找元素的第一个和最后一个位置 2.题目描述…