Kmeans


#pic_center =400x
系列文章:



K-Means类概述

在 scikit-lean中,包含两个K-Means算法,一个是传统的K-Means,对应 的类是 KMeans; 另一个是基于采样的Mini Batch K-Menas算法,对应的类是MiniBatchKMeans.
使用KMeans类的话,一般要注意点仅仅是k值的选择,即参数n_clusters
如果是使用MiniBatchKMeans的话,多了batch_size
当然KMeans类和MiniBatchKMeans类可以选择的参数不少,但大多数不需要调参。

K-Means类主要参数

  1. n_cluster: 即k值,一般多试试可以获得比较好的聚类结果
  2. max_iter: 最大迭代次数,一般如果是凸数据集可以不管这个值,如果数据集不是凸的,可能比价难收敛,此时可以指定最大迭代次数让算法及时退出循环
  3. n_init : 用不同的初始化质心运行算法的次数。由于K-Means结果受初始值的影响,因此需要多跑几次以选择一个较好的聚类效果。默认是10,一般不需要改
  4. init: 初始值选择的方式,可以为完全随机选择’random’, 优化过的’k-means++', 或者自己指定初始化的k个质心。
  5. algorithm: 有"auto", “full”, “elkan” 三种, “full"是传统的K-Means算法,默认的"auto"会根据数据值是否稀疏来决定,一般数据是稠密的是"elkan”, 否则就是"full", 一般建议直接选择"auto"

使用scikit-learn学习K-Means聚类

K 值的评估标准

无监督聚类样本没有样本输出,也没有比较直接的聚类评估方法,但是可以从簇内稠密度和簇间的离散程度估计聚类效果。
类别内部数据的协方差越小越好,类别之间的协方差越大越好
轮廓系数是最常用的聚类算法的评价指标。
轮廓系数范围是(-1,1)

(1)好:s值越接近1,表示样本与自己所在的簇中的样本相似好,并且与其他簇中的样本不相似

(2)差:当样本点与簇外的样本更相似的时候,轮廓系数就为负。这些样本点在其族内就是属于异类。

(3)同族:当轮廓系数为0时,则代表两个簇中的这些样本的相似度一致,两个簇本应该是一个簇。

可以总结为轮廓系数越接近于1越好,负数则表示聚类效果非常差。

import matplotlib
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets._samples_generator import make_blobs
from sklearn import metrics
from sklearn.cluster import  KMeans
# X为样本特征,Y为样本簇类别, 共1000个样本,每个样本2个特征,共4个簇,
# 簇中心在[-1,-1], [0,0],[1,1], [2,2], 簇方差分别为[0.4, 0.2, 0.2]
x, y = make_blobs(n_samples=1000, n_features=2,
                  centers=[[-1,-1],[0,0],[1,1],[2,2]],
                  cluster_std=[0.4, 0.2, 0.2, 0.2],
                  random_state=9)

plt.scatter(x[:,0],x[:,1], marker='o')
plt.show()

# "full"已被弃用,现在使用lloyd
y_pred = KMeans(n_clusters=2, random_state=9,algorithm="lloyd").fit_predict(x)
plt.scatter(x[:,0],x[:,1], c=y_pred)
plt.show()
print(metrics.calinski_harabasz_score(x, y_pred))

DBSCAN算法

基于密度空间的聚类算法 不需要聚类的数量 而是基于数据推测聚类的数目 可以对任意形状都能产生聚类

该算法首先要确定两个参数:
epsilon 在一个点周围邻近区域的半径;
minpts 这个邻近区域至少应该包含的点个数

根据这两个参数可以划分样本中的点为三类:
核心点 如果一个点在其eps半径内有超过minpts数目的点
边界点 如果一个点在半径eps内含有的数量小于minpts,但是他落在其他核心点的邻域内
噪音点即离群点 既不是核心点也不是边缘点

密度直达:如果点p在核心点q的eps邻域内,则认为p从q出发是直接可达的(在一个半径圈内)
密度可达:如果存在数据对象链p1、p2…pn、pn+1是从pi关于eps和minpts直接密度可达的,则认为pn是从数据对象p1关于epsminpts密度可达的(即一圈套一圈可以到达的)注意方向为单向
密度相连:对于对象p和q,如果存在核心对象样本o,使得p和q都可以从o密度可达,那么则成为p和q密度相连
在这里插入图片描述
x1是核心对象,x2可由x1密度直达,x3可由x1密度可发,x3与x4密度连接。
在这里插入图片描述
sklearn.datasets.make_circles(n_samples = 100,shuffle = True,noise = None,random_state = None,factor = 0.8 )
作用:在2d中创建一个包含校园的大圆的样本集
一般用于可视化聚类和分类算法
n_samples : int,optional(默认值= 100)
生成的总点数。如果是奇数,则内圆将比外圆具有一个点。

shuffle : bool,optional(默认值= True)
是否洗牌样品。

noise: 双倍或无(默认=无)
高斯噪声的标准偏差加到数据上。

random_state : int,RandomState实例或None(默认)
确定数据集重排和噪声的随机数生成。传递一个int,用于跨多个函数调用的可重现输出。见术语表。

factor : 0 <double <1(默认值= .8)
内圈和外圈之间的比例因子。

返回值

生成的样本X ,数据类型ndarray: shape[n_samples,2]
y : 形状数组[n_samples]
每个样本的类成员资格的整数标签(0或1)。

sklearn.datasets.make_blobs(n_samples=100, n_features=2, centers=None, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)
参数解释:
n_samples(int/array):如果参数为int,代表总样本数;如果参数为array-like,数组中的每个数代表每一簇的样本数。默认值100
n_features(int):样本点的维度。默认值2
centers(int):样本中心数。如果样本数为int且centers=None,生成三个样本中心;如果样本数(n_samples)为数组,则centers 要么为None,要么为数组的长度。默认值3
cluster_std(float/sequence of floats):样本中,簇的标准差。默认值1.0
center_box(pair of floats (min, max)):每个簇的上下限。默认值(-10.0, 10.0)
shuffle(boolean):是否将样本打乱。默认值True
random_state(int/RandomState instance /None):指定随机数种子,每个种子生成的序列相同,与minecraft地图种子同理。
返回类型:X : 样本数组 [n_samples, n_features]

产生的样本

y : array of shape [n_samples]

每个簇的标签

from sklearn import  datasets
import numpy as np
import random
import  matplotlib.pyplot as plt
import time
import  copy

# x1是生成的样本,y1是对应样本的标签(该点属于内圆还是外圆)
x1, y1 = datasets.make_circles(n_samples=50, factor=0.6,noise=0.2)

x2, y2 = datasets.make_blobs(n_samples=50, n_features=2, centers=2)
plt.figure()
plt.scatter(x2[:,0],x2[:,1])
plt.show()

在这里插入图片描述

np二维矩阵计算想减求和

x1 = np.array([[1,0],[3,0],[4,0]])
# print(x1.shape)
# print(x1.shape[0])
for i in  range(x1.shape[0]):
    # print(x1[i]-x1[0]) #得到如[0,0],[2,0],[3,0]
    # print(np.square(x1[i]-x1[0])) #得到如[0,0],[4,0],[9,0]
    print(np.sum(np.square(x1[i]-x1[0]))) #0  4   9

DBSCAN聚类算法Python实现

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值