0.2 Kmeans

Kmeans

*  kmeans算法过程描述如下所示:

1.创建k个点作为起始质心点,c1,c2,…,ck 
          2.重复以下过程直到收敛

遍历所有样本xi,根据距离确定每一个样本的类别。 
                确定类别后,计算每一个样本到各自质心的距离,然后求和。和用来和前一次计算出来的距离和比较,已确定是否收敛。 
                对每一个类,计算所有样本的均值并将其作为新的质心(对于点而言,就是所有x坐标的平均值作为质心的x坐标,所有
                y坐标的平均值作为y坐标的均值)

import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
from sklearn import datasets

datasets.make_blobs?
x,y=datasets.make_blobs(n_features=3,centers=3)
def init(x,centers=3,):
    '''
    根据x每一个特征的数值范围,产生centers个数据点:
    '''
    array=[]
    for i in x.T:
        maxx,minx=np.max(x),np.min(x)
        array.append(np.random.random(centers)*(maxx-minx)+minx)
    return np.array(array).T
def distance(x,k):
    '''
    几何距离,返回每一点的标签
    '''
    return np.argmin(np.array([np.sqrt(np.sum((x-i)**2,axis=1))for i in k]).T,axis=1) 
    
k=init(x,centers=3)
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'b*')
plt.show()

for i in range(10):
    '''
    计算新的k,循环
    '''
    k=np.array([np.mean(x[kinds==i],axis=0) for i in set(kinds)])
    kinds=distance(x,k) 
    #print(k.shape,len(set(kinds)))
plt.plot(x[:,0],x[:,1],'*')
plt.plot(k[:,0],k[:,1],'r*')
plt.show()
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值