• 机械学习--4


    1. 应用K-means算法进行图片压缩
    from sklearn.datasets import load_sample_image
    from sklearn.cluster import KMeans
    import matplotlib.pyplot as plt
    import numpy as np
    import matplotlib.image as imgs
    import sys
    #读取图片
    ch=load_sample_image("china.jpg")
    plt.imshow(ch)
    plt.show()
    #观察图片
    print('大小:',ch.size)
    print('降低分辨率前的像素分布:',ch.shape)
    print('内存:',sys.getsizeof(ch))
    #图片降低分辨率
    img=ch[::3,::3]
    plt.imshow(img)
    print('降低分辨率后的像素分布:',img.shape)
    plt.show()
    #二维线性
    x=img.reshape(-1,3)
    #模型训练
    model=KMeans(n_clusters=64).fit(x)
    #预测值pre,聚类点center
    pre=model.predict(x)
    print('像素分布:',pre)
    center = model.cluster_centers_
    print("颜色点:",center)
    #压缩后的图片
    new_img=center[pre].reshape(img.shape)
    plt.imshow(new_img.astype(np.uint8))
    plt.show()
    #对边修改前后
    print('压缩前文件大小:',ch.size)
    print('压缩前文件大小:',new_img.size)
    print('压缩前内存大小:',sys.getsizeof(ch))
    print('压缩后内存大小:',sys.getsizeof(new_img))

    压缩前:

    压缩后:

     

     

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

      根据nba球员进球率分析出场均得分能力,对于nba来说,出色的得分球员能让整支队伍处于乘风破浪的节奏上。拥有着快速的得分节奏意味着获胜的机会变大。

    #研究NBA选手平均进球拿分的命中率预测场均得分情况
    import pandas as pd
    from numpy import *
    import numpy as np
    #导入nba球员数据
    data = pd.read_excel("nba.xlsx")
    name= data['球员'].values
    data0 = data['投篮'].values
    data1 = data['罚球'].values
    data2 = data['三分'].values
    data3 = data['得分'].values
    datax = np.zeros([200,4])
    datax[:,0]=data0
    datax[:,1]=data1
    datax[:,2]=data2
    datax[:,3]=data3
    print(datax.shape)

    #假设聚簇为4,k值可变换
    k=4
    #创建一个多维数组来收集得分等级
    dist = np.zeros([data.shape[0],datax.shape[1]+1])
    #初始化质点中心
    def initcent(x, k):
    center = x[:k, :]
    return center

    #通过欧式距离选取出最接近均值的下标,放入dist多维数组中
    def nearest(x, center):
    a=[]
    for j in range(k):
    a.append(np.sqrt(sum((x-center[j, :]) ** 2)))
    # print(a)
    return a

    def xclassify(x,dist, center):
    for i in range(x.shape[0]):
    dist[i,:k]=nearest(x[i,:],center)
    dist[i, k] = np.argmin(dist[i,:k])
    return dist
    #迭代聚簇点
    def kcmean(x, dist, center,k):
    centerNew = np.zeros([k,center.shape[1]])
    for c in range(k):
    p = []
    q = np.where(dist[:,k] == c)
    for i in range(datax.shape[1]):
    n = mean(x[q][:,i].reshape(-1,1))
    p.append(n)
    # print(p)
    # print(centerNew[c])
    if all(centerNew[c]!=p):
    centerNew[c] = p
    return np.array(centerNew)

    #通过多次迭代质点,确定最优质点
    center = initcent(datax,k)
    while True:
    xclas = xclassify(datax, dist, center)
    centerNew=kcmean(datax, xclas, center,k)
    if all(center == centerNew):
    break
    else:
    center = centerNew
    #打印10条数据
    for i in range(10):
    print('球员:',name[i],',''场均得分能力等级:',dist[i,k])
    #通过图例确定质点的含义
    plt.scatter(dist[:,k], datax[:,3], c=array(xclas[:,k]), s=50, cmap='rainbow', marker='p', alpha=0.5)
    plt.show()

     #得分能力等级为1 则为得分能很强,4则为比较强,2则为比较好,0则为一般

  • 相关阅读:
    加密和解密配置节(asp2.0以后)http://www.cnitblog.com/lby91772/archive/2008/03/04/40436.html
    多线程消息队列 (MSMQ) 触发器 http://blog.sina.com.cn/s/blog_405ad00201007rlw.html
    NUnit的使用
    HDU 1896 Stones
    POJ 1862 Stripies(哈夫曼)
    ZOJ 3230 Solving the Problems
    HDU 1242 Rescue(BFS)
    ZOJ 3410 Layton's Escape
    求逆序数
    HDU 1873 看病要排队
  • 原文地址:https://www.cnblogs.com/zzkai/p/12723734.html
Copyright © 2020-2023  润新知