算法简介

聚类是针对特定样本,依据他们特征的类似度或许间隔,将其归并到若干个“类”或“簇”。

这篇文章简略介绍KMeans聚类算法的进程,并仿sklean,结束一个简化版的的KMea算法的时刻复杂度是指什么ns算法。

算法进程图示

为了演示进程读书笔记怎样写,经过图例来更直观的感受一下K算法的有穷性是指Means的核算进程。

机器学习之 简略手写KMeans算法

首要这儿有8个点。咱们要把这8个点分为2类。

假定咱们要分为2类。那么咱们先假定2个中心点是 (1,1)(2,1)(1,1) (算法的时刻复杂度取决于什么2,1)读书卡。如下图:

机器学习之 简略手写KMeans算法

依据2个中心点的中垂线。把点分为2类,线左面的是一类,右边的是一类:

机器学习之 简略手写KMeans算法机器学习之 简略手写KMeans算法

重新核算2类的中心点,如图:

机器学习之 简略手写KMeans算法

依据2个中心点,再次把所有点分为2类:

机器学习之 简略手写KMeans算法机器学习之 简略手写KMeans算法

读书手抄报次核算中心点:

机器学习之 简略手写KMeans算法

如此,发现中心点现已不再变化了,是不是很简略呢。

整个进程就不断的重复2件工作:

(1)依据中心点,核算所有点的分类

(2)核算每个类的新的中心点

直到收敛。

这篇文章只介绍通俗易懂的进程,和自己结束的代码,至读书的优点于算法模型和算法进程,大家可以自行阅读书籍,或读书手抄报图片大全许查看其他博客。举荐读书李航博士的《计算学习方法》。

自己结束KMeans算法

本文按照上述读书代码,仿sklean,结束了一个简化版的KMeans算法, 可保存为算法的有穷性是指KMeans.py 并引用:

import numpy as np
from math import sqrt
from collections import Counter
from sklearn.metric算法s i算法mport accura算法工程师需求把握什么cy_score
import random
class KMean算法的时刻复杂度是指什么s:
def __init__(self, n_cluster读书的优点s=3, random_state=0):
assert n_cl读书卡usters >=1, "算法 must be valid"
self._n_clusters = n_clusters
self._random_state = random_state
self._X = None
self._cente读书卡r = None
self.cluster_cen读书名言ters_ = None
def distance(self, M, N):
return读书的优点 (np.sum((M - N) ** 2, axis = 1))** 0.5
def _g算法工程师需求把握什么enerate_labels(self, center, X):
return np.array([算法导论np.argmin(self.distance(center, item)) for ite读书的优点m in X])
def _gene算法的时刻复杂度取决于什么rate_算法的时刻复杂度是指什么centers(self, labe读书笔记怎样写ls, X):
return np.array读书手抄报([np.average(X[labels == i], axis=0) for i in np.arange(self._n_clusters)])
def fit_p算法的时刻复杂度取决于什么redi算法的时刻复杂度是指什么ct(self, X):
k = self._n_算法的时刻复杂度取决于什么clusters
# 设置随机数
if self._rando读书卡m_state:
random.seed(self._random_state)
# 生成随机中心点的索引
center_index = [random.randint(0, X读书笔记怎样写.shape[0]) for i in np.arange(k)]
center = X[center_index]
# print('init center: ', center)
n_iters = 1e3
while n_iters > 0:
# 记录上一个迭代的中心点坐标
last_center = cent读书笔记摘录大全20篇er
# 根读书笔记摘录大全据上读书笔记摘录大全一批中心点,核算各个点所属的类
labels = self._generate_la读书手抄报bels(last_center, X)
self.labels_ = labels
# 新的中心点坐标
center = self._读书名言generate_centers(labels, X)
# print('n center: ', center)
# 露出给外头的参数
# 中心点
self.cluster_centers_ = center
# 回来节点算法对应的分类 {0, 1, ..., n}
# 假如新核算得到的中心点,和上一次核算得到的点相同,说明迭代现已安稳了。
if (last_center == center算法).all():
self.labels_ = self读书的优点._generate_labels(center, X)
break
n_iters = n_iters - 1
return self

咱们来看看实践作用吧,这儿我制作了很布满的算法规划与剖析点阵。来调查分类是否有丢失。

import numpy as np算法的有穷性是指
import matplotlib.pyplot as plt
from KMeans import读书手抄报 KMeans
from sklearn.datasets imp算法的时刻复杂度取决于什么ort load_iris
t1 = np.算法是什么li读书卡nspace(-1, 1.5, 100)
t2 = np.linspace(-1, 1.5, 100)
X = np.array([(x, y) for x in t1 for y in t2])读书笔记摘录大全
plt.figure(figsize=(1读书0, 10))
clf = KMeans(n_clusters=6, random_state=None)
clf.fit_predict(X)
plt.scatter(X[:, 0], X[算法工程师:, 1], c=clf.labels_)
center = clf.cluster_cente算法工程师需求把握什么rs_
plt.scat算法工程师ter(center[:读书笔记, 0], center[:, 1],marker="*",s=200)

实践作用如下:

机器学习之 简略手写KMeans算法

留心:这儿的色块其实是布满的点阵,而他们到读书手抄报图片大全各中心的分类也都是十分符合咱们的预期的。

接下来,咱们用该算法来结束以下鸢尾花数据集的分类吧。

首要,咱们先导入数据集,看看实践点在图上的作用:

import numpy as np
import m读书笔记怎样写atplotlib.pyplot as plt
from KMeans import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
X = X[:, 2:读书名言]
y = iris.target
plt.figure(fi读书gsize=(12, 12))
plt.scatter(X[:, 0], X[:, 1])
plt.grid()
plt.x算法工程师需求把握什么lim(0, 7)
pl读书t.ylim算法(0, 7)
center = clf.cluster_ce读书nters_

样本分布如下:

机器学习之 简略手写KMeans算法

接下来,咱们调用自己写的KMeans算法,对样本进行分类,由于鸢尾花的数据集本算法的时刻复杂度取决于什么来便是分为3类的,所以咱们设置k=3。

import numpy as np
imp读书ort matplotlib.pyplot as plt
from KMeans import KMeans
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
X = X[:, 2:]
y = iris.t算法工程师需求把握什么arget
clf = K算法的有穷性是指Means(n_clusters=3)
s = clf.fit_predict(X)
plt.figure(figsize=(12,算法的有穷性是指 12))
plt.scatter(X[:, 0], X[:, 1], c=clf.labels_)
plt.grid()
plt.xlim(0, 7)
plt.ylim(0, 7)读书笔记摘录大全
center = clf.cluster_centers_
plt.scatter(center[:, 0], center[:算法的特征, 1],marker="*"读书卡,s=200)

作用如下:

机器学习之 简略手写KMeans算法

十分符合预期。

总结

KMe读书手抄报ans算法是迭代算法,不能确保大局最优,具体体现,和初始化的参数有关。初始中心点的选取,对作用会有必定影响。

k均值算法的k值需求预先指定,而在实践运用中,最算法规划与剖析有的类别数K是不确定的。处理这个问题的一个方法,便是查验用不同的k值聚类,查看各个聚类的体现来揣度最优的K值。一般来说,类别数变小时,均匀直径会添加;类别数变大超越某个值后,均匀直径变化不明显。这个值便是咱们要找的k值。