【手撕机器学习系列】kmeans算法

重温《机器学习实战》,对其中的经典算法重新学习,发现又是另一种感受;才发现自己以前并没有真正理解,在数据结构算法的理解基础上,再来看机器学习算法,发现有一种异曲同工之妙,这才有了《手撕机器学习系列》的想法,让我们一起走进算法,在理解中认识算法,而不是简单的调包。

【手撕机器学习系列】kmeans算法

原理:(资源太多,这里不再赘述)

手撕代码:

import math
import random

'''
Author:kevinelstri
Date:2021/04/22
Desc:手撕机器学习系列
'''

# 读取数据
def load_data(filename):
    dataSet = []
    for line in open(filename).readlines():
        dataLines = [float(i) for i in line.strip().split('\t')]
        dataSet.append(dataLines)
    return dataSet

# 计算距离(欧式距离)
def dist(vec1,vec2):
    return math.sqrt(pow(vec1[0]-vec2[0],2)+pow(vec1[1]-vec2[1],2))

# 计算平均值例子
def mean():
    L = [[1.658985, 4.285136], [-3.453687, 3.424321], [4.838138, -1.151539]]
    sum_list = [sum(i) for i in zip(*L)]
    avg_list = [sum(i)/len(L) for i in zip(*L)]
    return sum_list,avg_list

# 随机获取k个聚类中心
def randomCenter(dataSet,k):
    dataLength = len(dataSet)
    if k > dataLength:
        return
    randomCenter = []
    for i in range(k):
        randomNum = random.randomInt(1,dataLength-1) # 获取随机数
        randomCenter.append(dataSet[randomNum])
    return randomCenter

# 聚类算法
def kmeans(dataSet,k,randomCenter):
    clusterCenterBegin = randomCenter
    clusterCenterEnd = []
    dataLength = len(dataSet)
    cluster = [[] for i in range(k)]
    for i in range(dataLength):
		distList = []
        for j in range(k):
            distList.append(dist(dataSet[i],dataSet[j]))
        cluster[distList.index(min(distList))].append(dataSet[i])  # 计算最小距离,进行分类,每个类别就是一个list
        
    # 计算类别平均值
    for i in range(k):
        tmp = cluster[i]
        avg = [sum(i)/len(tmp) for i in zip(*tmp)]  # 计算平均值
        randomCenterEnd[i] = avg
    
    # 递归算法
    if clusterCenterBegin != clusterCenterEnd:
        kmeans(dataSet,k,clusterCenterEnd)
    return cluster,clusterCenterEnd

# 主函数调用
if __name__ == '__main__':
    # 读取数据
    filename = 'testSet.txt'
    dataSet = load_data(filename)
    print('数据据:',dataSet)
    
    # 随机获取k个聚类中心
    k = 3
    randonCenter = randomCenter(dataSet,k)
    print(f'随机{k}个聚类中心{randomCenter}')
    
    # 聚类算法
    cluster,clusterCenter = kmeans(dataSet,k,randomCenter)
    
    # 打印聚类结果
    for i in range(k):
        print(f'第{i+1}个聚类结果',cluster[i])
        print(f'第{i+1}个聚类中心'clusterCenter[i])

代码解析:

本次代码使用 “递归” 的方式来实现 kmeans 算法,对于无监督算法而言,最终的目标就是求解最优化结果,使用递归算法可以不断进行迭代,来获取最终结果。

代码链接:https://github.com/kevinelstri/Hander-Marchine-Learning-Series/tree/main/K-means

《百面机器学习》
链接:https://pan.baidu.com/s/13DrUAaNc40-5AUlXrNCjyQ
提取码:pbh6

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以为您提供机器学习kmeans算法在西瓜数据集上的实例。首先,让我们了解一下西瓜数据集。 西瓜数据集是一个著名的二元分类数据集,其中包含17个属性和2个类别。属性包括色泽,根蒂,敲声,纹理等等。类别分别为好瓜和坏瓜。下面是西瓜数据集的前几行数据: | 编号 | 色泽 | 根蒂 | 敲声 | 纹理 | 脐部 | 触感 | 密度 | 含糖率 | 好瓜 | | --- | --- | --- | --- | --- | --- | --- | --- | --- | --- | | 1 | 青绿 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.697 | 0.46 | 是 | | 2 | 乌黑 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.774 | 0.376 | 是 | | 3 | 乌黑 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.634 | 0.264 | 是 | | 4 | 青绿 | 蜷缩 | 沉闷 | 清晰 | 凹陷 | 硬滑 | 0.608 | 0.318 | 是 | | 5 | 浅白 | 蜷缩 | 浊响 | 清晰 | 凹陷 | 硬滑 | 0.556 | 0.215 | 是 | 现在,我们可以使用kmeans算法对这个数据集进行聚类。下面是Python代码的示例: ```python import pandas as pd from sklearn.cluster import KMeans # 读取数据集 data = pd.read_csv('watermelon.csv', encoding='gbk') # 取出数据集中的属性值 X = data.iloc[:, 1:-1] # 设置聚类数量为2 kmeans = KMeans(n_clusters=2) # 对数据进行聚类 kmeans.fit(X) # 输出聚类结果 print(kmeans.labels_) ``` 在这个示例中,我们使用`pandas`库读取了西瓜数据集,并使用`sklearn.cluster`库中的`KMeans`类对数据进行聚类。我们设置聚类数量为2,并使用`fit`方法对数据进行聚类。最后,我们输出了聚类结果。 希望这个示例对您有所帮助!

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值