sklearn机器学习——day07

2023-10-27

无监督学习:聚类,分类

聚类算法又叫做“无监督分类”,其目的是将数据划分成有意义或有用的组(或簇)

 

 sklearn当中的聚类算法

有两种表现形式:类、函数

KMeans是如何工作的

 

 

 重要参数n_clusters

n_clusters是KMeans中的k,表示着我们告诉模型我们要分几类。这是KMeans当中唯一一个必填的参数,默认为8 类,但通常我们的聚类结果会是一个小于8的结果。通常,在开始聚类之前,我们并不知道n_clusters究竟是多少, 因此我们要对它进行探索。

#创建一个数据集
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
#自己创建数据集
X, y = make_blobs(n_samples=500,n_features=2,centers=4,random_state=1)
fig, ax1 = plt.subplots(1)
ax1.scatter(X[:, 0], X[:, 1]
           ,marker='o' #点的形状
           ,s=8 #点的大小
           )
plt.show()
#如果我们想要看见这个点的分布,怎么办?
color = ["red","pink","orange","gray"]
fig, ax1 = plt.subplots(1)
for i in range(4):
    ax1.scatter(X[y==i, 0], X[y==i, 1]
           ,marker='o' #点的形状
           ,s=8 #点的大小
           ,c=color[i]
           )
plt.show()

#基于这个分布,我们来使用Kmeans进行聚类
from sklearn.cluster import KMeans
n_clusters = 3
cluster = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
y_pred = cluster.labels_
y_pred
pre = cluster.fit_predict(X)
pre == y_pred
cluster_smallsub = KMeans(n_clusters=n_clusters, random_state=0).fit(X[:200])
y_pred_ = cluster_smallsub.predict(X)
y_pred == y_pred_
centroid = cluster.cluster_centers_
centroid
centroid.shape
inertia = cluster.inertia_
inertia
color = ["red","pink","orange","gray"]
fig, ax1 = plt.subplots(1)
for i in range(n_clusters):
    ax1.scatter(X[y_pred==i, 0], X[y_pred==i, 1]
           ,marker='o'
           ,s=8
           ,c=color[i]
           )
ax1.scatter(centroid[:,0],centroid[:,1]
           ,marker="x"
           ,s=15
           ,c="black")
plt.show()
n_clusters = 4
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
inertia_ = cluster_.inertia_
inertia_
n_clusters = 5
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
inertia_ = cluster_.inertia_
inertia_
n_clusters = 6
cluster_ = KMeans(n_clusters=n_clusters, random_state=0).fit(X)
inertia_ = cluster_.inertia_
inertia_
 

 案例:轮廓系数找最佳n_clusters

from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score
import matplotlib.pyplot as plt
import matplotlib.cm as cm
import numpy as np
n_clusters = 4
fig, (ax1, ax2) = plt.subplots(1, 2)
fig.set_size_inches(18, 7)
ax1.set_xlim([-0.1, 1])
ax1.set_ylim([0, X.shape[0] + (n_clusters + 1) * 10])
clusterer = KMeans(n_clusters=n_clusters, random_state=10).fit(X)
cluster_labels = clusterer.labels_
silhouette_avg = silhouette_score(X, cluster_labels)
print("For n_clusters =", n_clusters,
      "The average silhouette_score is :", silhouette_avg)
sample_silhouette_values = silhouette_samples(X, cluster_labels)
y_lower = 10
for i in range(n_clusters):
    ith_cluster_silhouette_values = sample_silhouette_values[cluster_labels == i]
    ith_cluster_silhouette_values.sort()
    size_cluster_i = ith_cluster_silhouette_values.shape[0]
    y_upper = y_lower + size_cluster_i
    color = cm.nipy_spectral(float(i)/n_clusters)
    ax1.fill_betweenx(np.arange(y_lower, y_upper)
                     ,ith_cluster_silhouette_values
                     ,facecolor=color
                     ,alpha=0.7
                     )
    ax1.text(-0.05
             , y_lower + 0.5 * size_cluster_i
             , str(i))
    y_lower = y_upper + 10
ax1.set_title("The silhouette plot for the various clusters.")
ax1.set_xlabel("The silhouette coefficient values")
ax1.set_ylabel("Cluster label")
ax1.axvline(x=silhouette_avg, color="red", linestyle="--")
ax1.set_yticks([])
ax1.set_xticks([-0.1, 0, 0.2, 0.4, 0.6, 0.8, 1])
colors = cm.nipy_spectral(cluster_labels.astype(float) / n_clusters)
ax2.scatter(X[:, 0], X[:, 1]
           ,marker='o'
           ,s=8
           ,c=colors
           )
centers = clusterer.cluster_centers_
# Draw white circles at cluster centers
ax2.scatter(centers[:, 0], centers[:, 1], marker='x',
            c="red", alpha=1, s=200)
