Python学习1——K-means聚类

参考博文:

(7条消息) Python学习——K-means聚类_Yummy的博客-CSDN博客icon-default.png?t=LA92https://blog.csdn.net/qq_41938858/article/details/87738035我的配制

IDE:PyCharm

环境:Anaconda

Python包:sklearn、numpy、matplotlib

一、导入需要的Python包

Python学习1——K-means聚类_第1张图片

1. 

K-means在sklearn.cluster中,用到K-means聚类时,我们只需:

from sklearn.cluster import KMeans

K-means在Python的三方库中的定义是这样的: 

 class sklearn.cluster.KMeans(n_clusters=8, init=’k-means++’, n_init=10, max_iter=300, tol=0.0001, precompute_distances=’auto’, verbose=0, random_state=None, copy_x=True, n_jobs=None, algorithm=’auto’)

各输入参数的含义
n_clusters : int, optional, default: 8
表示的是要生成的簇的数量,或者说聚类中心的数量。是个整型的数,默认值为8;
init : {‘k-means++’, ‘random’ or an ndarray}
表示的是对需要聚类的数据的初始化的方法,默认的方法是’k-means++’.
初始化的方法有三种:k-means++,random,或者是一个数组。
k-means++能智能的选择初始聚类中心进行k均值聚类,加快收敛速度。
random则是从数据中随机的选择k个观测值作为初始的聚类中心。
也可以传递给init一个数组作为初始化的聚类中心,则这个数组的结构应该是(n_clusters, n_features)。
n_init : int, default: 10
表示的是K-means算法选择聚类中心的次数,默认值为10。最终返回的是聚类中心最好的一次结果(好是指时间的长短)。
max_iter : int, default: 300
每次运行K-means算法的最大迭代次数,默认值为300.
tol : float, default: 1e-4
表示的相当于是迭代终止的精度要求,可以允许的误差,当满足这个精度,则聚类收敛,寻找到最优解,可以停止迭代,默认值为10-4。
precompute_distances : {‘auto’, True, False}
预先计算距离,在空间和时间上作出权衡。这样做会更快,但是会占用更多的内存,默认值为‘auto’。
‘auto’指如果n_samples * n_clusters > 12亿时,就不预先计算距离。这样就相当于使用双精度的每个作业大约需要100MB的内存。
‘True’指总是预先计算距离。
‘False’指不预先计算距离。
verbose : int, default 0
是否输出详细信息,默认值为0。
random_state : int, RandomState instance or None (default)
确定聚类中心初始化的随机数生成。使用一个整型的数是的随机性具有确定性,默认值为None。
copy_x : boolean, optional
bool 在scikit-learn 很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据,默认值为True。为True时,是不修改原始数据,确保X是C-contiguous,聚类后不修改原始数据。为False时,则修改原始数据,在函数返回之前将修改后的放回X,但通过减去再加上数据均值,可能会引入较小的数值差异,在这种情况下,也不能保证数据是C-contiguous,可能会使速度明显的下降。
n_jobs : int or None, optional (default=None)
使用进程的数量,与电脑CPU有关。默认值为None。
algorithm : “auto”, “full” or “elkan”, default=“auto”
K-means算法所用到的,“full”指经典的EM-style算法;“elkan”通过使用三角不等式,所以更高效,但目前不支持稀疏的数据;“auto”则在数据密集时,选择“elkan”,在数据稀疏时,选择“full”。

函数返回值
**cluster_centers_:**聚类中心的坐标。
如果算法还未完全收敛就停止,则将与labels_不一致。
**labels_:**每个点的标签。
**inertia_:**样本到聚类中心的平方和。
**n_iter_:**迭代运行的次数。

方法

函数 功能
fit(X[, y, sample_weight]) 计算K-means聚类
fit_predict(X[, y, sample_weight])    计算每个样本的集群中心并预测簇索引
fit_transform(X[, y, sample_weight])    计算聚类并将X变换为聚类距离空间。
get_params([deep])    获取此估计函数的参数。
predict(X[, sample_weight])     预测X中每个样本所属的最近簇。
score(X[, y, sample_weight])     与k -均值目标上的X值相反。
set_params(**params)    设置此估计函数的参数。
transform(X)     将X变换为一个簇距空间

2.NumPy

NumPy(Numerical Python) 是 Python 语言的一个扩展程序库,支持大量的维度数组与矩阵运算,此外也针对数组运算提供大量的数学函数库。学习参考链接:
NumPy 教程 | 菜鸟教程 (runoob.com)icon-default.png?t=LA92https://www.runoob.com/numpy/numpy-tutorial.html

 3.matplotlib

