机器学习之聚类方法的讲解

聚类方法的讲解

1、make_blobs方法的使用

sklearn.datasets.make_blobs(n_samples=100,n_feature=2,centers =3,cluster_std = 1.0,center_box = (-10,0,10.0),shuffle =True,random_state = None)

make_blobs 函数是为聚类产生的数据集,产生一个数据和标签。
n_samples:数据样本的个数
n_feature: 表示样本的特征数,也表示数据的维数
centers :表示类别数
cluster_std: 表示每一个类别的方差
center_box: 中心确定之后的边界
shuffle: 将数据进行洗乱,默认值为True
random_state: 随机生成器的种子,可以固定生成的数据

我在jupyter-notebook中试了一下:

实例代码:

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()

运行结果:
在这里插入图片描述

scikit-learn中的Kmeans介绍

scikit-learn 是一个基于Python的Machine Learning模块,里面给出了很多Machine
Learning相关的算法实现,其中就包括K-Means算法。

在这里插入图片描述
各个聚类之间性能对比:

在这里插入图片描述

优点:
原理简单
速度快
对大数据集有比较好的伸缩性

缺点:
需要指定聚类 数量K
对异常值敏感
对初始值敏感

1、相关理论

(1)中心点的选择
k-meams算法的能够保证收敛,但不能保证收敛于全局最优点,当初始中心点选取不好时,只能达到局部最优点,整个聚类的效果也会比较差。可以采用以下方法:k-means中心点

选择彼此距离尽可能远的那些点作为中心点;
先采用层次进行初步聚类输出k个簇,以簇的中心点的作为k-means的中心点的输入。
多次随机选择中心点训练k-means,选择效果最好的聚类结果

(2)k值的选取
k-means的误差函数有一个很大缺陷,就是随着簇的个数增加,误差函数趋近于0,最极端的情况是每个记录各为一个单独的簇,此时数据记录的误差为0,但是这样聚类结果并不是我们想要的,可以引入结构风险对模型的复杂度进行惩罚

2、主函数KMeans

来看看K-Means主函数:

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=1, 
	algorithm='auto'
	)

参数的意义:

n_clusters:簇的个数,即你想聚成几类 init: 初始簇中心的获取方法 n_init:
获取初始簇中心的更迭次数,为了弥补初始质心的影响,算法默认会初始10次质心,实现算法,然后返回最好的结果。 max_iter:
最大迭代次数(因为kmeans算法的实现需要迭代) tol: 容忍度,即kmeans运行准则收敛的条件
precompute_distances:是否需要提前计算距离,这个参数会在空间和时间之间做权衡,如果是True
会把整个距离矩阵都放到内存中,auto 会默认在数据样本大于featurs*samples 的数量大于12e6 的时候False,False
时核心实现的方法是利用Cpython 来实现的 verbose: 冗长模式(不太懂是啥意思,反正一般不去改默认值)
random_state: 随机生成簇中心的状态条件。 copy_x:
对是否修改数据的一个标记,如果True,即复制了就不会修改数据。bool 在scikit-learn
很多接口中都会有这个参数的,就是是否对输入数据继续copy 操作,以便不修改用户的输入数据。这个要理解Python 的内存机制才会比较清楚。
n_jobs: 并行设置 algorithm: kmeans的实现算法,有:‘auto’, ‘full’, ‘elkan’, 其中
'full’表示用EM方式实现 虽然有很多参数,但是都已经给出了默认值。所以我们一般不需要去传入这些参数,参数的。可以根据实际需要来调用。

3、简单案例

本案例说明了K-Means分析的一些类如何调用和获取

import numpy as np
from sklearn.cluster import KMeans

data = np.random.rand(100,3)
#print(data)
estimator = KMeans(n_clusters=3)
estimator.fit(data)
lable_pred = estimator.labels_
centroids = estimator.cluster_centers_
inertis = estimator.inertia_

print (estimator)
print (lable_pred)
print (centroids)
print (inertis)

运行结果

KMeans(algorithm=‘auto’, copy_x=True, init=‘k-means++’, max_iter=300,
n_clusters=3, n_init=10, n_jobs=1, precompute_distances=‘auto’,
random_state=None, tol=0.0001, verbose=0)
[1 1 1 1 2 0 1 2 0 1 2 1 2 0 0 1 0 1 2 1 2 1 0 0 2 1 1 2 2 2 0 0 1 1 1 2 0
2 1 2 1 2 2 2 0 0 1 0 0 0 1 0 0 1 2 0 2 0 2 2 0 2 0 0 1 2 1 1 2 1 2 0 1 0
2 1 1 1 0 1 2 1 2 0 2 1 1 1 1 0 0 2 0 2 2 1 2 2 2 0]
[[0.18384536 0.42630785 0.76853702]
[0.54662428 0.81833484 0.37742479]
[0.65161222 0.27943617 0.48302757]]
13.48163172364508

from sklearn.cluster import KMeans
import numpy as np

data = np.random.rand(100,3) 
num_clusters = 3
km_cluster = KMeans(n_clusters=num_clusters, max_iter=300, n_init=40, \
                    init='k-means++', n_jobs=-1)

result = km_cluster.fit_predict(data)
print (result)

运行结果:

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

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浪子私房菜

给小强一点爱心呗

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值