Machine Learning机器学习(学习记录)

news2024/9/24 9:24:25

Machine Learning机器学习

目录

  • Machine Learning机器学习
  • 聚类
    • K-Means
      • 基本思路
      • k均值算法流程
        • k均值算法的特点
          • k-均值算法的优点:
          • k-均值算法的缺点:
      • sklearn实现KMeans
    • K-Means++算法
      • 基本思路
      • 代码实现
        • K-Means++Python代码实现
        • sklearn实现K-Means++
      • 参考:

聚类

K-Means

基本思路

k-均值(k-means )算法是一种划分聚类算法,其目标是将一个没有标签的数据集中的N个数据对象(实例) 划分为k个簇,使得每个簇内的数据对象具有高度的相似性,不同簇间的数据对象具有较大的差异性。
k-均值算法具有一个迭代过程,在这个过程中,数据集被分组成k个预定义的不重叠的簇,使簇的内部点尽可能相似,同时试图保持簇在不同的空间,它将数据点分配给簇,以便簇的质心和数据点之间的平方距离之和最小,在这个位置,簇的质心是簇中数据点的算术平均值。

k均值算法流程

在这里插入图片描述
在这里插入图片描述

k均值算法的特点

k-均值算法的优点:
  1. 原理比较简单,容易实现,收敛速度快,可解释性较好。
  2. 需要调节的参数较少(主要是聚类簇数 k ),且聚类效果较好。
k-均值算法的缺点:
  1. 聚类簇数 k 值的选取不好把握,一般只能通过暴力搜索法来确定。
  2. 只适合簇型数据,对其他类型的数据聚类效果一般。
  3. 如果各隐含类别的数据不平衡,则聚类效果不佳。
  4. 采用迭代方法,得到的结果只是局部最优。
  5. 当数据量较大时,计算量也比较大,采用小批量 k-均值的方式虽然可以缓解,但可能会牺牲准确率。
  6. 对噪音和异常点比较的敏感。

sklearn实现KMeans

在这里插入图片描述

# -*- encoding : utf-8 -*-
"""
@project = sklearn_learning_01
@file = KMeans算法
@author = wly
@create_time = 2022/12/6 15:38
"""

from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
import pandas as pd
from sklearn.metrics import silhouette_score
from sklearn.metrics import silhouette_samples
from sklearn.metrics import calinski_harabasz_score
from time import time