可能是 Python 2D-绘图领域使用最广泛的套件。它能让使用者很轻松地将数据图形化,并且提供多样化的输出格式。学习参考链接:
Matplotlib 教程 | 菜鸟教程 (runoob.com)icon-default.png?t=LA92https://www.runoob.com/w3cnote/matplotlib-tutorial.html

 二、实验代码

因为是刚开始学习,所以还是引用了第一篇博文的代码,但根据自身情况进行了详细的注释。

1.

from sklearn.cluster import KMeans #从sklearn.cluster包中导入KMeans模块
import numpy as np #导入numpy模块,后续只能通过np来引用

# 构造数据样本点集X,并计算K-means聚类
X = np.array([[1, 2], [1, 4], [1, 0], [4, 2], [4, 4], [4, 0]])#创建一个数组
kmeans = KMeans(n_clusters=2, random_state=0).fit(X)#生成两个簇,.fit用训练集数据拟合模型

# 输出及聚类后的每个样本点的标签(即类别),预测新的样本点所属类别
print(kmeans.labels_)
print(kmeans.predict([[0, 0], [4, 4], [2, 1]]))#.predict对新数据预测

输出结果为:

[0 0 0 1 1 1]
[0 1 0]

2.

import time
import numpy as np
import matplotlib.pyplot as plt

from sklearn.cluster import KMeans
#pairwise_distances_argmin计算一个点和一组点之间的最小距离
from sklearn.metrics.pairwise import pairwise_distances_argmin
#make_blobs产生聚类数据集
from sklearn.datasets._samples_generator import make_blobs

# ######################################
# Generate sample data
np.random.seed(0)

batch_size = 45
centers = [[1, 1], [-1, -1], [1, -1]]
n_clusters = len(centers)
#make_blobs:样本点个数3000,产生数据的中心端为centers,每个类别的方差0.7,返回X数组、标签 
X, labels_true = make_blobs(n_samples=3000, centers=centers, cluster_std=0.7)

# plot result
#画图尺寸8*3英寸
fig = plt.figure(figsize=(8,3))
#子图的左侧、右侧、下方、上方位置
fig.subplots_adjust(left=0.02, right=0.98, bottom=0.05, top=0.9)
colors = ['#4EACC5', '#FF9C34', '#4E9A06']

# original data
#子图:一行两列的第一个
ax = fig.add_subplot(1,2,1)
#数组的维数
row, _ = np.shape(X)
#画子图
for i in range(row):
    ax.plot(X[i, 0], X[i, 1], '#4EACC5', marker='.')
#标题
ax.set_title('Original Data')
ax.set_xticks(())
ax.set_yticks(())

# compute clustering with K-Means
#自定义初始聚类中心:k-means++是k-means的增强版,它初始选取的聚类中心点尽可能的分散开来,这样可以有效减少迭代次数,加快运算速度
#生成的簇的数量3
#选择聚类中心的次数10
k_means = KMeans(init='k-means++', n_clusters=3, n_init=10)
#返回当前时间的时间戳
t0 = time.time()
#训练集
k_means.fit(X)
#训练时间
t_batch = time.time() - t0
#按列对聚类中心递增排序
k_means_cluster_centers = np.sort(k_means.cluster_centers_, axis=0)
#计算一个点与一组点之间的最小距离。
k_means_labels = pairwise_distances_argmin(X, k_means_cluster_centers)

# K-means
#子图:一行两列的第二个
ax = fig.add_subplot(1, 2, 2)
#函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表
#分质心画图
for k, col in zip(range(n_clusters), colors):
    my_members = k_means_labels == k		# my_members是布尔型的数组(用于筛选同类的点,用不同颜色表示)
    cluster_center = k_means_cluster_centers[k]
    ax.plot(X[my_members, 0], X[my_members, 1], 'w',
            markerfacecolor=col, marker='.')	# 将同一类的点表示出来
    ax.plot(cluster_center[0], cluster_center[1], 'o', markerfacecolor=col,
            markeredgecolor='k', marker='o')	# 将聚类中心单独表示出来
ax.set_title('KMeans')
ax.set_xticks(())
ax.set_yticks(())
#向(-3.5, 1.8)位置添加文本
plt.text(-3.5, 1.8, 'train time: %.2fs\ninertia: %f' % (t_batch, k_means.inertia_))
#显示所有打开的图形
plt.show()

输出结果: 

k-means--result 

 

你可能感兴趣的:(python,kmeans,聚类)