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. 使用redis的zset实现高效分页查询(附完整代码)

    一.需求 移动端系统里有用户和文章,文章可设置权限对部分用户开放.现要实现的功能是,用户浏览自己能看的最新文章,并可以上滑分页查看. 二.数据库表设计 涉及到的数据库表有:用户表TbUser.文章表T ...

  2. KindEditor.ready 不执行的解决方法

    问题描述 按照官网的要求,一一都设置好了,但就是没法显示富文本编辑器. 1.设置好textarea输入框 <textarea id="myEditor" name=" ...

  3. MariaDB的备份与主从、高可用实践

    1.编写脚本,支持让用户自主选择,使用mysqldump还是xtraback全量备份. [root@test-centos7-node1 scripts]# cat chose_backup_mysq ...

  4. python报错: invalid syntax

    invalid syntax: 无效的语法. 解决办法:查看当前语句中的  , 如果当前行没找到错误,依次往上找,往上找时可以利用是否有输出进行快速查找. 原因:python语法很严格,少了左括号.右 ...

  5. php获取本年、本月、本周时间戳和日期格式

    时间戳格式: //获取今日开始时间戳和结束时间戳 $beginToday=mktime(0,0,0,date('m'),date('d'),date('Y')); $endToday=mktime(0 ...

  6. 从Main读取appsetting

    using System; using System.Configuration; using Newtonsoft.Json.Linq; using System.Net.Http; using S ...

  7. 洛谷p1137 模拟退火

    题目链接:https://www.luogu.org/problem/P1337 以x为原点,将力分解成横纵方向的力,每次退火时单独对答案的横纵坐标进行判断是否更新答案 #include<ios ...

  8. 关于neo4j初入门(2)

    DELETE删除 删除节点及相关节点和关系. DELETE <node-name-list> DELETE <node1-name>,<node2-name>,&l ...

  9. Scrapy去重

    一.原生 1.模块 from scrapy.dupefilters import RFPDupeFilter 2.RFPDupeFilter方法 a.request_seen 核心:爬虫每执行一次yi ...

  10. es8对object快速遍历的方法

    let grade = { 'lilei' : 96, 'han' : 99 } //遍历keys console.log(Object.keys(grade)) console.log(Object ...