K均值算法--应用

1. 应用K-means算法进行图片压缩

读取一张图片

观察图片文件大小,占内存大小,图片数据结构,线性化

用kmeans对图片像素颜色进行聚类

获取每个像素的颜色类别,每个类别的颜色

压缩图片生成:以聚类中收替代原像素颜色,还原为二维

观察压缩图片的文件大小,占内存大小

import matplotlib.pylab as plt
from sklearn.cluster import KMeans
import matplotlib.image as img
import numpy as np

#读取图片
image=img.imread('d:\\xj3.jpg')
plt.imshow(image)
plt.show()

#数据转化为线性
X=image.reshape(-1,3)
#建立模型。确定聚类中心数
model=KMeans(64)
labels=model.fit_predict(X)
colors=model.cluster_centers_
#用聚类中心的颜色代替原来的颜色值
new_image=colors[labels].reshape(image.shape)
#显示压缩后的图片
plt.imshow(new_image.astype(np.uint8))

plt.imshow(new_image.astype(np.uint8)[::3,::3])

#存储图片
import matplotlib.image as img
img.imsave('d:\\zzj-02.jpg',new_image.astype(np.uint8))
img.imsave('d:\\zzj-03.jpg',new_image.astype(np.uint8)[::3,::3])

查看图片大小:

 

 

图片对比:

原图:

 

 

zzj-02.jpg:

 

 

zzj-03.jpg:

 

 

 

 

2. 观察学习与生活中可以用K均值解决的问题。

从数据-模型训练-测试-预测完整地完成一个应用案例。

这个案例会作为课程成果之一,单独进行评分。

 

天气空气质量评级聚类:
采集以及预处理数据:

import requests
from bs4 import BeautifulSoup
#每个省的省会城市网址后缀
list=[101010100,101020100,101030100,101040100,101050101,101060101,101070101,101080101,101090101,101100101,101110101,101120101,101130101,101140101,101150101
 ,101160101,101170101,101180101,101190101,101200101,101210101,101220101,101230101,101240101,101250101,101260101,101270101,101280101,101290101,101300101
 ,101310101,101320101,101330101]
#爬取数据函数
def resxxx(url):
    res = requests.get(url)
    soup = BeautifulSoup(res.text, 'html.parser')
    info=[0,0,0,0,0,0]
    info_value=['PM2.5','PM10','O3','NO2','SO2','CO']
    for i in range(len(soup.select('.badthing-name span'))):
        for j in range(6):
            if(soup.select('.badthing-name span')[i].text==info_value[j]):
                info[j]=soup.select('.badthing-des .g-fl')[i].text
    info.append(soup.select('.mh-pm25-num')[0].text)
    info.append(soup.select('.mh-pm25-txt')[0].text)
    info.append(soup.select('.change-title')[0].text)
    return info
#建立空白集合
import pandas as pd
df=pd.DataFrame(columns=['PM2.5','PM10','O3','NO2','SO2','CO','空气质量','空气评级','地点'])
total=[]
for i in list:
    #通过省会城市获得所有城市的后缀
    res = requests.get('https://tianqi.so.com/air/'+str(i))
    soup = BeautifulSoup(res.text, 'html.parser')
    for j in range(len(soup.select('.js-town option'))):
        url = 'https://tianqi.so.com/air/' + soup.select('.js-town option')[j].attrs['data-citycode']
        result = resxxx(url)
        total.append(result)
        df.loc[len(df)]=result
        print(result)
#存储得到的数据
df.to_csv('./olddata.csv')
print(len(total))
print(total)

data=pd.read_csv("./olddata.csv")
#数据处理转化类型
data[['PM2.5','PM10','O3','NO2','SO2','CO','空气质量']]=data[['PM2.5','PM10','O3','NO2','SO2','CO','空气质量']].astype('int')
data.loc[data['空气评级']=='','空气评级']=1
data.loc[data['空气评级']=='','空气评级']=2
data.loc[data['空气评级']=='轻度污染','空气评级']=3
data.loc[data['空气评级']=='中度污染','空气评级']=4
data.loc[data['空气评级']=='重度污染','空气评级']=5
data['空气评级']=data['空气评级'].astype('int')

data.to_csv('./newdata.csv')

旧数据:

 

预处理后的数据:

 

 

 

 

 模型建立预测:

import pandas as pd
data=pd.read_csv("./newdata.csv")
from sklearn.cluster import KMeans
import matplotlib.pylab as plt

model=KMeans(n_clusters=5).fit_predict(data.iloc[:,2:4])
#数据预测散点图
plt.scatter(data.iloc[:,2],data.iloc[:,3],c=model,s=50,cmap='rainbow')
#实际情况散点图
plt.scatter(data.iloc[:,2],data.iloc[:,3],c=data.iloc[:,9],s=50,cmap='rainbow')

分类对比:
  实际情况:

 

 

  预测情况:

 

 

 结果:可以看到实际与预测情况大致相同,可以得出结论。可以得出结论:利用天气质量的PM2.5和PM10可以预测天气的评级。

posted on 2020-04-19 19:09  ccl666  阅读(388)  评论(0编辑  收藏  举报