K-means的算法实现

原理我们就不赘述了,搜一搜都有的。使用的数据是我自己地,大概就是两列数字这个样子,有问题地话可以评论区留言或者私信。
我们使用的是python,因为是简单地实现算法,所以我们不能调用k-means的包。

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

1.导入数据

data = pd.read_csv('140-2.txt.txt', header=None, sep="\s+", names=['x', 'y'])  #这里names给数据的两列命名为x,y
x = data['x']
y = data['y']

2.画出数据的原始图像

plt.scatter(x,y)

在这里插入图片描述

#计算出样本和质心的距离
def distance(data, center):
    #data:140*2      centers:2*2
    #dist = np.zeros((140,2))
    dist = np.zeros((data.shape[0], centers.shape[0]))
    for i in range(len(data)):
        for j in range(len(centers)):
            #欧氏距离
            dist[i,j] = np.sqrt(sum((data.iloc[i, :] - centers[j])**2))  #dadta是pandas格式,用iloc标签取i行所有列
    return dist
    
#每个样本与质心的最近距离
def near_center(data, centers):
    dist = distance(data, centers)
    near_cen = np.argmin(dist, 1) #求得最短距离
    return near_cen
    
#k-means
def kmeans(data, k):
    #1,随机初始质心
    centers = np.random.choice(np.arange(-20,5,0.1), (k,2))#这里的范围是图上所示的范围
    print(centers)
    #迭代10次
    for _ in range(10):
        #2点归属
        near_cen = near_center(data, centers)
        #3质心的更新
        for ci in range(k):
            centers[ci] = data[near_cen == ci].mean()
            #print(data[near_cen == 0].mean())          #样本点与质心距离为0的点
    return centers,near_cen
    
#显示初始质心和迭代后的质心位置    
centers, near_cen = kmeans(data, 2)
centers

在这里插入图片描述

4.再次画出图像,标明质心的位置

#画出图像
plt.scatter(x, y, c=near_cen)
plt.scatter(centers[:, 0], centers[:, 1], marker='*', s=300)   #marker选择图标,s设置图标大小
```![在这里插入图片描述](https://img-blog.csdnimg.cn/20191208225338863.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3dlaXhpbl80Mjc1MDkwNw==,size_16,color_FFFFFF,t_70)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值