ax2.set_title("The visualization of the clustered data.")
ax2.set_xlabel("Feature space for the 1st feature")
ax2.set_ylabel("Feature space for the 2nd feature")
plt.suptitle(("Silhouette analysis for KMeans clustering on sample data "
              "with n_clusters = %d" % n_clusters),
             fontsize=14, fontweight='bold')
plt.show()

重要参数init & random_state & n_init:让初始质心放好 

重要参数max_iter & tol:让迭代停下来

案例:Kmeans做矢量量化 

非结构化数据往往占用比较 多的储存空间,文件本身也会比较大,运算非常缓慢,我们希望能够在保证数据质量的前提下,尽量地缩小非结构 化数据的大小,或者简化非结构化数据的结构。矢量量化就可以帮助我们实现这个目的。即压缩大小

#导入需要的库
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
from sklearn.metrics import pairwise_distances_argmin
from sklearn.datasets import load_sample_image
from sklearn.utils import shuffle

#导入数据,探索数据
china = load_sample_image("china.jpg")
china
china.dtype
china.shape
china[0][0] 
newimage = china.reshape((427 * 640,3))
import pandas as pd
pd.DataFrame(newimage).drop_duplicates().shape
plt.figure(figsize=(15,15))
plt.imshow(china)
flower = load_sample_image("flower.jpg")
plt.figure(figsize=(15,15))
plt.imshow(flower)

#决定超参数,数据预处理
n_clusters = 64
china = np.array(china, dtype=np.float64) / china.max()
w, h, d = original_shape = tuple(china.shape)
assert d == 3
image_array = np.reshape(china, (w * h, d))
china = np.array(china, dtype=np.float64) / china.max()
w, h, d = original_shape = tuple(china.shape)
w
h
d
assert d == 3
d_ = 5
assert d_ == 3, "一个格子中的特征数目不等于3种"
image_array = np.reshape(china, (w * h, d))
image_array
image_array.shape
a = np.random.random((2,4))
a
a.reshape((4,2))
np.reshape(a,(4,2))
np.reshape(a,(2,2,2))
np.reshape(a,(3,2))

#对数据进行K-Means的矢量量化
image_array_sample = shuffle(image_array, random_state=0)[:1000]
kmeans = KMeans(n_clusters=n_clusters, random_state=0).fit(image_array_sample)
kmeans.cluster_centers_
labels = kmeans.predict(image_array)
labels.shape
image_kmeans = image_array.copy()
for i in range(w*h):
    image_kmeans[i] = kmeans.cluster_centers_[labels[i]]
image_kmeans
pd.DataFrame(image_kmeans).drop_duplicates().shape
image_kmeans = image_kmeans.reshape(w,h,d)
image_kmeans.shape

#对数据进行随机的矢量量化
centroid_random = shuffle(image_array, random_state=0)[:n_clusters]
labels_random = pairwise_distances_argmin(centroid_random,image_array,axis=0)
labels_random.shape
len(set(labels_random))
image_random = image_array.copy()
for i in range(w*h):
    image_random[i] = centroid_random[labels_random[i]]
image_random = image_random.reshape(w,h,d)
image_random.shape

# 将原图,按KMeans矢量量化和随机矢量量化的图像绘制出来
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Original image (96,615 colors)')
plt.imshow(china)
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Quantized image (64 colors, K-Means)')
plt.imshow(image_kmeans)
plt.figure(figsize=(10,10))
plt.axis('off')
plt.title('Quantized image (64 colors, Random)')
plt.imshow(image_random)
plt.show()

 

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sklearn机器学习——day07 的相关文章