if __name__ == '__main__':
    # 自己创建数据集
    X, y = make_blobs(n_samples=500, n_features=2, centers=4, random_state=1)

    ax1 = plt.subplot(1, 2, 1)
    plt.title("unlabeled")
    ax1.scatter(X[:, 0], X[:, 1],
                marker='o',  # 点的形状
                s=8)  # 点的大小

    color = ["red", "pink", "orange", "gray"]
    ax2 = plt.subplot(1, 2, 2)
    plt.title("labeled")
    for i in range(4):
        ax2.scatter(X[y == i, 0], X[y == i, 1],
                    marker='o',
                    c=color[i],
                    s=8)
    plt.show()

    # 基于这个分布,使用KMeans进行聚类
    n_clusters = 3

    # KMeans因为并不需要建立模型或者预测结果,因此我们只需要fit就能够得到聚类结果了
    # KMeans也有接口predict和fit_predict,表示学习数据X并对X的类进行预测
    cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
    y_pred = cluster.labels_
    # print(y_pred.shape)
    # pre = cluster.fit_predict(X)
    # print(pre == y_pred)

    # 其实不必使用所有的数据来寻找质心,少量的数据就可以帮助确定质心
    # 当数据量非常大的时候,可以使用部分数据来帮助确认质心
    cluster_smallsub = KMeans(n_clusters=n_clusters, random_state=0).fit(X[:200])
    y_pred_2 = cluster_smallsub.predict(X)
    # 数据量非常大的时候,效果会好
    # 如果数据量还行,不是特别大,直接使用fit之后调用属性.labels_提出来
    print(pd.value_counts(y_pred_2 == y))

    # 重要属性cLuster_centers_,查看质心
    centroids = cluster.cluster_centers_
    print("得到质心如下:")
    print(centroids)
    print("centroids shape = ", centroids.shape)

    # 重要属性inertia_,查看总距离平方和
    inertia = cluster.inertia_
    print("inertia = ", inertia)

    ax1 = plt.subplot(1, 2, 1)
    plt.title("initial unlabeled")
    ax1.scatter(X[:, 0], X[:, 1],
                marker='o',  # 点的形状
                s=8)  # 点的大小

    color = ["red", "pink", "orange", "gray"]
    ax2 = plt.subplot(1, 2, 2)
    plt.title("predict labeled")
    for i in range(n_clusters):
        ax2.scatter(X[y_pred == i, 0], X[y_pred == i, 1],
                    marker='o',
                    s=8,
                    c=color[i])
        ax2.scatter(centroids[:, 0], centroids[:, 1],
                    marker='x',
                    s=15,
                    c="black")
    plt.show()

    # 如果把聚类数换成4
    n_clusters = 4
    cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
    inertia_ = cluster_.inertia_
    print("current n_cluster = ", n_clusters)
    print("inertial = ", inertia_)

    # 如果把聚类数换成6
    n_clusters = 6
    cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
    inertia_ = cluster_.inertia_
    print("current n_cluster = ", n_clusters)
    print("inertial = ", inertia_)

    # 聚类算法的模型评估指标:当真实标签未知的时候:轮廓系数
    # 计时 轮廓系数
    t0 = time()
    print("silhouette_score(n_cluster = 3) = ", silhouette_score(X, y_pred))
    t1 = time()
    print("silhouette_score 所需时间为:", t1 - t0)

    # 聚类数为6时
    print("silhouette_score = ", silhouette_score(X, cluster_.labels_))

    # silhouette_sample,它的参数与轮廓系数一致,但返回的
    # 是数据集中每个样本自己的轮廓系数。
    print(silhouette_samples(X, y_pred).shape)
    print(silhouette_samples(X, y_pred).mean())

    # 卡林斯基-哈拉巴斯指数
    # 计时 卡林斯基-哈拉巴斯指数
    # ,calinski-harabaz指数比轮廓系数的计算块了一倍不止
    t0 = time()
    print("calinski_harabasz_score = ", calinski_harabasz_score(X, y_pred))
    t1 = time()
    print("calinski_harabasz_score 所需时间为:", t1 - t0)

在这里插入图片描述
在这里插入图片描述

False 371
True 129
dtype: int64
得到质心如下:
[[-8.0807047 -3.50729701]
[-1.54234022 4.43517599]
[-7.11207261 -8.09458846]]
centroids shape = (3, 2)
inertia = 1903.5607664611764
current n_cluster = 4
inertial = 908.3855684760615
current n_cluster = 6
inertial = 733.1538350083081
silhouette_score(n_cluster = 3) = 0.5882004012129721
silhouette_score 所需时间为: 0.004983186721801758
silhouette_score = 0.5150064498560357
(500,)
0.5882004012129721
calinski_harabasz_score = 1809.991966958033
calinski_harabasz_score 所需时间为: 0.0009975433349609375

K-Means++算法

K-Means++算法是K-Means算法的改进版,主要是为了选择出更优的初始聚类中心
在这里插入图片描述

基本思路

  • 在数据集中随机选择一个样本作为第一个初始聚类中心;
  • 选择其余的聚类中心:
    1、计算数据集中每一个样本与已经初始化的聚类中心之间的距离,并选择其中最短的距离,记为di
    2、以概率选择距离最大的样本作为新的聚类中心,重复上述过程,直到k个聚类中心点被确定。
  • 对k个初始的聚类中心,利用K-Means算法计算出最终的聚类中心。

