机器学习——聚类算法

简介: 机器学习——聚类算法

下面是一个例子,根据啤酒中配料含量的不同进行聚类,以划分出不同品牌的啤酒


1、导入数据并处理


import pandas as pd
beer = pd.read_csv('data.txt', sep=' ')
beer

image.png

image.png

X = beer[["calories","sodium","alcohol","cost"]]
# 当需要用K-means来做聚类时导入KMeans函数
from sklearn.cluster import KMeans
km = KMeans(n_clusters=3).fit(X)
km2 = KMeans(n_clusters=2).fit(X)
# 直接在数据中添加cluster和cluster2两列
beer['cluster'] = km.labels_
beer['cluster2'] = km2.labels_
beer.sort_values('cluster')

image.png

image.png


2、计算划分后各维均值


# 下面的错误的写法,plotting已经被提了出来
## from pandas.tools.plotting import scatter_matrix
from pandas.plotting import scatter_matrix
%matplotlib inline
cluster_centers = km.cluster_centers_
cluster_centers_2 = km2.cluster_centers_
beer.groupby("cluster").mean()

image.png

beer.groupby("cluster2").mean()

image.png


3、绘图分析


下面是calories和Alcohol两个维度上的聚类结果


# 设置中心点
centers = beer.groupby("cluster").mean().reset_index()
# 绘制3堆的聚类效果
%matplotlib inline
import matplotlib.pyplot as plt
plt.rcParams['font.size'] = 14
# 设置四种颜色
import numpy as np
colors = np.array(['red', 'green', 'blue', 'yellow'])
# 绘图
plt.scatter(beer["calories"], beer["calories"],c=colors[beer["cluster"]])
plt.scatter(centers.calories, centers.alcohol, linewidths=3, marker='+', s=300, c='black')
plt.xlabel("Calories")
plt.ylabel("Alcohol")
Text(0, 0.5, 'Alcohol')

image.png


把聚类后两两特征的散点图分别进行绘制


  • K = 3时的结果
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster"]], figsize=(10,10))
plt.suptitle("With 3 centroids initialized")
Text(0.5, 0.98, 'With 3 centroids initialized')

image.png


  • K = 2时的结果
scatter_matrix(beer[["calories","sodium","alcohol","cost"]],s=100, alpha=1, c=colors[beer["cluster2"]], figsize=(10,10))
plt.suptitle("With 2 centroids initialized")
Text(0.5, 0.98, 'With 2 centroids initialized')

image.png


4、轮廓系数分析


由于以上的k = 2或者3时的区别不大,可以引入轮廓系数进行分析,这是评价聚类效果好坏的方式。

image.png

  • 计算样本i到同簇其他样本的平均距离ai。ai 越小,说明样本i越应该被聚类到该簇。将ai 称为样本i的簇内不相似度。
  • 计算样本i到其他某簇Cj 的所有样本的平均距离bij,称为样本i与簇Cj 的不相似度。定义为样本i的簇间不相似度:bi =min{bi1, bi2, …, bik}
  • si接近1,则说明样本i聚类合理
  • si接近-1,则说明样本i更应该分类到另外的簇
  • 若si 近似为0,则说明样本i在两个簇的边界上。
from sklearn import metrics
score_scaled = metrics.silhouette_score(X,beer.scaled_cluster)
score = metrics.silhouette_score(X,beer.cluster)
print(score_scaled, score)
scores = []
for k in range(2,20):
    labels = KMeans(n_clusters=k).fit(X).labels_
    score = metrics.silhouette_score(X, labels)
    scores.append(score)
plt.plot(list(range(2,20)), scores)
plt.xlabel("Number of Clusters Initialized")
plt.ylabel("Sihouette Score")
0.6731775046455796 0.6731775046455796
Text(0, 0.5, 'Sihouette Score')

image.png


从图中可以看出,当n_clusters = 2时,轮廓系数更接近与1,更合适。但是在聚类算法中,评估方法只作为参考,真正数据集来时还是具体分析一番。


在使用sklearn工具包进行建模时,换一个算法非常便捷,只需要更改函数即可。。


from pandas.plotting import scatter_matrix
# 改为DBSCAN算法
from sklearn.cluster import DBSCAN
db = DBSCAN(eps=10, min_samples=2).fit(X)
labels = db.labels_
beer['cluster_db'] = labels
beer.sort_values('cluster_db')
beer.groupby('cluster_db').mean()
scatter_matrix(X, c=colors[beer.cluster_db], figsize=(10,10), s=100)
array([[<matplotlib.axes._subplots.AxesSubplot object at 0x00000199EA98E0C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EABFFA08>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EA9D49C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAA0E408>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAA46DC8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAA807C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAAB9148>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAAEDFC8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAAF7BC8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAB31D88>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAB9B388>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAD933C8>],
       [<matplotlib.axes._subplots.AxesSubplot object at 0x00000199EADCD4C8>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAE06608>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAE3F708>,
        <matplotlib.axes._subplots.AxesSubplot object at 0x00000199EAE79808>]],
      dtype=object)

image.png


目录
相关文章
|
15天前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
44 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
2月前
|
机器学习/深度学习 算法 数据挖掘
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
8个常见的机器学习算法的计算复杂度总结
|
17天前
|
机器学习/深度学习 存储 人工智能
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
使用Python作为开发语言,基于文本数据集(一个积极的xls文本格式和一个消极的xls文本格式文件),使用Word2vec对文本进行处理。通过支持向量机SVM算法训练情绪分类模型。实现对文本消极情感和文本积极情感的识别。并基于Django框架开发网页平台实现对用户的可视化操作和数据存储。
20 0
文本情感识别分析系统Python+SVM分类算法+机器学习人工智能+计算机毕业设计
|
1月前
|
机器学习/深度学习 数据采集 算法
数据挖掘和机器学习算法
数据挖掘和机器学习算法
|
1月前
|
机器学习/深度学习 数据采集 存储
一文读懂蒙特卡洛算法:从概率模拟到机器学习模型优化的全方位解析
蒙特卡洛方法起源于1945年科学家斯坦尼斯劳·乌拉姆对纸牌游戏中概率问题的思考,与约翰·冯·诺依曼共同奠定了该方法的理论基础。该方法通过模拟大量随机场景来近似复杂问题的解,因命名灵感源自蒙特卡洛赌场。如今,蒙特卡洛方法广泛应用于机器学习领域,尤其在超参数调优、贝叶斯滤波等方面表现出色。通过随机采样超参数空间,蒙特卡洛方法能够高效地找到优质组合,适用于处理高维度、非线性问题。本文通过实例展示了蒙特卡洛方法在估算圆周率π和优化机器学习模型中的应用,并对比了其与网格搜索方法的性能。
165 1
|
2月前
|
机器学习/深度学习 存储 算法
图解最常用的 10 个机器学习算法!
图解最常用的 10 个机器学习算法!
|
5月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
210 14
|
5月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
97 1
|
5月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
|
5月前
|
机器学习/深度学习 数据采集 算法
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
解码癌症预测的密码:可解释性机器学习算法SHAP揭示XGBoost模型的预测机制
257 0
下一篇
无影云桌面