随机推荐

  • 【Unity3D游戏开发学习笔记】(七)上帝之眼—第三人称摄像机的简单实现(跟随视角,自由视角)

    陆陆续续又开始更新自己的博客 看来自我驱动能力还是不够啊 废话不多说了 之前的内容大概说了一下Unity的一些基础知识 接下来我们将要对一些基本功能做一些学习 大家都知道 一个游戏 少不了摄像机的参与 这不是废话么 没摄像机怎么玩 画面都不
  • linux脚本的注释符号是什么,Shell中的变量和符号

    Shell中的变量 变量 shell 变量 可以保存如路径名 文件名或者一个数字 变量名称可以由字母 数字和下划线组成 但是不能以数字开头 如果变量名是 2name 则是错误的 在Bash中 变量的默认类型都是字符串型 如果要进行数值运算
  • log4j2史诗级漏洞攻击重现

    早上来到公司 就听到安全团队的同事说log4j2有个高危漏洞 起初并不是很在意 想着一个日志框架能有啥高危漏洞嘛 但是仔细一看 居然是远程执行命令的漏洞 上次看到这个名字还是struts2 修复方法也很简单 升级log4j依赖版本到2 15
  • vue【element ui】el-date-picker 日期选择器控件 限制可选的开始时间和结束时间

    项目场景 总结一下日期控件实现开始日期 结束日期的选择范围限制 以便更符合实际情况 需求 1 开始时间和结束时间都不能选当前日期之后的时间 当前时间 2022年5月16日 2 先选开始时间的话 结束时间是在开始时间的后一周内选择 也就是不能
  • 实习中了解的互联网数仓

    大数据平台 之前在两家互联网企业都做过数仓相关方面的实习岗位 一家中大厂 一家大厂 在这里简单分享一些数仓在企业中实际的运作 方便一些对数仓有兴趣但尚未在企业中数仓岗位实践过的同学了解 数据开发平台 一般来说 中型或大型企业都会有自己的大数
  • 【Shell编程】条件判断

    系列文章 Shell编程 Shell中的正则表达式 Shell编程 字符截取命令cut printf命令 Shell编程 字符截取命令awk sed命令 目录 系列文章 按照文件类型进行判断 实例 测试上一条命令是否执行成功 编写一个she
  • 建立图(邻接矩阵、邻近表任选其一)的存储结构、实现图的深度优先遍历和广度优先遍历。

    include
  • Qt connect 中, SIGNAL,SLOT 与 lambda 对比

    简单的信息就不说了 主要谈谈区别 首先结论是 推荐用 lambda 格式绑定信号槽 个人看法 有其他建议欢迎讨论 具体原因如下 SIGNAL SLOT 是 Qt4 时期的方法 lambda 是 Qt5 引入的 新的总比老的好 SIGNAL
  • Java之spring新手教程(包教包会)

    Java Spring 一 之IoC以及bean的生命周期 文章目录 Java Spring 一 之IoC以及bean的生命周期 一 什么是Spring 二 Spring的核心 三 什么是耦合 四 spring项目的搭建 五 配置文件 六
  • js逆向 极验滑块(记录学习 3.17)

    目录 一 分析整体流程 1 点击按钮之前 2 点击按钮之后 3 滑动之后 二 还原底图 三 跟W值 aa 四 部分代码 目标网站 aHR0cHM6Ly93d3cuZ2VldGVzdC5jb20vZGVtby9zbGlkZS1mbG9hdC5
  • 服务启动后停止 mysql5.7不能启动(mysqld --initialize 命令)不能解决?看这里!!!

    mysqld initialize 命令创建了date文件之后还是不能启动mysql的解决办法 win10 mysql5 7 今天因为测试的原因 关掉了本机的mysql数据库服务 然后启动报错 然后就开始了为期两小时的寻找之路 第一种方法
  • [极客大挑战 2019]HardSQL

    我们用万能密码试了一下发现不可行 正常注入发现会过滤and 空格 但没过滤or 可以结合报错注入来做 extractvalue 1 concat 07xe 执行语句 updatexml 1 concat 07xe 执行语句 1 这里面我们用
  • 学习笔记-二分法查找

    二分法查找 要求必须是一个有序数组 才可以进行二分法查找 二分法运用到了递归回溯的思想 思路 1 确定中间数的坐标 mid left right 2 2 如果中间数大于查询的数 说明查询的数在左边 向左递归继续查询 此时left不变 rig
  • Vijava 学习笔记之ResourcePool(基础配置信息)

    Vijava 代码 实体类 package com vmware pojo import java util ArrayList import java util Calendar import java util Date 虚拟机信息 a
  • js引入mathjax时注意事项

    首先 保证网络畅通 必须网络好 不然js响应不回来 需要先在head标签中引入js
  • (阿里云)使用WordPress搭建一个专属自己的博客

    一 创建资源 在页面左侧 单击 云产品资源 下拉列表 查看本次实验所需资源 单击屏幕右侧 创建资源 免费创建当前实验所需云产品资源 说明 资源创建过程需要1 3分钟 完成实验资源的创建后 您可以在 云产品资源 列表查看已创建的资源信息 例如
  • 浅析ARM公司在物联网领域的战略布局

    原文地址 http blog csdn net yefanqiu article details 17006331 随着ARM芯片的出货量越来越多 自信满满的ARM公司统一软硬件平台的战略和雄心壮志越来越凸显 最初ARM公司仅是出售自己的知
  • 解决VMware出现“磁盘实用工具不可用”

    可能有人想用vmware的磁盘映射 但是磁盘映射按钮是灰色的 按钮上面还有一行字 磁盘实用工具不可用 我也遇到过这个问题 上网查了一下 结果网上愣是没有一篇博客说明了这个问题 我想 难道这些人从来没遇到过吗 后来 经过自己的实验 我发现了解
  • 一次serialVersionUID引发的血案

    背景 去掉了两个bean类中重写的equals方法 该equals方法只判断id 相同则true 否则false 看了看没有什么地方用到了这个equals 就直接去掉了 测试环境出现异常 org springframework core c
  • sklearn机器学习——day07

    无监督学习 聚类 分类 聚类算法又叫做 无监督分类 其目的是将数据划分成有意义或有用的组 或簇 sklearn当中的聚类算法 有两种表现形式 类 函数 KMeans是如何工作的 重要参数n clusters n clusters是KMean