编程实现之k均值算法

部署运行你感兴趣的模型镜像

聚类属于无监督学习。周志华老师在《机器学习》一书中详细讲解了各种聚类算法,如k均值、学习向量量化、高斯混合聚类等。在这篇博客中,我根据周志华老师描述的算法步骤,用Python实现了 k均值算法。具体代码如下:

import pandas as pd
import numpy as np
import random
import matplotlib.pyplot as plt


#首先从数据集中读入数据
midu = []
hantanglv = []

df = pd.read_excel('西瓜数据集4.0.xlsx')
for i in df.index.values:
    midu.append(df.ix[i].values[1])
    hantanglv.append(df.ix[i].values[2])
m = len(midu)


def distance(x1, y1, x2, y2):

    return ((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2))**0.5

    
def kMeans(x):
    m = 0
    h = 0
    for i in x:
        m = m + i[0]
        h = h + i[1]
    return m/len(x), h/len(x)

    
#按照书上所讲,将聚类簇数定义为3
k = 3
#用flag表示均值向量有没有更新
flag = k


#选择k个样本作为均值向量
u = random.sample(range(0, m), k)
U = []
for i in u:
    U.append((midu[i], hantanglv[i]))

#开始迭代
while flag==k:
    C = []
    flag=0
    for i in range(k):
        C.append([])
    for i in range(m):
        #使用欧式距离
        everyDistance = [distance(midu[i], hantanglv[i], j[0], j[1]) for j in U]
        C[everyDistance.index(min(everyDistance))].append((midu[i], hantanglv[i]))    
    for i in range(k):
        mk, hk = kMeans(C[i])
        if U[i][0] != mk or U[i][1] != hk:
            U[i] = (mk, hk)
            flag = flag + 1

 
#将聚类结果可视化出来
co = ['r', 'g', 'b', 'm']
for i in range(k):
    mm = [a[0] for a in C[i]]
    hh = [a[1] for a in C[i]]    
    plt.scatter(mm, hh, color=co[i%len(co)])
    plt.scatter(U[i][0], U[i][1], marker='x')
plt.show()
    

采用的数据集是西瓜数据集4.0:

最终聚类结果如下图所示:

因为初始均值向量是随机生成的,所以每次的聚类结果都不太一样。

您可能感兴趣的与本文相关的镜像

Python3.8

Python3.8

Conda
Python

Python 是一种高级、解释型、通用的编程语言,以其简洁易读的语法而闻名,适用于广泛的应用,包括Web开发、数据分析、人工智能和自动化脚本

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值