zoukankan      html  css  js  c++  java
  • 机器学习总结

    # encoding=utf8
    from sklearn.cluster import KMeans
    from sklearn.datasets import load_digits, fetch_20newsgroups, make_blobs
    from sklearn.feature_extraction import DictVectorizer
    from sklearn.feature_extraction.text import TfidfVectorizer
    from sklearn.linear_model import LinearRegression
    from sklearn.metrics import classification_report
    from sklearn.model_selection import train_test_split
    from sklearn.naive_bayes import MultinomialNB
    from sklearn.neighbors import KNeighborsClassifier
    from sklearn.preprocessing import StandardScaler
    import numpy as np
    import pandas as pd
    
    #回归模型,用来预测
    from sklearn.tree import DecisionTreeClassifier
    
    
    def price_predict():
        #http://scikit-learn.org/stable/modules/linear_model.html
        #数据有三个特征:距离地铁距离、附近小学数量、小区绿化率
        # P =  W1 * A + W2*B + W3 *C
        X = np.array([[500.0, 3.0, 0.3], [1000.0, 1.0, 0.6],
                      [750.0, 2.0, 0.3], [600.0, 5.0, 0.2], [1200.0, 1.0, 0.6]])
        #具有三个特征的房屋对应的房价
        Y = np.array([10000., 9000., 8000., 12000., 8500.])
    
        #将数据转化到均值是0,方差是1的标准分布内
        std_x = StandardScaler()
        x_train = std_x.fit_transform(X)
    
        std_y = StandardScaler()
        y_train = std_y.fit_transform(Y.reshape(-1,1))
    
        #构建线性预测模型
        lr = LinearRegression()
        #模型在历史数据上进行训练,Y.reshape(-1,1)将Y变为二维数组,fit函数要求二维数组
        lr.fit(x_train,y_train)
        #使用训练模型预测新房屋[1300,3.0,0.4]的价格
    
        x_predict = std_x.transform(np.array([[1300,3.0,0.4]]))
        print(std_y.inverse_transform(lr.predict(x_predict)))
    
    
    
    #k近邻分类(k表示以最近的几个邻居作为分类的指标)
    #kNN表示了物以类聚人以群居的基本思考方法,最近的k个邻居是什么类别,预测样本就会被化为该类别
    def knn_predict_rev(point):
        #http://scikit-learn.org/stable/modules/neighbors.html
        #数据理解为二维坐标上的6个点
        X = np.array([[1.0, 1.0], [1, 1.5], [0.5, 1.5],[3.0, 3.0], [3.0, 3.5], [2.8, 3.1]])
        #6个点的类别,按顺序和X依次对应,[1.0,1.0]的类别是0,依次类推
        Y = np.array([0,0,0,1,1,1])
    
        #n_neighbors就是kNN中的k
        knn = KNeighborsClassifier(n_neighbors=3)
        knn.fit(X,Y)
        print(knn.predict(np.array([[2.0,3.0]])))
    
    
    def decide_play():
        #ID3
        """
        #http://scikit-learn.org/stable/modules/tree.html
        什么是Gini?
        dtree.csv样例数据:
        Outlook,Temperatur,Humidity,Windy,PlayGolf
        sunny,85,85,FALSE,no
        sunny,80,90,TRUE,no
        overcast,83,86,FALSE,yes
        rainy,70,96,FALSE,yes
        ......
        :return:
        """
        df = pd.read_csv('dtree.csv')
        #将数据转换为字典格式,orient="record"参数指定数据格式为{column:value}的形式
        #第一行数据为{Outlook:'sunny',Temperatur:85,Humidity:85,Windy:False,PlayGolf:no}
        #一个字典对应一行数据
        dict_train  = df.loc[:,['Outlook','Temperatur','Humidity','Windy']].to_dict(orient="record")
        #如果pandas从DataFrame取出一列数据,该数据类型会变为Series
        dict_target = pd.DataFrame(df['PlayGolf'],columns=['PlayGolf']).to_dict(orient="record")
        #训练数据字典向量化
        dv_train = DictVectorizer(sparse=False)
        x_train = dv_train.fit_transform(dict_train)
    
        #目标数据字典向量化
        dv_target = DictVectorizer(sparse=False)
        y_target = dv_target.fit_transform(dict_target)
    
    
        #创建训练模型并训练
        d_tree = DecisionTreeClassifier()
        d_tree.fit(x_train,y_target)
    
        data_predict = {'Humidity': 85,
          'Outlook': 'sunny',
          'Temperatur': 85,
          'Windy': False}
    
        x_data = dv_train.transform(data_predict)
        print dv_target.inverse_transform(d_tree.predict(x_data))
    
    def article_category():
        #http://scikit-learn.org/stable/modules/naive_bayes.html#multinomial-naive-bayes
        """
        使用朴素贝叶斯,根据关键词对文章内容进行分类
        20newsgroups中的数据形式:
        ['文章1','文章2',........,'文章n']
        整体是一个数组,文章n代表一段文字
        :return:
        """
        #加载20newsgroups数据源,里面是主要英文报刊杂志的文章整理
        #categories指明要加载的文章类别,subset指明要加载训练集
        categories = ['alt.atheism', 'soc.religion.christian', 'comp.graphics', 'sci.med']
        twenty_train = fetch_20newsgroups(subset='train',categories=categories)
    
        #计算所有文章的TFIDF
        tfidf_transformer = TfidfVectorizer()
        X_train_tfidf = tfidf_transformer.fit_transform(twenty_train.data)
        #构建多项式朴素贝叶斯模型
        clf = MultinomialNB(alpha=1.0).fit(X_train_tfidf, twenty_train.target)
        #需要判断类别的两篇文章
        docs_new = ['Chemical reaction', 'Intel CPU is good']
        #将要判断的文章向量花
        X_new_tfidf = tfidf_transformer.transform(docs_new)
        #进行预测
        predicted = clf.predict(X_new_tfidf)
        #zip 将数组a[1,2,3] b['a','b','c']变为[(1,'a'),(2,'b'),(3,'c')]
        for doc, category in zip(docs_new, predicted):
            print('%r => %s' % (doc, twenty_train.target_names[category]))
    
    
    from sklearn.svm import LinearSVC
    import matplotlib.pyplot as plt
    #支持向量机:找到分类界面,使支持向量间的间隔最大,支持向量到分割界面的距离最小
    #支持向量是通过到分割界面距离最小的点的向量,且两向量间的距离最大
    def hw_recognition():
        #http://scikit-learn.org/stable/modules/svm.html
        digits = load_digits()
        #random_state 设置随机种子
        X_train, X_test, Y_train, Y_test = train_test_split(digits.data, digits.target,
                                                            test_size=0.25, random_state=23)
        ss = StandardScaler()
        #fit是实例方法,必须由实例调用
        X_train = ss.fit_transform(X_train)
        X_test = ss.transform(X_test)
    
        lsvc = LinearSVC()
        lsvc.fit(X_train, Y_train)
    
        #Y_predict = lsvc.predict(np.array([digits.data[220]]))
        #plt.imshow(digits.images[220])
        #print Y_predict
        #plt.show()
        Y_predict = lsvc.predict(X_test)
        #生成评估报告:
        #precision(精确率) = 正正/(正正+反正)
        #recall(召回率,覆盖率)    = 正正/(正正+正反)
        #按照行解释正反: 正正:真正的正例预测为正例,正反:真正的正例预测为反例,反正:真正的反例预测为正例,
        #反反:真正的反例预测为反例
        print classification_report(Y_test, Y_predict, target_names=digits.target_names.astype(str))
    
    
    
    def kmeans_plot():
        """
        #http://scikit-learn.org/stable/modules/clustering.html
        kmeans算法的过程:(假如有两类)
        1.随机选择两个点作为聚类的中心
        2.计算所有点距离两个中心的距离,选择距离较近的点作为类别。(例如:距离蓝点近,类别是蓝色)
        3.计算已经分好类的各组数据的平均值,使用各组数据的平均值中心作为新的中心
        4.以新的中心为依据,跳转到第2步
        5.直到收敛(两次迭代的数值没有明显的变化:新中心点距离上一次计算中心点的距离小于某个阈值,例如:0.03)
    
        """
        plt.figure(figsize=(6, 3))
    
        n_samples = 1500
        random_state = 170
        X, y = make_blobs(n_samples=n_samples, random_state=random_state)
        y_pred = KMeans(n_clusters=2, random_state=random_state).fit_predict(X)
    
        plt.subplot(121)
        plt.scatter(X[:, 0], X[:, 1], c=y_pred)
    
        plt.subplot(122)
        plt.scatter(X[:, 0], X[:, 1], c=y)
    
    
    hw_recognition()
    
    """
    A,B表明两个工作地点的收益,A一个小时50$,B一个小时100$
    W1,W2是两地工作时间,称为:权重,机器学习中要调整的系数,[W1,W2]构成一个二维搜索空间
    T = W1 * A + W2 * B 是我们的评估函数
    TMax = 650 是期望目标,也是我们的学习目标
    每天工作8小时,每地至少工作一小时,这是学习约束
    
    delta = |T - TMax| 绝对值是我们的评估函数,损失函数(cost,loss)
    delta达到什么结果搜索结束,由算法来设计,例如delta=1 搜索结束(搜索结束也称为函数收敛)
    
    在搜索空间中尝试搜索过程中,对W1、W2改变的幅度称为学习率
    """
  • 相关阅读:
    【转】win8.1下安装ubuntu
    Codeforces 1025G Company Acquisitions (概率期望)
    Codeforces 997D Cycles in Product (点分治、DP计数)
    Codeforces 997E Good Subsegments (线段树)
    Codeforces 1188E Problem from Red Panda (计数)
    Codeforces 1284E New Year and Castle Building (计算几何)
    Codeforces 1322D Reality Show (DP)
    AtCoder AGC043C Giant Graph (图论、SG函数、FWT)
    Codeforces 1305F Kuroni and the Punishment (随机化)
    AtCoder AGC022E Median Replace (字符串、自动机、贪心、计数)
  • 原文地址:https://www.cnblogs.com/liangliangzz/p/10299518.html
Copyright © 2011-2022 走看看