基于python3.7 numpy scipy matplotlib sklearn的机器学习笔记1-Kmeans算法实现

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/jingtaoqian8521/article/details/87609637

 

Kmeans算法执行原理浅析

  k-meansmeans 算法以 k为参数,把 n个对象分成 k个簇,使内具有较高的相似 度,而簇间的相似较低。
  其处理过程如下:
1. 随机选择 k个点作为初始的聚类中心;
2. 对于剩下的点,根据其与聚类中心距离将归入最近簇
3. 对每个簇,计算所有点的均值作为新聚类中心
4. 重复 2、3直到聚类中心不再发生改变

  具体算法详情请参考西瓜书---

:我这里用的numpy scipy matplotlib sklearn库安装是用pip install xxx安装的,速度奇慢,平均就36kb/s。网上说的那些镜像尝试过,速度也不快。

下面是本次实验的数据集以及实现代码:

数据介绍:
现有 1999 年全国 年全国 年全国 31 个省份城镇居民家庭平均每人全年消费性支出的八主 个省份城镇居民家庭平均每人全年消费性支出的八主 个省份城镇居民家庭平均每人全年消费性支出的八主 个省份城镇居民家庭平均每人全年消费性支出的八主 要变量数据 要变量数据 ,这八个变量分别是:食品 这八个变量分别是:食品 这八个变量分别是:食品 这八个变量分别是:食品 、衣着 、家庭设备用品及服务 家庭设备用品及服务 家庭设备用品及服务 家庭设备用品及服务 家庭设备用品及服务 、医疗 保健 、交通和讯 交通和讯 交通和讯 、娱乐教育文化服务 娱乐教育文化服务 娱乐教育文化服务 娱乐教育文化服务 、居住以及杂项商品和服务 居住以及杂项商品和服务 居住以及杂项商品和服务 居住以及杂项商品和服务 。利用已 有数据 ,对31 个省份进行聚类 。
 

北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64
天津,2459.77,495.47,697.33,302.87,284.19,735.97,570.84,305.08
河北,1495.63,515.90,362.37,285.32,272.95,540.58,364.91,188.63
山西,1406.33,477.77,290.15,208.57,201.50,414.72,281.84,212.10
内蒙古,1303.97,524.29,254.83,192.17,249.81,463.09,287.87,192.96
辽宁,1730.84,553.90,246.91,279.81,239.18,445.20,330.24,163.86
吉林,1561.86,492.42,200.49,218.36,220.69,459.62,360.48,147.76
黑龙江,1410.11,510.71,211.88,277.11,224.65,376.82,317.61,152.85
上海,3712.31,550.74,893.37,346.93,527.00,1034.98,720.33,462.03
江苏,2207.58,449.37,572.40,211.92,302.09,585.23,429.77,252.54
浙江,2629.16,557.32,689.73,435.69,514.66,795.87,575.76,323.36
安徽,1844.78,430.29,271.28,126.33,250.56,513.18,314.00,151.39
福建,2709.46,428.11,334.12,160.77,405.14,461.67,535.13,232.29
江西,1563.78,303.65,233.81,107.90,209.70,393.99,509.39,160.12
山东,1675.75,613.32,550.71,219.79,272.59,599.43,371.62,211.84
河南,1427.65,431.79,288.55,208.14,217.00,337.76,421.31,165.32
湖南,1942.23,512.27,401.39,206.06,321.29,697.22,492.60,226.45
湖北,1783.43,511.88,282.84,201.01,237.60,617.74,523.52,182.52
广东,3055.17,353.23,564.56,356.27,811.88,873.06,1082.82,420.81
广西,2033.87,300.82,338.65,157.78,329.06,621.74,587.02,218.27
海南,2057.86,186.44,202.72,171.79,329.65,477.17,312.93,279.19
重庆,2303.29,589.99,516.21,236.55,403.92,730.05,438.41,225.80
四川,1974.28,507.76,344.79,203.21,240.24,575.10,430.36,223.46
贵州,1673.82,437.75,461.61,153.32,254.66,445.59,346.11,191.48
云南,2194.25,537.01,369.07,249.54,290.84,561.91,407.70,330.95
西藏,2646.61,839.70,204.44,209.11,379.30,371.04,269.59,389.33
陕西,1472.95,390.89,447.95,259.51,230.61,490.90,469.10,191.34
甘肃,1525.57,472.98,328.90,219.86,206.65,449.69,249.66,228.19
青海,1654.69,437.77,258.78,303.00,244.93,479.53,288.56,236.51
宁夏,1375.46,480.89,273.84,317.32,251.08,424.75,228.73,19,5.93
新疆,1608.82,536.05,432.46,235.82,250.28,541.30,344.85,214.40

上述数据集粘贴至txt文档中,用于后续代码实现

###Kmeans--python 3.7
import numpy as np
import matplotlib.pyplot as plt
from sklearn.cluster import KMeans
##load data
def getdata(path):
    f=open(path,"r+")
    lines=f.readlines()
    Data=[]
    Cityname=[]
    ##逐行进行数据处理
    for line in lines:
        items=line.strip().split(",")
        print(len(items))
        Cityname.append(items[0])
        Data.append([float(items[i]) for i in range(1,len(items))])
    return Data,Cityname
if __name__=='__main__':
    data,cityname=getdata('C:/Users/Administrator/Desktop/city.txt')
    kmeans=KMeans(n_clusters=4)


    label=kmeans.fit_predict(data)
    ##[0 2 3 3 3 3 3 3 0 1 2 1 2 3 3 3 1 1 0 1 1 2 1 3 1 2 3 3 3 3 3]
    print(label)
    print(kmeans.cluster_centers_)
    exp=np.sum(kmeans.cluster_centers_,axis=1)
    print(exp)
    citycluster=[[],[],[],[]]
    for i in range(len(cityname)):
        citycluster[label[i]].append(cityname[i])
    for i in range(len(citycluster)):
        print("expense:%.2f"%exp[i])
        print(citycluster[i])
    ##绘制省份消费总额散点图
    x_label=[i for i in range(len(cityname))]
    y_label=np.sum(data,axis=1)
    plt.rcParams['font.sans-serif']=['SimHei'] #用来正常显示中文标签
    for i in range(len(cityname)):
        if label[i]==0:
            plt.scatter(x_label[i],y_label[i],c='r')
        elif label[i]==1:
            plt.scatter(x_label[i],y_label[i],c='g')
        elif label[i]==2:
            plt.scatter(x_label[i],y_label[i],c='b')
        elif label[i]==3:
            plt.scatter(x_label[i],y_label[i],c='m')
    ##为每个数据点添加标签
    for i in range(len(x_label)):
        plt.annotate(cityname[i],xy=(x_label[i],y_label[i]),xytext=(x_label[i]+0.1,y_label[i]+0.1))
    plt.show()

实验结果

--------------------------------------------------------------------------------------------------------------------参考mooc网课,北理工python机器学习应用课程

猜你喜欢

转载自blog.csdn.net/jingtaoqian8521/article/details/87609637