目录
🚀1.k-means算法优缺点
🚀2.算法思想
🚀3.解决的问题
🚀4.k-means原理介绍
🚀5.k-means算法实战
🚀1.k-means算法优缺点
优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢.
使用数据类型: 数值型数据
🚀2.算法思想
k-means算法 实际上就是通过计算不同样本间的距离来判断他们的相 近关系的,相近的就会放到同一个类别中去。📚
🚀3.解决的问题
k-means算法属于无监督学习的一种聚类算法,其目的为:在不知数据所属类别及类别数量的前提下,依据数据自身所暗含的特点对数据 进行聚类。对于聚类过程中类别数量 k 的选取,需要一定的先验知识, 也可根据“类内间距小,类间间距大“(一种聚类算法的理想情况) 为目标进行实现。🍃
🚀4.k-means原理介绍
k-means算法以数据间的距离作为数据对象相似性度量的标准,因此选择计算数据间距离的计算方式对最后的聚类效果有显著的影响,常用计算距离的方式有:余弦距离、欧式距离、曼哈顿距离等。🌻
🚀5.k-means算法实战
实现效果如下:
代码(每一步都已经清楚的进行了说明):
from numpy import *
import pandas as pd
import matplotlib.pyplot as plt
#距离度量函数
def calc_distance(vec1,vec2):
return sqrt(sum(power(vec1-vec2,2)))
#创建初始聚类中心
def creat_centroid(data,k):
centroids = zeros((k,n))
centroids[0,0] = 2
centroids[0,1] = 10
centroids[1, 0] = 5
centroids[1, 1] = 8
centroids[2, 0] = 1
centroids[2, 1] = 2
return centroids
# k-means聚类
def kMeans(data,k,dist=calc_distance,creat_center = creat_centroid):
# 初始化cluster_assment,存储中间结果
#第一列存储索引,第二列存储距离
# 样本的个数
m = shape(data)[0]
init = zeros((m,2))
cluster_assment = mat(init)
# 初始化聚类中心矩阵
centroids = creat_centroid(data,k)
for epoch in range(1):
# 对数据集合中每个样本点进行计算
for i in range(m):
min_dist = inf
min_index = -1
# 对每个样本点到每个中心的距离进行计算
for j in range(k):
dist_ij = calc_distance(centroids[j, :],data[i, :])
# 找到距离最近的中心的距离和索引
if dist_ij < min_dist:
min_dist = dist_ij
min_index = j
cluster_assment[i,:] = min_index,min_dist
# 对所有节点聚类之后,重新更新中心
for i in range(k):
# .A把矩阵转成数组
pts_in_cluster = data[nonzero(cluster_assment[:,0].A == i)[0]]
centroids[i,:] = mean(pts_in_cluster,axis=0)
return centroids,cluster_assment
if __name__ == '__main__':
# 创建数据集
data = array([[2,10],[2,5],[8,4],[5,8],
[7,5] ,[6,4],[1,2],[4,9]])
k = 3 # k为聚类个数
n = 2 # n为特征个数
centroids,cluster_assment = kMeans(data,k,dist = calc_distance,creat_center=creat_centroid)
predict_label = cluster_assment[:,0]
data_and_pred = column_stack((data,predict_label))
# df是原样数据样本和预测出来的类别
df = pd.DataFrame(data_and_pred,columns=['data1','data2','pred'])
df0 = df[df.pred == 0].values
df1 = df[df.pred == 1].values
df2 = df[df.pred == 2].values
#画图
plt.scatter(df0[:,0],df0[:,1],c ='turquoise',marker = 'o',label = 'label0')
plt.scatter(df1[:, 0], df1[:, 1], c='green', marker='*', label='label1')
plt.scatter(df2[:, 0], df2[:, 1], c='blue', marker='+', label='label2')
plt.scatter(centroids[:,0].tolist(),centroids[:,1].tolist(),c='red')
plt.legend(loc = 2)
plt.show()
具体实现效果:
小伙伴们,可以根据需求添加数据集,本文只是简单添加了几组数据集做一下演示。🌟🌟🌟