(笔记)K-means算法

K-means算法是常用的聚类算法:在给定K值和K个初始类簇中心点的情况下,首先把每个点(即数据记录)分配到离其最近的类簇中心点所代表的类簇中。其次根据一个类簇中内的所有点重新计算该类簇的中心点(取平均值)。然后再迭代的进行分配点和更新类簇中心点的步骤,直至类簇中心点的变化很小(即达到稳定状态,各类簇中数据点不再发生变化),或者达到指定的迭代次数为止。

算法主体

一、簇

1、簇的属性:簇中所有的数据点应彼此相似;

不同的簇中数据点尽可能不相同;

2、聚类的不同评估度量标准

聚类的主要目的不仅仅是创建簇,而是创建好的,有意义的簇。

有意义的簇评估标准:

标准一:Inertia标准

其实质是计算簇内所有点到簇的质心的距离总和,这个簇内距离总和被称为簇内距离(如下图所

示),而Inertia的最终值是这些簇内距离的总和,且Inertia试图最小化簇内距离,确保簇的紧凑性。

标准二:Dunn Index(邓恩指数)

除了簇内质心和各个数据点的距离,Dunn Index还考虑两个簇内质心的距离,这被称为簇间距离。

Dunn Index的值为簇间距离最小值与簇内距离最大值的比。

Dunn Index=\frac{min(Inter cluster distence)}{max(Intra cluster distence)}

 根据其标准,Dunn Index值越大,簇越好。即尽可能保证最小簇间距离尽可能大,最大簇内距离尽可能小。

K-means算法:

使用之前记得用pip 安装numpy 和 matplotlib

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

data = pd.read_csv('D:\BaiduNetdiskDownload\K-means算法代码及数据表\clustering.csv')#根据文件实际位置填写
data.head()

X = data[["LoanAmount","ApplicantIncome"]]
# print(X)
#可视化
plt.scatter(X["ApplicantIncome"],X["LoanAmount"],c='black')
plt.xlabel('AnnualIncome')
plt.ylabel('Loan Amount (In Thousands)')
plt.show()

# 第1步:选择簇的个数
K=3
# 第2步:随机选择观察值作为簇心
Centroids = (X.sample(n=K))
plt.scatter(X["ApplicantIncome"],X["LoanAmount"],c='black')
plt.scatter(Centroids["ApplicantIncome"],Centroids["LoanAmount"],c='red')
plt.xlabel('AnnualIncome')
plt.ylabel('Loan Amount (In Thousands)')
plt.show()

# 第3步:将所有点分配给到某个质心距离最近的簇
# 第4步:重新计算新形成的簇的质心
# 第5步:重复第三步和第四步

diff = 1
j=0

while(diff!=0):
    XD=X
    i=1
    for index1,row_c in Centroids.iterrows():
        ED=[]
        for index2,row_d in XD.iterrows():
            d1=(row_c["ApplicantIncome"]-row_d["ApplicantIncome"])**2
            d2=(row_c["LoanAmount"]-row_d["LoanAmount"])**2
            d=np.sqrt(d1+d2)
            ED.append(d)
        X[i]=ED
        i=i+1
    C=[]
    for index,row in X.iterrows():
        min_dist=row[1]
        pos=1
        for i in range(K):
            if row[i+1] < min_dist:
                min_dist = row[i+1]
                pos=i+1
        C.append(pos)
    X["Cluster"]=C
    Centroids_new = X.groupby(["Cluster"]).mean()[["LoanAmount","ApplicantIncome"]]
    if j == 0:
        diff=1
        j=j+1
    else:
        diff = (Centroids_new['LoanAmount'] - Centroids['LoanAmount']).sum() + (Centroids_new['ApplicantIncome'] - Centroids['ApplicantIncome']).sum()
        print(diff.sum())
    Centroids = X.groupby(["Cluster"]).mean()[["LoanAmount","ApplicantIncome"]]


color=['blue','green','cyan']
for k in range(K):
    data=X[X["Cluster"]==k+1]
    plt.scatter(data["ApplicantIncome"],data["LoanAmount"],c=color[k])
plt.scatter(Centroids["ApplicantIncome"],Centroids["LoanAmount"],c='red')
plt.xlabel('Income')
plt.ylabel('Loan Amount (In Thousands)')
plt.show()

运行结果:

 

数据集

https://download.csdn.net/download/m0_52854170/35405604?spm=1001.2014.3001.5503

  • 3
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我心如凪

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值