前言: Hello大家好,我是小哥谈。 K-means算法是很典型的基于距离的聚类算法,采用距离作为相似性的评价指标,即认为两个对象的距离越近,其相似度就越大。该算法认为簇是由距离靠近的对象组成的,因此把得到紧凑且独立的簇作为最终目标。🌈
目录
🚀1.k-means算法优缺点
🚀2.算法思想
🚀3.解决的问题
🚀4.k-means原理介绍
🚀5.k-means算法实战
优点:容易实现
缺点:可能收敛到局部最小值,在大规模数据集上收敛较慢.
使用数据类型: 数值型数据k-means算法属于无监督学习的一种聚类算法,其目的为:在不知数据所属类别及类别数量的前提下,依据数据自身所暗含的特点对数据 进行聚类。对于聚类过程中类别数量 k 的选取,需要一定的先验知识, 也可根据“类内间距小,类间间距大“(一种聚类算法的理想情况) 为目标进行实现。🍃
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] = 2centroids[0,1] = 10centroids[1, 0] = 5centroids[1, 1] = 8centroids[2, 0] = 1centroids[2, 1] = 2return 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 = infmin_index = -1# 对每个样本点到每个中心的距离进行计算for j in range(k):dist_ij = calc_distance(centroids[j, :],data[i, :])# 找到距离最近的中心的距离和索引if dist_ij < min_dist:min_dist = dist_ijmin_index = jcluster_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_assmentif __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].valuesdf1 = df[df.pred == 1].valuesdf2 = 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()
具体实现效果:
小伙伴们,可以根据需求添加数据集,本文只是简单添加了几组数据集做一下演示。🌟🌟🌟
本文发布于:2024-01-28 19:35:47,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/17064417539775.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |