手写-- K-means++
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++的更多相关文章
- OpenCV手写数字字符识别(基于k近邻算法)
摘要 本程序主要参照论文,<基于OpenCV的脱机手写字符识别技术>实现了,对于手写阿拉伯数字的识别工作.识别工作分为三大步骤:预处理,特征提取,分类识别.预处理过程主要找到图像的ROI部 ...
- k最邻近算法——使用kNN进行手写识别
上篇文章中提到了使用pillow对手写文字进行预处理,本文介绍如何使用kNN算法对文字进行识别. 基本概念 k最邻近算法(k-Nearest Neighbor, KNN),是机器学习分类算法中最简单的 ...
- 一看就懂的K近邻算法(KNN),K-D树,并实现手写数字识别!
1. 什么是KNN 1.1 KNN的通俗解释 何谓K近邻算法,即K-Nearest Neighbor algorithm,简称KNN算法,单从名字来猜想,可以简单粗暴的认为是:K个最近的邻居,当K=1 ...
- KNN (K近邻算法) - 识别手写数字
KNN项目实战——手写数字识别 1. 介绍 k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法.它的工作原理是:存在一个 ...
- K近邻实战手写数字识别
1.导包 import numpy as np import operator from os import listdir from sklearn.neighbors import KNeighb ...
- 使用神经网络来识别手写数字【译】(三)- 用Python代码实现
实现我们分类数字的网络 好,让我们使用随机梯度下降和 MNIST训练数据来写一个程序来学习怎样识别手写数字. 我们用Python (2.7) 来实现.只有 74 行代码!我们需要的第一个东西是 MNI ...
- 手写朴素贝叶斯(naive_bayes)分类算法
朴素贝叶斯假设各属性间相互独立,直接从已有样本中计算各种概率,以贝叶斯方程推导出预测样本的分类. 为了处理预测时样本的(类别,属性值)对未在训练样本出现,从而导致概率为0的情况,使用拉普拉斯修正(假设 ...
- C#中调用Matlab人工神经网络算法实现手写数字识别
手写数字识别实现 设计技术参数:通过由数字构成的图像,自动实现几个不同数字的识别,设计识别方法,有较高的识别率 关键字:二值化 投影 矩阵 目标定位 Matlab 手写数字图像识别简介: 手写 ...
- Python 手写数字识别-knn算法应用
在上一篇博文中,我们对KNN算法思想及流程有了初步的了解,KNN是采用测量不同特征值之间的距离方法进行分类,也就是说对于每个样本数据,需要和训练集中的所有数据进行欧氏距离计算.这里简述KNN算法的特点 ...
- HDU 5183 Negative and Positive (NP) ——(后缀和+手写hash表)
根据奇偶开两个hash表来记录后缀和.注意set会被卡,要手写hash表. 具体见代码: #include <stdio.h> #include <algorithm> #in ...
随机推荐
- Java零基础搭建实时直播平台
https://www.cnblogs.com/scywkl/p/12101437.html
- python封装简介
1.效果图: 对比一: 对比二: 2.学习来源代码: # 封装是面向对象的三大特性之一 # 封装指的是隐藏对象中一些不希望被外部所访问到的属性或方法 # 如何隐藏一个对象中的属性? # - 将对象的属 ...
- python字典的遍历
遍历字典: keys() .values() .items() 1. xxx.keys() : 返回字典的所有的key 返回一个序列,序列中保存有字典的所有的键 效果图: 代码: ...
- 借助 dp 公式去优化
题目描述 一天,神犇和 LCR 在玩扑克牌.他们玩的是一种叫做“接竹竿”的游戏. 游戏规则是:一共有 nnn 张牌,每张牌上有一个花色 ccc 和一个点数 vvv,花色不超过 kkk 种.将这些牌依次 ...
- 从网上下载DLL
1,微软官网 2:https://www.zhaodll.com/ 3:http://www.dllzj.com/
- Linux.cp命令总提示是否覆盖
执行cp命令,其实是默认执行了cp -i命令的别名,因此总提示是否覆盖. 修改~/.bashrc,注释“alias cp='cp -i'”即可. [root@xxxx test]# vi ~/.bas ...
- 使用LD_PRELOAD注入程序
LD_PRELOAD是Linux系统的一个环境变量,它可以影响程序的运行时的链接(Runtime linker),它允许你定义在程序运行前优先加载的动态链接库.这个功能主要就是用来有选择性的载入不同动 ...
- C++封装的基于WinSock2的TCP服务端、客户端
无聊研究Winsock套接字编程,用原生的C语言接口写出来的代码看着难受,于是自己简单用C++封装一下,把思路过程理清,方便自己后续翻看和新手学习. 只写好了TCP通信服务端,有空把客户端流程也封装一 ...
- Shell 脚本学习总结
自己根据目前学到的东西制作了一张思维导图
- 【模板】普通平衡树(权值splay)
安利splay讲解: [洛谷日报第62期]Splay简易教程 [模板]普通平衡树(luogu) Description 题目描述 您需要写一种数据结构(可参考题目标题),来维护一些数,其中需要提供以下 ...