1. K-means++原理

  K均值聚类属于启发式方法,不能保证收敛到全局最优,初始中心的选择会直接影响聚类结果。K-means是随机选择样本点作为聚类中心,容易造成算法局部收敛或者需要较多迭代次数,而K-means++将初始点的选择转化为概率问题,容易得到更好的初始聚类中心,加速算法收敛。下图是算法的步骤,转载自Yixuan-Xu的博客,有兴趣了解K-means算法的小伙伴可以进传送门看一看。

2.算法实现

  • 利用sklearn的数据库生成数据集
# make datasets
X,y=datasets.make_blobs(n_samples=500,n_features=2,centers=3,cluster_std=1.2,center_box=(-5,10))
  • 初始化K个聚类中心点
def center_select(X,y,k):
'''
初始化聚类中心点 Parameters
------------------
:param X: 数据集
:param y: 显示原始数据集不同团簇之间的颜色
:param k: 将数据集分成K类 Return
------------------
return X[centers_index,:]: 初始化的中心点坐标
'''
if k<2 or k>len(X):
print('k should be more than 1 and less than len(X)')
return k centers_index=[]
for i in range(k):
if i==0:
first_index=int(np.random.random()*len(X))
centers_index.append(first_index)
else:
res=np.zeros(len(X))
for j in centers_index:
sub=np.square(X-X[j,:])
distance=np.sum(sub,axis=1)
res+=distance
proba=np.cumsum(res/np.sum(res)) # Roulette selection
val=np.random.random()
for m,k in enumerate(proba):
if val<k:
centers_index.append(m)
break return X[centers_index,:]
  • 聚类迭代
def k_mean(X,y,k,iter=1000):
'''
K-means++迭代更新 Parameters
------------------
:param X: 数据集
:param y: 显示原始数据集不同团簇之间的颜色
:param k: 将数据集分成K类
:param iter: 迭代次数 Return
------------------
return center: 迭代后的聚类中心点坐标
'''
center=center_select(X,y,k)
X_label=np.insert(X,X.shape[1],-1,axis=1) # show begin
plt.scatter(X[:,0],X[:,1],c=y)
plt.scatter(center[:,0],center[:,1],marker='+',c='red',s=500)
# iteration
for i in range(iter):
dis_res=np.zeros((len(X),k))
for j in range(k):
sub=np.square(X-center[j,:])
distance=np.sum(sub,axis=1)
dis_res[:,j]=distance
label=np.argmin(dis_res,axis=1)
X_label[:,-1]=label # update center
for m in range(k):
cache=X[X_label[:,-1]==m]
center[m,:]=np.sum(cache,axis=0)/len(cache) # show result
plt.figure()
plt.scatter(X[:,0],X[:,1],c=y)
plt.scatter(center[:,0],center[:,1],marker='+',c='red',s=500)
return center
  • 调用迭代函数
# cluster
center=k_mean(X,y,3,iter=1000)
  • 输出初始聚类中心与迭代结束后聚类中心图像

手写-- K-means++的更多相关文章

  1. OpenCV手写数字字符识别(基于k近邻算法)

    摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...

  2. k最邻近算法——使用kNN进行手写识别

    上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...

  3. 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!

    1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...

  4. KNN (K近邻算法) - 识别手写数字

    KNN项目实战——手写数字识别 1. 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法.它的工作原理是:存在一个 ...

  5. K近邻实战手写数字识别

    1.导包 import numpy as np import operator from os import listdir from sklearn.neighbors import KNeighb ...

  6. 使用神经网络来识别手写数字【译】(三)- 用Python代码实现

    实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...

  7. 手写朴素贝叶斯(naive_bayes)分类算法

    朴素贝叶斯假设各属性间相互独立,直接从已有样本中计算各种概率,以贝叶斯方程推导出预测样本的分类. 为了处理预测时样本的(类别,属性值)对未在训练样本出现,从而导致概率为0的情况,使用拉普拉斯修正(假设 ...

  8. C#中调用Matlab人工神经网络算法实现手写数字识别

    手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化  投影  矩阵  目标定位  Matlab 手写数字图像识别简介: 手写 ...

  9. Python 手写数字识别-knn算法应用

    在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...

  10. HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)

    根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...

随机推荐

  1. 条款03:尽可能使用const

    目录 1. 总结 2. const对象 3. const函数返回值和函数参数 4. const成员函数 const成员函数的重要性 bitwise constness logical constnes ...

  2. MySQL定时备份(全量备份+增量备份)

    MySQL 定时备份 参考 zone7_ 的 实战-MySQL定时备份系列文章 参考 zmcyu 的 mysql数据库的完整备份.差异备份.增量备份 更多binlog的学习参考马丁传奇的 MySQL的 ...

  3. Maven 基础(一) | 使用 Maven 的正确姿势

    一.什么是 Maven? Maven 是一个项目管理工具,它的本质是一个项目对象模型(POM),体现在配置中就是我们常见的 pom.xml 文件,而这个 pom 文件就是 Maven 的核心,它管理了 ...

  4. Unable to open debugger port (127.0.0.1:57046): java.net.SocketException "so

    原因分析: 出现这个报错的原因是因为端口被占用导致的. 解决方法: 解决方法主要两种:修改端口配置(推荐).关闭占用端口的进程(不推荐). 方式一:修改端口配置(推荐) 被占用的端口可能是本地端口,也 ...

  5. 曹工说Spring Boot源码(11)-- context:component-scan,你真的会用吗(这次来说说它的奇技淫巧)

    写在前面的话 相关背景及资源: 曹工说Spring Boot源码(1)-- Bean Definition到底是什么,附spring思维导图分享 曹工说Spring Boot源码(2)-- Bean ...

  6. Jenkins 应用

    一.Jenkins Linux shell集成 新建任务 shell-freestyle-job,选择Freestyle project,点击[确定] ​ 添加描述,This is my first ...

  7. 本地缓存google.guava及分布式缓存redis 随笔

    近期项目用到了缓存,我选用的是主流的google.guava作本地缓存,redis作分布式 缓存,先说说我对本地缓存和分布式缓存的理解吧,可能不太成熟的地方,大家指出,一起 学习.本地缓存的特点是速度 ...

  8. Qt Installer Framework翻译(3-2)

    添加组件 如果用户在初始安装期间未选择所有可安装组件,则后续也可以使用包管理器从仓库中获取剩余组件进行安装.包管理器是维护工具的一部分,该维护工具在初始安装过程中与应用程序一起被安装.仅当包含组件的仓 ...

  9. maven常用的远程仓库地址

    <mirror> <id>nexus-aliyun</id> <name>Nexus aliyun</name> <url>ht ...

  10. 力扣337——打家劫舍 III

    这一篇也是基于"打家劫舍"的扩展,需要针对特殊情况特殊考虑,当然其本质还是动态规划,优化时需要考虑数据结构. 原题 在上次打劫完一条街道之后和一圈房屋后,小偷又发现了一个新的可行窃 ...