对“以概率选择距离最大的样本作为新的聚类中心”的理解:
即初始的聚类中心之间的相互距离应尽可能的远。假如有3 、 5 、 15 、 10 、 2 这五个样本的最小距离d i ,则其和sum为35,然后乘以一个取值在[ 0 , 1 )范围的值,即概率,也可以称其为权重,然后这个结果不断减去样本的距离d i ,直到某一个距离使其小于等于0,这个距离对应的样本就是新的聚类中心。

大概理解如图

代码实现

K-Means++Python代码实现

sklearn实现K-Means++

参考:

1、https://blog.csdn.net/qq_42730750/article/details/107119433
2、https://www.cnblogs.com/shelocks/archive/2012/12/20/2826787.html
3、k-means及k-means++原理【python代码实现】

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

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

相关文章

[附源码]Python计算机毕业设计Django小太阳幼儿园学生管理系统

项目运行 环境配置: Pychram社区版 python3.7.7 Mysql5.7 HBuilderXlist pipNavicat11Djangonodejs。 项目技术: django python Vue 等等组成,B/S模式 pychram管理等等。 环境需要 1.运行环境:最好是python3.7.7,…

基于Intel Lake-UP3平台的超声设备方案设计,提供出色的图形和AI性能

超声系统要求 有效的超声系统可加快诊断速度,并帮助医生更快做出更有效的治疗决策。 为此,超声机器要求极高的处理性能和图形渲染效果以提高诊断准确性,并立即获取精确的图像。 类似地,还需要易于移动以适应不断变化的医疗场景和…

p1.第一章 基础入门 -- Python开发环境安装 (一)

1.基础入门 1.1 环境安装 1.1.1 windows环境安装 Python下载地址:https://www.python.org/downloads/ 1.1.1.1 python多版本安装 下载并安装3.6.8 下载Windows x86-64 executable installer,python 3.6.8下载地址:https://www.python.o…

章鱼网络社区治理的4种方式

全长1810字,预计阅读 8 分钟 作者:MiX 2021年10月8日章鱼网络主网启动的时候,创始人 Louis 曾代表核心团队承诺:用3年的时间让章鱼网络转化成一个完全由社区所有,并由社区管理的去中心化协议。 我们认为3年的过渡期是…

【Java】之Java8新特性

Java 基础系列的笔记终于完成了🎉🎉🎉 目录 一、Lambda 表达式 1. Lamdba 表达式概述 2. 使用 Lambda 表达式前后对比 3. 怎样使用Lambda表达式 4. Lamdba表达式总结 二、函数式接口 1. 函数式接口概述 3. Java内置函数式接口 4. 使…

我是怎么从软件测试转到自动化测试岗的?亲身经历分享

相信很多人接触软件测试岗位,都纯功能界面的测试,我也不例外。那个时候是在一广州一家电商公司做测试,做了也有一段时间,熟悉了产品业务流程以及熟练测试工作流程规范之后,效率提高了,工作比较轻松&#xf…

电子电气架构设计需要考虑哪些方面?

当前车辆日益复杂,车联网功能在各个细分领域都在不断增加,而更强大的智能功能也逐步增加。 所有这些高级功能都依赖于线束和控制器才能发挥作用。然而面对日益增加的车辆复杂性和产品开发周期缩短的压力,导致汽车制造商和系统集成商的成本和…

VMware Workstation 12 安装windows_server_2016

步骤: (1)去微软官网去下载windows_server_2016 iso镜像文件,链接:https://www.microsoft.com/zh-cn/evalcenter/download-windows-server-2016 (2)创建新的虚拟机 (3)…

动态规划算法(4)01背包问题

文章目录01背包完整代码滚动数组优化:01背包完整代码上节回顾: 动态规划(3)最大方案数问题 01背包 问题引入: 有n个物品,每个物品的重量分别是 weight[i],每个物品的价值分别是 value[i]。你有…

