zoukankan      html  css  js  c++  java
  • 4.K均值算法--应用

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

    读取一张图片

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

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

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

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

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

    from sklearn.datasets import load_sample_image
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    import sys
    import numpy as np
    
    china = load_sample_image("china.jpg")    #读取加载图片
    
    plt.imshow(china)        #看图片
    plt.show()               #显示图片
    china.shape              #图片结构
    sys.getsizeof(china)     #查看图片的尺寸
    
    import matplotlib.image as img
    img.imsave("D://china.jpg",china)      #保存图片到D://china.jpg
    
    #图片压缩
    #颜色聚类
    # image = china[::3,::3]           #让图片尺寸变小
    X = china.reshape(-1,3)           #china数据是三维数组,将数据拉平
    # china.shape得到的是(横向上有多少的像素点,纵向上有多少的像素点,像素点的取值)
    print(china.shape,X.shape)
    
    
    n_colors = 64                     #聚成64类,【255*255*255】
    K_model = KMeans(n_colors)
    labels = K_model.fit_predict(X)       #训练数据并预测数据 (一堆数组,30602个元素的类别)
    colors = K_model.cluster_centers_     #二维【643】,64种颜色,3个通道
    print("颜色类别的数据结构",labels.shape)
    print("每个类别的颜色数据结构",colors.shape)
    
    # print(labels.shape,colors.shape)
    
    #还原图片
    new_iamge = colors[labels].reshape(china.shape) #每一个像素具体的颜色,reshape成原来的形状
    
    
    #原来的图片
    plt.imshow(china)
    plt.show()
    #压缩的图片
    plt.imshow(new_iamge.astype(np.uint8))       #np.uint8  类型转换,小数点转换为8位整形
    plt.show()
    # #在进一步压缩
    # plt.imshow(new_iamge.astype(np.uint8)[::3,::3])
    # plt.show()
    
    sys.getsizeof(new_iamge)             #压缩后图片占用空间大小
    img.imsave("D://new_image.jpg",new_iamge)     #保存图片

    截图:

     

     

     原图:

     压缩后:

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

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

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

    import pandas as pd
    import numpy as np
    from sklearn.cluster import KMeans
    from sklearn.model_selection import train_test_split
    data = pd.read_csv('venv/data/201706120039邱杰(处理好).csv')
    
    #将列'电梯情况'进行条件的判断,替换为0、1
    data.loc[data['电梯情况'] == '' , '电梯情况'] = 1   # int 类型
    data.loc[data['电梯情况'] == '暂无' , '电梯情况'] = 0
    
    #提取列为'面积''总价'''''为x
    data_x = data.iloc[:,[2,3,4,5]]      #提取到面积、总价、室、厅
    #将x改为二维数组形式
    data_x = np.array(data_x)
    #将列为'电梯情况'为y
    data_y = data.iloc[:,10]
    #将y改为一维数据形式
    data_y = np.array(data_y)
    
    #要预测的数据
    X = np.array([[103,300,2,1]])
    
    #对data_x,data_y进行训练
    tr_x,te_x,tr_y,te_y=train_test_split(data_x,data_y,test_size=0.2,random_state=10)  #data_x =90 ; tr_x=180 ; te_x = 73 ; data_y = 1  tr_y = 1 ; te_y = 1
    # 要分成的簇数也是要生成的质心数
    km_model = KMeans(n_clusters=3)
    #创建模型
    km_model.fit(tr_x, tr_y)
    # #查看聚类结果
    # km_model.labels_
    y_pre = km_model.predict(X)
    if y_pre == 1:
        print("有电梯")
    else:
        print("没有电梯")

    截图:

    (我的csv文件)

     结果截图:

  • 相关阅读:
    指针、字符串、数组操作
    字符串转换为数字(str2int)
    新的,开始。
    Hello, World.
    Go语言趣学指南lesson1
    hdoj2058
    poj2378
    hdoj1233
    poj2398
    hdoj1392
  • 原文地址:https://www.cnblogs.com/q1uj1e/p/12726639.html
Copyright © 2011-2022 走看看