# 机器学习(九)——Kmeans聚类

14 篇文章 9 订阅

k均值聚类算法（k-means clustering algorithm）是一种迭代求解的聚类分析算法，其步骤是随机选取K个对象作为初始的聚类中心，然后计算每个对象与各个种子聚类中心之间的距离，把每个对象分配给距离它最近的聚类中心。

# Kmeans介绍

• 算法描述：
（1）适当选择c个类的初始中心；
（2）在k次迭代中，对任意一个样本，求其到c各中心的距离，将该样本归到距离更短的中心所在的类；
（3）利用均值等方法更新该类的中心值；
（4）对于所有的c个聚类中心，如果利用（2）（3）的迭代法更新后，值保持不变，则迭代结束，否则继续迭代。

# Kmeans的编程实现

import numpy as np

def kmeans(X, k, maxIt):

numPoints, numDim = X.shape
# 给数据标签留个位置
dataSet = np.zeros((numPoints, numDim + 1))
dataSet[:, :-1] = X

# 随机初始化位置中心
centroids = dataSet[np.random.randint(numPoints, size = k), :]
centroids = dataSet[0:2, :]
# 随机给初始位置中心赋予类别标记
centroids[:, -1] = range(1, k +1)

iterations = 0
oldCentroids = None

# Run the main k-means algorithm
while not shouldStop(oldCentroids, centroids, iterations, maxIt):
print("iteration: \n", iterations)
print("dataSet: \n", dataSet)
print("centroids: \n", centroids)
# Save old centroids for convergence test. Book keeping.
oldCentroids = np.copy(centroids)
iterations += 1

# Assign labels to each datapoint based on centroids
updateLabels(dataSet, centroids)

# Assign centroids based on datapoint labels
centroids = getCentroids(dataSet, k)

# We can get the labels too by calling getLabels(dataSet, centroids)
return dataSet

def shouldStop(oldCentroids, centroids, iterations, maxIt):
if iterations > maxIt:
return True
return np.array_equal(oldCentroids, centroids)

def updateLabels(dataSet, centroids):
# For each element in the dataset, chose the closest centroid.
# Make that centroid the element's label.
numPoints, numDim = dataSet.shape
for i in range(0, numPoints):
dataSet[i, -1] = getLabelFromClosestCentroid(dataSet[i, :-1], centroids)

def getLabelFromClosestCentroid(dataSetRow, centroids):
label = centroids[0, -1];
minDist = np.linalg.norm(dataSetRow - centroids[0, :-1])
for i in range(1 , centroids.shape[0]):
dist = np.linalg.norm(dataSetRow - centroids[i, :-1])
if dist < minDist:
minDist = dist
label = centroids[i, -1]
print("minDist:", minDist)
return label

def getCentroids(dataSet, k):
# Each centroid is the geometric mean of the points that
# have that centroid's label. Important: If a centroid is empty (no points have
# that centroid's label) you should randomly re-initialize it.
result = np.zeros((k, dataSet.shape[1]))
for i in range(1, k + 1):
oneCluster = dataSet[dataSet[:, -1] == i, :-1]
result[i - 1, :-1] = np.mean(oneCluster, axis = 0)
result[i - 1, -1] = i

return result

x1 = np.array([1, 1])
x2 = np.array([2, 1])
x3 = np.array([4, 3])
x4 = np.array([5, 4])
testX = np.vstack((x1, x2, x3, x4))

result = kmeans(testX, 2, 10)
print("final result:")
print(result)
# final result:
# [[1. 1. 1.]
#  [2. 1. 1.]
#  [4. 3. 2.]
#  [5. 4. 2.]]


sklearn包的Kmeans聚类

from sklearn.cluster import KMeans
KMeans(n_clusters=8,init='k-means++',n_init=10,max_iter=300,tol=0.0001,
verbose=0,random_state=None,
copy_x=True,algorithm='auto')


n_clusters：

init：

（１）'k-means++' 用一种特殊的方法选定初始质心从而能加速迭代过程的收敛
（２）'random' 随机从训练数据中选取初始质心。
（３）如果传递的是一个ndarray，则应该形如 (n_clusters, n_features) 并给出初始质心

n_init：

max_iter：

tol：
float形，默认值= 1e-4　与inertia结合来确定收敛条件

precompute_distances：

（１）'auto'：如果 样本数乘以聚类数大于 12million 的话则不预计算距离
（２）True：总是预先计算距离
（３）False：永远不预先计算距离

verbose：
int 默认为0，Verbosity mode

random_state：

copy_x：

n_jobs：

（１）若值为 -1，则用所有的CPU进行运算
（2）若值为1，则不进行并行运算，这样的话方便调试
（3）若值小于-1，则用到的CPU数为(n_cpus + 1 + n_jobs)
如果 n_jobs值为-2，则用到的CPU数为总CPU数减1
从0.23版n_jobs开始不推荐使用：从0.23版开始不推荐使用，并将在0.25版中删除。

algorithm：

使用K均值算法。经典的EM风格算法是“full”的
通过使用三角形不等式，“ elkan”算法对于定义良好的聚类的数据更有效
但是，由于分配了额外的形状数组（n_samples，n_clusters），因此需要更多的内存。



import numpy as np
import matplotlib.pyplot as plt
from sklearn import metrics
from sklearn.datasets import make_blobs
from sklearn.cluster import KMeans
# X为样本特征，Y为样本簇类别， 共1000个样本，
# 每个样本4个特征，共4个簇，簇中心在[-1,-1], [0,0],[1,1],[2,2]， 簇方差分别为[0.4, 0.2, 0.2，0.2]
X, y = make_blobs(n_samples=1000, n_features=2,centers=[[-1,-1], [0,0], [1,1], [2,2]],
cluster_std=[0.4, 0.2, 0.2, 0.2],random_state =9)
y_pred = KMeans(n_clusters=2, random_state=9)
y_pred = y_pred.fit_predict(X)
plt.figure()
plt.subplot(1,2,1)
plt.scatter(X[:, 0], X[:, 1], marker='o')
plt.subplot(1,2,2)
plt.scatter(X[:, 0], X[:, 1], c=y_pred)
plt.show()


y_pred = KMeans(n_clusters=2, random_state=9)


y_pred = y_pred.fit_predict(X)
新建对象后，常用的方法包括fit、predict、cluster_centers_和labels。
fit（X）函数对数据X进行聚类，
使用predict方法进行新数据类别的预测，
使用cluster_centers_获取聚类中心，
使用labels_获取训练数据所属的类别，
inertia_获取每个点到聚类中心的距离和


y_pred = KMeans(n_clusters=3, random_state=9)
y_pred = KMeans(n_clusters=4, random_state=9)


• 1
点赞
• 0
评论
• 14
收藏
• 打赏
• 扫一扫，分享海报

01-26

01-28 4万+
04-29 119
05-16 2万+
06-06 1万+
05-24 6244
04-05 554
01-24 643
01-20 502

zju_cbw

¥2 ¥4 ¥6 ¥10 ¥20

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