11场面试无一被拒!Alibaba Java面试参考指南真香

今年基本算是结束了,很多小伙伴都开始准备明年的金三银四了。准备面试肯定是要想办法提升自己的面试能力,这个时候如果还去一昧地提升自己的代码能力对面试是毫无帮助的。大多数人在面试的时候都会遇到以下几种情况(大家可以看看自己中了几个…

Redis深度历险

开篇:授人以鱼不若授人以渔—— Redis 可以用来做什么? 小册的内容范围 并没有涵盖 Redis 全部的内容知识点,比如 Redis 内置的 lua 脚本引擎就完全没有提 到Redis 基础数据结构Redis 有 5 种基础数据结构,分别为:stri…

[2022-12-06]神经网络与深度学习hw11 - 各种优化算法比较

contentshw11 - 优化算法比较写在开头task1题目内容题目思路题目解答题目总结task2题目内容题目思路题目解答题目总结task3题目内容题目思路题目解答题目总结task4题目内容题目思路题目解答题目总结task5题目内容题目解答题目总结task6题目内容题目解答task7题目内容题目解答hw…

Git代码提交规范

Git代码提交规范 1.安装commitizen和cz-customizable npm install -g commitizen4.2.4 npm i cz-customizable6.3.0 --save-dev2.在package.json中进行新增 "config": {"commitizen": {"path": "node_modules/cz-customizable"} }{…

Linux系统移植五:启动开发板并测试

往期文章 Linux系统移植一:移植U-BOOT 添加自己的板子并编译(非petalinux版) Linux系统移植二:生成fsbl引导文件并制作BOOT.bin Linux系统移植三:移植Kernel生成zImage和dtb文件 Linux系统移植四:Petalinu…

链接概念介绍

链接器 为了更好地理解计算机程序的编译和链接的过程,我们简单地回顾计算机程序开发的历史一定会非常有益。计算机的程序开发并非从一开始就有着这么复杂的自动化编译、链接过程。原始的链接概念远在高级程序语言发明之前就已经存在了,在最开始的时候&a…

Ubuntu - 搭建samba服务器

安装samba程序 使用如下命令安装samba sudo apt-get install samba sudo apt-get install smbclient验证是否安装成功,查看samba版本 samba -V配置samba服务器 samba的配置文件所在位置为:/etc/samba/smb.conf,使用vim命令修改配置 sudo…

[激光原理与应用-40]:《光电检测技术-7》- 常见光干涉仪及其应用

目录 第1章 干涉仪概述 1.1 什么是干涉仪 1.2 基本原理 1.3 分类 1.4 应用 1.5 干涉仪的类型 第2章 常见光干涉仪 2.1 迈克尔逊干涉仪 2.2 泰曼-格林干涉仪 2.3 移相干涉测量仪 2.4 菲索共路干涉仪 第1章 干涉仪概述 1.1 什么是干涉仪 干涉仪是很广泛的一类实验技…

Vue3中 子组件v-model绑定props接收到的父组件值报update:modelValue错

开发过程中二次封装了一个搜索的组件,子组件内使用了el-select和el-input 参数分别对应父组件传入的selectValue和selectText参数 子组件内部change和input事件来同步触发组件中数据的修改 最终本地开发环境一切正常,部署到测试环境和生产环境后出现下…

java测试示例-生成ULID

ULID全称Universally Unique Lexicographically Sortable Identifier,直译就是通用唯一按字典排序的标识符,原始仓库是https://github.com/ulid/javascript,由前端开发者alizain发起,基于JavaScript语言。从项目中的commit历史来看…

基于java(ssm)留学生交流互动论坛系统源码(java毕业设计)

基于java(ssm)留学生交流互动论坛系统 留学生交流互动论坛系统,是基于java编程语言,mysql数据库,ssm框架和idea工具开发,本系统主要分为留学生,管理员两个角色,其中留学生可以注册登…