机器学习(十四)——K-Means聚类

理解聚类:本质:1. K-Means做聚类理解k-Means过程例:对下图做聚类先随机生成k个中心点,如下图,k=3然后给定一个初始化分计算每个cluster的x,y的均值,使得每个cluster都产生一个均值中心点。然后根据距离调整划分情况,如下图,上图中的三角形离中心五角星更近,所以把它划分成五角星,新加入一个五角星后,中心自然会再次向新加入的方向移动一点,中心移...
摘要由CSDN通过智能技术生成

理解聚类:
在这里插入图片描述
本质:
在这里插入图片描述

1. K-Means做聚类

理解k-Means过程

例:对下图做聚类
在这里插入图片描述
先随机生成k个中心点,如下图,k=3
在这里插入图片描述
然后给定一个初始化分
在这里插入图片描述
计算每个cluster的x,y的均值,使得每个cluster都产生一个均值中心点。
然后根据距离调整划分情况,如下图,上图中的三角形离中心五角星更近,所以把它划分成五角星,
在这里插入图片描述
新加入一个五角星后,中心自然会再次向新加入的方向移动一点,中心移动后,可能又会加入新的,因为可能又会有三角形离五角星的中心比三角形的中心更近,如下图,又有两个
在这里插入图片描述
新的两个三角形加入后,中心又会调整…一直迭代,直至中心点不再变化或者没有新的点加入,
在这里插入图片描述

上述例子的流程就是K-Means

流程

在这里插入图片描述
上图中的第二个公式我们也可以看的出来,求加和再除以个数,就是求中心点的;第一个公式是算点与每个中心点的最小距离,所以它是用来分类的。

缺点

K-Means开始会随机生成k个中心点,完一随机生成的中心点距离特别近

2. 其他做聚类的方法

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
例:第一步:随机第一个中心点k,
第二步:算每个样本到k的距离,假设又A,B,C三个样本到k的距离分别为5,4,1;把距离算出概率,把概率作为坐标轴,则0~50是A的50%的概率,50~90是B的40%,90~100是C的10%
第三步:随机一个0~100的数,如果这个数在0~50之间,则选A作为另一个中心点,如果在50~90之间,则中心点为B,如果在90~100之间,则中心点为C

解决了k-means的k个中心点随机情况,k-means++使得初始的k个中心点分布均匀些

3. 选择适当的聚类数 k

在这里插入图片描述
上图中的横坐标是k,纵坐标是Error
Error=每一个类的MSE加和,每一个类的MSE=每个样本和中心点的距离平方加和

如上图箭头所指的地方,也就是拐点处就是我们要的k最适当的地方。
原因:

距离A=上一次的Error(纵坐标) - 这一次的Error(纵坐标)
距离B= 这一次的 - 下一次的,
而拐点处就是距离A-距离B最大的地方
说白了,就是找到一个点,这个点之后不管k怎么增加,对Error的影响都不是那么明显

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

4. 代码实现

# -*- coding:utf-8 -*-

import numpy as np
import matplotlib.pyplot as plt
import sklearn.datasets as ds
import matplotlib.colors
from matplotlib import font_manager
from sklearn.cluster import KMeans
from sklearn.cluster import MiniBatchKMeans


def expand(a, b):
    d = (b - a) * 0.1
    return a-d, b+d


if __name__ == "__main__":
    N = 400
    centers = 4
    # 创建聚类的模拟数据400条,两个特征,4个k,有y的原因是对比我们评估的效果
    data, y = ds.make_blobs(N, n_features=2, centers=centers, random_state=2)
    # 与上面不同的是方差,方差越大,数据点越分散,方差越小,数据越密集,四个类的数据密集程度不一样
    data2, y2 = ds.make_blobs(N, n_features=2, centers=centers, cluster_std=(1, 2.5, 0.5, 2), random_state=2)
    # 也是生成四个类别的数据,第一个类别取data第一个类别的全部,第二个类别取data第二个类别前50条数据,第三个类别取data第三个类别前20条,第四个类别取data第四个类别前5条
    data3 = np.vstack((data[y == 0][:], data[y == 1][
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值