├── README.md ├── bayes ├── bayesfunction.py ├── bayestextclassification.py └── pima.data.csv ├── entropy └── entropy.py ├── fibonacci ├── fib.py └── fibonacci.py ├── knn ├── appointment.py ├── knn.py └── test.txt ├── logistic ├── logistic.py └── testSet.txt ├── masked └── ingorespecilalnum.py ├── mergeimages └── load_image_memory.py ├── numpystr └── numpystr.py ├── primefactor.py ├── profiler └── matmult.py ├── pythagorean └── pythagorean.py ├── synmusic └── synmusic.py └── timeit └── testunit.py /README.md: -------------------------------------------------------------------------------- 1 | >敬畏耶和华是知识的开端(《箴言书》) 2 | 3 | # ApproachPython 4 | 5 | 赏析代码,拓展视野,让自己站在巨人的肩膀上。 6 | 7 | **website:**[www.itdiffer.com](http://www.itdiffer.com) 8 | 9 | **QQ group:**26913719(Code Craft) 10 | 11 | 1. [按照条件计算勾股数](./pythagorean/) 12 | 2. [斐波那契数列](./fibonacci/) 13 | 3. [绘制多彩小方块图片](./mergeimages/) 14 | 4. [合成音乐(简单的)](./synmusic/) 15 | 5. [用chararray做字符串操作](./numpystr/) 16 | 6. [忽略负数和极值,并做图](./masked/) 17 | 7. [Numpy中的数组大小和执行时间关系](./timeit/) 18 | 8. [k-近邻算法](./knn/) 19 | 9. [计算熵](./entropy/entropy.py) 20 | 10. [朴素贝叶斯算法-高斯概率分布](./bayes/bayesfunction.py) 21 | -------------------------------------------------------------------------------- /bayes/bayesfunction.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #朴素贝叶斯算法一个例子 5 | #高斯分布 6 | #来源:http://python.jobbole.com/81019 7 | 8 | import csv 9 | import random 10 | import math 11 | 12 | 13 | def loadCsv(filename): 14 | """ 15 | 加载数据文件,因为加载的使CSV格式文件,它没有标题行和任何引号,利用此函数,将它转化为数字组成的列表,并返回。 16 | """ 17 | lines = csv.reader(open(filename, "rb")) 18 | dataset = list(lines) 19 | for i in range(len(dataset)): 20 | dataset[i] = [float(x) for x in dataset[i]] 21 | return dataset 22 | 23 | def splitDataset(dataset, split_ratio): 24 | """ 25 | 将数据按照一定比例分为两部分,一部分使训练集合,另外一部分使测试集。 26 | """ 27 | train_size = int(len(dataset) * split_ratio) #训练集合的长度 28 | train_set = [] #训练集合数据存放 29 | copy = list(dataset) 30 | while (len(train_set) < train_size): 31 | index = random.randrange(len(copy)) #在copy中随机取一个索引,然后把该索引值加入到训练集合中。训练集合长度不大于train_size值。每取出一个,就将该值删除,所以用pop,删除同时返回删除值。 32 | train_set.append(copy.pop(index)) 33 | return (train_set, copy) #返回训练集和测试集合两个数据 34 | 35 | def separateByClass(dataset): 36 | """ 37 | 将训练集中的数据分组 38 | """ 39 | separated = {} 40 | for i in range(len(dataset)): 41 | vector = dataset[i] 42 | if (vector[-1] not in separated): #以每个列表的最后一个元素为特征(key),同样的化为一个键下的值。 43 | separated[vector[-1]] = [] 44 | separated[vector[-1]].append(vector) 45 | return separated 46 | 47 | def mean(numbers): 48 | """ 49 | 计算每个类中每个属性的平均值,它作为高斯分布的中值。 50 | """ 51 | return sum(numbers)/float(len(numbers)) 52 | 53 | def stdev(numbers): 54 | """ 55 | 再计算每个类中每个属性的标准差,标准差使方差的平方根。方差使每个属性值与平均值的离差平方的平均数,这里是用N-1方法,也就是在计算方差的时候,属性值的个数减1 56 | """ 57 | avg = mean(numbers) 58 | variance = sum([pow(x-avg, 2) for x in numbers]) / float(len(numbers)-1) 59 | return math.sqrt(variance) 60 | 61 | def summarize(dataset): 62 | """ 63 | 计算每个属性的平均值和标准差 64 | """ 65 | summarizes = [(mean(attribute), stdev(attribute)) for attribute in zip(*dataset)] #zip()函数的使用 66 | del summarizes[-1] #最后一个作为KEY了,所以删除 67 | return summarizes 68 | 69 | def summarizeByClass(dataset): 70 | """ 71 | 针对每个属性,生成相应的上述计算结果 72 | """ 73 | separated = separateByClass(dataset) 74 | summaries = {} 75 | for class_value, instances in separated.iteritems(): 76 | summaries[class_value] = summarize(instances) 77 | return summaries 78 | 79 | def calculateProbability(x, mean, stdev): 80 | """ 81 | 计算某个值属于某个类的可能性,概率。即高斯概率密度函数 82 | """ 83 | exponet = math.exp(-(math.pow(x-mean, 2) / (2*math.pow(stdev, 2)))) 84 | return (1 / (math.sqrt(2*math.pi)*stdev)) * exponet 85 | 86 | def calculateClassProbabilities(summaries, input_vector): 87 | """ 88 | 计算每个类别的概率,得到数据样本属于某个类的概率 89 | """ 90 | probabilities = {} 91 | for class_value, class_summaries in summaries.iteritems(): 92 | probabilities[class_value] = 1 93 | for i in range(len(class_summaries)): 94 | mean, stdev = class_summaries[i] 95 | x = input_vector[i] 96 | probabilities[class_value] *= calculateProbability(x, mean, stdev) 97 | return probabilities 98 | 99 | def predict(summaries, input_vector): 100 | """ 101 | 单一预测,计算一个数据样本属于每个类的概率之后,找出其中的最大概率,并返回关联的类 102 | """ 103 | probabilities = calculateClassProbabilities(summaries, input_vector) 104 | best_label, best_prob = None, -1 105 | for class_value, probability in probabilities.iteritems(): 106 | if best_label is None or probability > best_prob: 107 | best_prob = probability 108 | best_label = class_value 109 | return best_label 110 | 111 | def getPredictions(summaries, test_set): 112 | """ 113 | 多重预测,对测试数据中么个数据样本进行预测,并返回预测结果列表 114 | """ 115 | predictions = [] 116 | for i in range(len(test_set)): 117 | result = predict(summaries, test_set[i]) 118 | predictions.append(result) 119 | return predictions 120 | 121 | def getAccuracy(test_set, predictions): 122 | """ 123 | 检验预测结果的准确概率 124 | """ 125 | correct = 0 126 | for x in range(len(test_set)): 127 | if test_set[x][-1] == predictions[x]: 128 | correct += 1 129 | return (correct / float(len(test_set))) * 100.0 130 | 131 | def main(): 132 | filename = "pima.data.csv" 133 | split_ratio = 0.67 134 | dataset = loadCsv(filename) 135 | train, test = splitDataset(dataset, split_ratio) 136 | print 'Split {0} rows into train = {1} and test={2} rows'.format(len(dataset), len(train), len(test)) 137 | 138 | summaries_main = summarizeByClass(train) 139 | 140 | predictions_main = getPredictions(summaries_main, test) 141 | accuracy = getAccuracy(test, predictions_main) 142 | print "Accuracy: {0}%".format(accuracy) 143 | 144 | main() 145 | -------------------------------------------------------------------------------- /bayes/bayestextclassification.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | """ 5 | 使用python对文本分类,利用贝叶斯算法 6 | 来源:机器学习实践 7 | """ 8 | from numpy import * 9 | 10 | def createVocabList(data_set): 11 | """ 12 | 生成词汇列表,即将一个由单词组成的矩阵转换为词汇没有重复的列表 13 | data_set是一个由词汇组成的列表,每个子元素也是一个列表。 14 | """ 15 | vocab_set = set([]) 16 | for document in data_set: 17 | vocab_set = vocab_set | set(document) #集合合并,通过set(document)将每个列表中重复的词汇去掉 18 | return list(vocab_set) 19 | 20 | def setOfWords2Vec(vocab_list, input_set): 21 | """ 22 | 将词汇列表根据向量特征进行转化,结果是从文本中构建词汇向量 23 | """ 24 | return_vec = [0] * len(vocab_list) #创建一个与词汇列表一样长度的都是0的向量(列表) 25 | for word in input_set: 26 | if word in vocab_list: #如果词汇表中的单词在input_set中,则该词汇表向量值为1(1代表了侮辱文字),否则就是原来的0 27 | return_vec[vocab_list.index(word)] = 1 28 | else: 29 | print "the word: {0} is not in my Vocabulary!".format(word) 30 | return return_vec 31 | 32 | def bagOfWords2VecMN(vocab_list, input_set): 33 | return_vec = [0] * len(vocab_list) 34 | for word in input_set: 35 | if word in vocab_list: 36 | return_vec[vocab_list.index(word)] += 1 #功能同前函数,只是这里修改,这是文档词袋模型。 37 | else: 38 | print "the word: {0} is not in my Vocabulary!".format(word) 39 | return return_vec 40 | 41 | def trainNB0(train_matrix, train_category): 42 | """ 43 | 朴素贝叶斯分类器 44 | train_matrix:训练集合 45 | train_category:训练分类[0, 1, 0, 1, 0, 1],1 代表侮辱性文字, 0代表正常言论 46 | """ 47 | num_train_docs = len(train_matrix) 48 | print num_train_docs 49 | num_words = len(train_matrix[0]) 50 | p_abusive = sum(train_category) / float(num_train_docs) #在训练分类中侮辱性文字占训练集合的概率 51 | #p0_num = zeros(num_words) #正常文字初始概率 52 | #p1_num = zeros(num_words) #侮辱性文字初始概率 53 | #为了避免出现概率值为0 54 | p0_num = ones(num_words) #把初始值设为1 55 | p1_num = ones(num_words) 56 | #p0_denom = 0.0 57 | #p1_denom = 0.0 58 | p0_denom = 2 #将分母初始值设置为2 59 | p1_denom = 2 60 | for i in range(num_train_docs): #分成两部分 61 | if train_category[i] == 1: 62 | p1_num += train_matrix[i] #分子分别为各行所对应数值的和(最终结果为每列数值的和) 63 | p1_denom += sum(train_matrix[i]) #分母为所有数值的和 64 | else: 65 | p0_num += train_matrix[i] 66 | p0_denom += sum(train_matrix[i]) 67 | #p1_vect = p1_num / p1_denom #最终得到每个词汇在全体词汇中所占比例 68 | #p0_vect = p0_num / p0_denom 69 | #为了避免太小的数值,对上面的值取对数 70 | p1_vect = log(p1_num / p1_denom) 71 | p0_vect = log(p0_num / p0_denom) 72 | return p0_vect, p1_vect, p_abusive 73 | 74 | def classifyNB(vec2classify, p0vec, p1vec, pclass1): 75 | p1 = sum(vec2classify * p1vec) + log(pclass1) 76 | p0 = sum(vec2classify * p0vec) + log(1.0 - pclass1) 77 | if p1 > p0: 78 | return 1 79 | else: 80 | return 0 81 | 82 | def main(): 83 | data_set = [['my', 'dog', 'has', 'flea', 'problems', 'help', 'please'], 84 | ['maybe','not', 'take', 'him', 'to', 'dog', 'park', 'stupid'], 85 | ['my', 'dalmation', 'is', 'so', 'cute', 'I', 'love', 'him'], 86 | ['stop', 'posting', 'stupid', 'worthless', 'garbage'], 87 | ['mr', 'licks', 'ate', 'my', 'steak', 'how', 'to', 'stop', 'him'], 88 | ['quit', 'buying', 'worthless', 'dog', 'food', 'stupid']] 89 | 90 | class_vec = [0, 1, 0, 1, 0, 1] #分类,对应data_set的行数 91 | 92 | vocab_list = createVocabList(data_set) 93 | train_mat = [] 94 | for listindata in data_set: 95 | train_mat.append(setOfWords2Vec(vocab_list, listindata)) #以vocab_list为标准,如果listindata里的词汇在vocab_list中则为1,最终得到一个训练集合train_mat,这个矩阵的每一行都记录了data_set中所有词汇在vocab_list中出现次数,出现了就是1 96 | p0v,p1v,pab = trainNB0(array(train_mat), array(class_vec)) 97 | 98 | test_entry = ['love', 'my', 'dalmation'] 99 | this_doc = array(setOfWords2Vec(vocab_list, test_entry)) 100 | print test_entry, 'classified as:', classifyNB(this_doc, p0v, p1v,pab) 101 | 102 | 103 | main() 104 | -------------------------------------------------------------------------------- /bayes/pima.data.csv: -------------------------------------------------------------------------------- 1 | 6,148,72,35,0,33.6,0.627,50,1 2 | 1,85,66,29,0,26.6,0.351,31,0 3 | 8,183,64,0,0,23.3,0.672,32,1 4 | 1,89,66,23,94,28.1,0.167,21,0 5 | 0,137,40,35,168,43.1,2.288,33,1 6 | 5,116,74,0,0,25.6,0.201,30,0 7 | 3,78,50,32,88,31.0,0.248,26,1 8 | 10,115,0,0,0,35.3,0.134,29,0 9 | 2,197,70,45,543,30.5,0.158,53,1 10 | 8,125,96,0,0,0.0,0.232,54,1 11 | 4,110,92,0,0,37.6,0.191,30,0 12 | 10,168,74,0,0,38.0,0.537,34,1 13 | 10,139,80,0,0,27.1,1.441,57,0 14 | 1,189,60,23,846,30.1,0.398,59,1 15 | 5,166,72,19,175,25.8,0.587,51,1 16 | 7,100,0,0,0,30.0,0.484,32,1 17 | 0,118,84,47,230,45.8,0.551,31,1 18 | 7,107,74,0,0,29.6,0.254,31,1 19 | 1,103,30,38,83,43.3,0.183,33,0 20 | 1,115,70,30,96,34.6,0.529,32,1 21 | 3,126,88,41,235,39.3,0.704,27,0 22 | 8,99,84,0,0,35.4,0.388,50,0 23 | 7,196,90,0,0,39.8,0.451,41,1 24 | 9,119,80,35,0,29.0,0.263,29,1 25 | 11,143,94,33,146,36.6,0.254,51,1 26 | 10,125,70,26,115,31.1,0.205,41,1 27 | 7,147,76,0,0,39.4,0.257,43,1 28 | 1,97,66,15,140,23.2,0.487,22,0 29 | 13,145,82,19,110,22.2,0.245,57,0 30 | 5,117,92,0,0,34.1,0.337,38,0 31 | 5,109,75,26,0,36.0,0.546,60,0 32 | 3,158,76,36,245,31.6,0.851,28,1 33 | 3,88,58,11,54,24.8,0.267,22,0 34 | 6,92,92,0,0,19.9,0.188,28,0 35 | 10,122,78,31,0,27.6,0.512,45,0 36 | 4,103,60,33,192,24.0,0.966,33,0 37 | 11,138,76,0,0,33.2,0.420,35,0 38 | 9,102,76,37,0,32.9,0.665,46,1 39 | 2,90,68,42,0,38.2,0.503,27,1 40 | 4,111,72,47,207,37.1,1.390,56,1 41 | 3,180,64,25,70,34.0,0.271,26,0 42 | 7,133,84,0,0,40.2,0.696,37,0 43 | 7,106,92,18,0,22.7,0.235,48,0 44 | 9,171,110,24,240,45.4,0.721,54,1 45 | 7,159,64,0,0,27.4,0.294,40,0 46 | 0,180,66,39,0,42.0,1.893,25,1 47 | 1,146,56,0,0,29.7,0.564,29,0 48 | 2,71,70,27,0,28.0,0.586,22,0 49 | 7,103,66,32,0,39.1,0.344,31,1 50 | 7,105,0,0,0,0.0,0.305,24,0 51 | 1,103,80,11,82,19.4,0.491,22,0 52 | 1,101,50,15,36,24.2,0.526,26,0 53 | 5,88,66,21,23,24.4,0.342,30,0 54 | 8,176,90,34,300,33.7,0.467,58,1 55 | 7,150,66,42,342,34.7,0.718,42,0 56 | 1,73,50,10,0,23.0,0.248,21,0 57 | 7,187,68,39,304,37.7,0.254,41,1 58 | 0,100,88,60,110,46.8,0.962,31,0 59 | 0,146,82,0,0,40.5,1.781,44,0 60 | 0,105,64,41,142,41.5,0.173,22,0 61 | 2,84,0,0,0,0.0,0.304,21,0 62 | 8,133,72,0,0,32.9,0.270,39,1 63 | 5,44,62,0,0,25.0,0.587,36,0 64 | 2,141,58,34,128,25.4,0.699,24,0 65 | 7,114,66,0,0,32.8,0.258,42,1 66 | 5,99,74,27,0,29.0,0.203,32,0 67 | 0,109,88,30,0,32.5,0.855,38,1 68 | 2,109,92,0,0,42.7,0.845,54,0 69 | 1,95,66,13,38,19.6,0.334,25,0 70 | 4,146,85,27,100,28.9,0.189,27,0 71 | 2,100,66,20,90,32.9,0.867,28,1 72 | 5,139,64,35,140,28.6,0.411,26,0 73 | 13,126,90,0,0,43.4,0.583,42,1 74 | 4,129,86,20,270,35.1,0.231,23,0 75 | 1,79,75,30,0,32.0,0.396,22,0 76 | 1,0,48,20,0,24.7,0.140,22,0 77 | 7,62,78,0,0,32.6,0.391,41,0 78 | 5,95,72,33,0,37.7,0.370,27,0 79 | 0,131,0,0,0,43.2,0.270,26,1 80 | 2,112,66,22,0,25.0,0.307,24,0 81 | 3,113,44,13,0,22.4,0.140,22,0 82 | 2,74,0,0,0,0.0,0.102,22,0 83 | 7,83,78,26,71,29.3,0.767,36,0 84 | 0,101,65,28,0,24.6,0.237,22,0 85 | 5,137,108,0,0,48.8,0.227,37,1 86 | 2,110,74,29,125,32.4,0.698,27,0 87 | 13,106,72,54,0,36.6,0.178,45,0 88 | 2,100,68,25,71,38.5,0.324,26,0 89 | 15,136,70,32,110,37.1,0.153,43,1 90 | 1,107,68,19,0,26.5,0.165,24,0 91 | 1,80,55,0,0,19.1,0.258,21,0 92 | 4,123,80,15,176,32.0,0.443,34,0 93 | 7,81,78,40,48,46.7,0.261,42,0 94 | 4,134,72,0,0,23.8,0.277,60,1 95 | 2,142,82,18,64,24.7,0.761,21,0 96 | 6,144,72,27,228,33.9,0.255,40,0 97 | 2,92,62,28,0,31.6,0.130,24,0 98 | 1,71,48,18,76,20.4,0.323,22,0 99 | 6,93,50,30,64,28.7,0.356,23,0 100 | 1,122,90,51,220,49.7,0.325,31,1 101 | 1,163,72,0,0,39.0,1.222,33,1 102 | 1,151,60,0,0,26.1,0.179,22,0 103 | 0,125,96,0,0,22.5,0.262,21,0 104 | 1,81,72,18,40,26.6,0.283,24,0 105 | 2,85,65,0,0,39.6,0.930,27,0 106 | 1,126,56,29,152,28.7,0.801,21,0 107 | 1,96,122,0,0,22.4,0.207,27,0 108 | 4,144,58,28,140,29.5,0.287,37,0 109 | 3,83,58,31,18,34.3,0.336,25,0 110 | 0,95,85,25,36,37.4,0.247,24,1 111 | 3,171,72,33,135,33.3,0.199,24,1 112 | 8,155,62,26,495,34.0,0.543,46,1 113 | 1,89,76,34,37,31.2,0.192,23,0 114 | 4,76,62,0,0,34.0,0.391,25,0 115 | 7,160,54,32,175,30.5,0.588,39,1 116 | 4,146,92,0,0,31.2,0.539,61,1 117 | 5,124,74,0,0,34.0,0.220,38,1 118 | 5,78,48,0,0,33.7,0.654,25,0 119 | 4,97,60,23,0,28.2,0.443,22,0 120 | 4,99,76,15,51,23.2,0.223,21,0 121 | 0,162,76,56,100,53.2,0.759,25,1 122 | 6,111,64,39,0,34.2,0.260,24,0 123 | 2,107,74,30,100,33.6,0.404,23,0 124 | 5,132,80,0,0,26.8,0.186,69,0 125 | 0,113,76,0,0,33.3,0.278,23,1 126 | 1,88,30,42,99,55.0,0.496,26,1 127 | 3,120,70,30,135,42.9,0.452,30,0 128 | 1,118,58,36,94,33.3,0.261,23,0 129 | 1,117,88,24,145,34.5,0.403,40,1 130 | 0,105,84,0,0,27.9,0.741,62,1 131 | 4,173,70,14,168,29.7,0.361,33,1 132 | 9,122,56,0,0,33.3,1.114,33,1 133 | 3,170,64,37,225,34.5,0.356,30,1 134 | 8,84,74,31,0,38.3,0.457,39,0 135 | 2,96,68,13,49,21.1,0.647,26,0 136 | 2,125,60,20,140,33.8,0.088,31,0 137 | 0,100,70,26,50,30.8,0.597,21,0 138 | 0,93,60,25,92,28.7,0.532,22,0 139 | 0,129,80,0,0,31.2,0.703,29,0 140 | 5,105,72,29,325,36.9,0.159,28,0 141 | 3,128,78,0,0,21.1,0.268,55,0 142 | 5,106,82,30,0,39.5,0.286,38,0 143 | 2,108,52,26,63,32.5,0.318,22,0 144 | 10,108,66,0,0,32.4,0.272,42,1 145 | 4,154,62,31,284,32.8,0.237,23,0 146 | 0,102,75,23,0,0.0,0.572,21,0 147 | 9,57,80,37,0,32.8,0.096,41,0 148 | 2,106,64,35,119,30.5,1.400,34,0 149 | 5,147,78,0,0,33.7,0.218,65,0 150 | 2,90,70,17,0,27.3,0.085,22,0 151 | 1,136,74,50,204,37.4,0.399,24,0 152 | 4,114,65,0,0,21.9,0.432,37,0 153 | 9,156,86,28,155,34.3,1.189,42,1 154 | 1,153,82,42,485,40.6,0.687,23,0 155 | 8,188,78,0,0,47.9,0.137,43,1 156 | 7,152,88,44,0,50.0,0.337,36,1 157 | 2,99,52,15,94,24.6,0.637,21,0 158 | 1,109,56,21,135,25.2,0.833,23,0 159 | 2,88,74,19,53,29.0,0.229,22,0 160 | 17,163,72,41,114,40.9,0.817,47,1 161 | 4,151,90,38,0,29.7,0.294,36,0 162 | 7,102,74,40,105,37.2,0.204,45,0 163 | 0,114,80,34,285,44.2,0.167,27,0 164 | 2,100,64,23,0,29.7,0.368,21,0 165 | 0,131,88,0,0,31.6,0.743,32,1 166 | 6,104,74,18,156,29.9,0.722,41,1 167 | 3,148,66,25,0,32.5,0.256,22,0 168 | 4,120,68,0,0,29.6,0.709,34,0 169 | 4,110,66,0,0,31.9,0.471,29,0 170 | 3,111,90,12,78,28.4,0.495,29,0 171 | 6,102,82,0,0,30.8,0.180,36,1 172 | 6,134,70,23,130,35.4,0.542,29,1 173 | 2,87,0,23,0,28.9,0.773,25,0 174 | 1,79,60,42,48,43.5,0.678,23,0 175 | 2,75,64,24,55,29.7,0.370,33,0 176 | 8,179,72,42,130,32.7,0.719,36,1 177 | 6,85,78,0,0,31.2,0.382,42,0 178 | 0,129,110,46,130,67.1,0.319,26,1 179 | 5,143,78,0,0,45.0,0.190,47,0 180 | 5,130,82,0,0,39.1,0.956,37,1 181 | 6,87,80,0,0,23.2,0.084,32,0 182 | 0,119,64,18,92,34.9,0.725,23,0 183 | 1,0,74,20,23,27.7,0.299,21,0 184 | 5,73,60,0,0,26.8,0.268,27,0 185 | 4,141,74,0,0,27.6,0.244,40,0 186 | 7,194,68,28,0,35.9,0.745,41,1 187 | 8,181,68,36,495,30.1,0.615,60,1 188 | 1,128,98,41,58,32.0,1.321,33,1 189 | 8,109,76,39,114,27.9,0.640,31,1 190 | 5,139,80,35,160,31.6,0.361,25,1 191 | 3,111,62,0,0,22.6,0.142,21,0 192 | 9,123,70,44,94,33.1,0.374,40,0 193 | 7,159,66,0,0,30.4,0.383,36,1 194 | 11,135,0,0,0,52.3,0.578,40,1 195 | 8,85,55,20,0,24.4,0.136,42,0 196 | 5,158,84,41,210,39.4,0.395,29,1 197 | 1,105,58,0,0,24.3,0.187,21,0 198 | 3,107,62,13,48,22.9,0.678,23,1 199 | 4,109,64,44,99,34.8,0.905,26,1 200 | 4,148,60,27,318,30.9,0.150,29,1 201 | 0,113,80,16,0,31.0,0.874,21,0 202 | 1,138,82,0,0,40.1,0.236,28,0 203 | 0,108,68,20,0,27.3,0.787,32,0 204 | 2,99,70,16,44,20.4,0.235,27,0 205 | 6,103,72,32,190,37.7,0.324,55,0 206 | 5,111,72,28,0,23.9,0.407,27,0 207 | 8,196,76,29,280,37.5,0.605,57,1 208 | 5,162,104,0,0,37.7,0.151,52,1 209 | 1,96,64,27,87,33.2,0.289,21,0 210 | 7,184,84,33,0,35.5,0.355,41,1 211 | 2,81,60,22,0,27.7,0.290,25,0 212 | 0,147,85,54,0,42.8,0.375,24,0 213 | 7,179,95,31,0,34.2,0.164,60,0 214 | 0,140,65,26,130,42.6,0.431,24,1 215 | 9,112,82,32,175,34.2,0.260,36,1 216 | 12,151,70,40,271,41.8,0.742,38,1 217 | 5,109,62,41,129,35.8,0.514,25,1 218 | 6,125,68,30,120,30.0,0.464,32,0 219 | 5,85,74,22,0,29.0,1.224,32,1 220 | 5,112,66,0,0,37.8,0.261,41,1 221 | 0,177,60,29,478,34.6,1.072,21,1 222 | 2,158,90,0,0,31.6,0.805,66,1 223 | 7,119,0,0,0,25.2,0.209,37,0 224 | 7,142,60,33,190,28.8,0.687,61,0 225 | 1,100,66,15,56,23.6,0.666,26,0 226 | 1,87,78,27,32,34.6,0.101,22,0 227 | 0,101,76,0,0,35.7,0.198,26,0 228 | 3,162,52,38,0,37.2,0.652,24,1 229 | 4,197,70,39,744,36.7,2.329,31,0 230 | 0,117,80,31,53,45.2,0.089,24,0 231 | 4,142,86,0,0,44.0,0.645,22,1 232 | 6,134,80,37,370,46.2,0.238,46,1 233 | 1,79,80,25,37,25.4,0.583,22,0 234 | 4,122,68,0,0,35.0,0.394,29,0 235 | 3,74,68,28,45,29.7,0.293,23,0 236 | 4,171,72,0,0,43.6,0.479,26,1 237 | 7,181,84,21,192,35.9,0.586,51,1 238 | 0,179,90,27,0,44.1,0.686,23,1 239 | 9,164,84,21,0,30.8,0.831,32,1 240 | 0,104,76,0,0,18.4,0.582,27,0 241 | 1,91,64,24,0,29.2,0.192,21,0 242 | 4,91,70,32,88,33.1,0.446,22,0 243 | 3,139,54,0,0,25.6,0.402,22,1 244 | 6,119,50,22,176,27.1,1.318,33,1 245 | 2,146,76,35,194,38.2,0.329,29,0 246 | 9,184,85,15,0,30.0,1.213,49,1 247 | 10,122,68,0,0,31.2,0.258,41,0 248 | 0,165,90,33,680,52.3,0.427,23,0 249 | 9,124,70,33,402,35.4,0.282,34,0 250 | 1,111,86,19,0,30.1,0.143,23,0 251 | 9,106,52,0,0,31.2,0.380,42,0 252 | 2,129,84,0,0,28.0,0.284,27,0 253 | 2,90,80,14,55,24.4,0.249,24,0 254 | 0,86,68,32,0,35.8,0.238,25,0 255 | 12,92,62,7,258,27.6,0.926,44,1 256 | 1,113,64,35,0,33.6,0.543,21,1 257 | 3,111,56,39,0,30.1,0.557,30,0 258 | 2,114,68,22,0,28.7,0.092,25,0 259 | 1,193,50,16,375,25.9,0.655,24,0 260 | 11,155,76,28,150,33.3,1.353,51,1 261 | 3,191,68,15,130,30.9,0.299,34,0 262 | 3,141,0,0,0,30.0,0.761,27,1 263 | 4,95,70,32,0,32.1,0.612,24,0 264 | 3,142,80,15,0,32.4,0.200,63,0 265 | 4,123,62,0,0,32.0,0.226,35,1 266 | 5,96,74,18,67,33.6,0.997,43,0 267 | 0,138,0,0,0,36.3,0.933,25,1 268 | 2,128,64,42,0,40.0,1.101,24,0 269 | 0,102,52,0,0,25.1,0.078,21,0 270 | 2,146,0,0,0,27.5,0.240,28,1 271 | 10,101,86,37,0,45.6,1.136,38,1 272 | 2,108,62,32,56,25.2,0.128,21,0 273 | 3,122,78,0,0,23.0,0.254,40,0 274 | 1,71,78,50,45,33.2,0.422,21,0 275 | 13,106,70,0,0,34.2,0.251,52,0 276 | 2,100,70,52,57,40.5,0.677,25,0 277 | 7,106,60,24,0,26.5,0.296,29,1 278 | 0,104,64,23,116,27.8,0.454,23,0 279 | 5,114,74,0,0,24.9,0.744,57,0 280 | 2,108,62,10,278,25.3,0.881,22,0 281 | 0,146,70,0,0,37.9,0.334,28,1 282 | 10,129,76,28,122,35.9,0.280,39,0 283 | 7,133,88,15,155,32.4,0.262,37,0 284 | 7,161,86,0,0,30.4,0.165,47,1 285 | 2,108,80,0,0,27.0,0.259,52,1 286 | 7,136,74,26,135,26.0,0.647,51,0 287 | 5,155,84,44,545,38.7,0.619,34,0 288 | 1,119,86,39,220,45.6,0.808,29,1 289 | 4,96,56,17,49,20.8,0.340,26,0 290 | 5,108,72,43,75,36.1,0.263,33,0 291 | 0,78,88,29,40,36.9,0.434,21,0 292 | 0,107,62,30,74,36.6,0.757,25,1 293 | 2,128,78,37,182,43.3,1.224,31,1 294 | 1,128,48,45,194,40.5,0.613,24,1 295 | 0,161,50,0,0,21.9,0.254,65,0 296 | 6,151,62,31,120,35.5,0.692,28,0 297 | 2,146,70,38,360,28.0,0.337,29,1 298 | 0,126,84,29,215,30.7,0.520,24,0 299 | 14,100,78,25,184,36.6,0.412,46,1 300 | 8,112,72,0,0,23.6,0.840,58,0 301 | 0,167,0,0,0,32.3,0.839,30,1 302 | 2,144,58,33,135,31.6,0.422,25,1 303 | 5,77,82,41,42,35.8,0.156,35,0 304 | 5,115,98,0,0,52.9,0.209,28,1 305 | 3,150,76,0,0,21.0,0.207,37,0 306 | 2,120,76,37,105,39.7,0.215,29,0 307 | 10,161,68,23,132,25.5,0.326,47,1 308 | 0,137,68,14,148,24.8,0.143,21,0 309 | 0,128,68,19,180,30.5,1.391,25,1 310 | 2,124,68,28,205,32.9,0.875,30,1 311 | 6,80,66,30,0,26.2,0.313,41,0 312 | 0,106,70,37,148,39.4,0.605,22,0 313 | 2,155,74,17,96,26.6,0.433,27,1 314 | 3,113,50,10,85,29.5,0.626,25,0 315 | 7,109,80,31,0,35.9,1.127,43,1 316 | 2,112,68,22,94,34.1,0.315,26,0 317 | 3,99,80,11,64,19.3,0.284,30,0 318 | 3,182,74,0,0,30.5,0.345,29,1 319 | 3,115,66,39,140,38.1,0.150,28,0 320 | 6,194,78,0,0,23.5,0.129,59,1 321 | 4,129,60,12,231,27.5,0.527,31,0 322 | 3,112,74,30,0,31.6,0.197,25,1 323 | 0,124,70,20,0,27.4,0.254,36,1 324 | 13,152,90,33,29,26.8,0.731,43,1 325 | 2,112,75,32,0,35.7,0.148,21,0 326 | 1,157,72,21,168,25.6,0.123,24,0 327 | 1,122,64,32,156,35.1,0.692,30,1 328 | 10,179,70,0,0,35.1,0.200,37,0 329 | 2,102,86,36,120,45.5,0.127,23,1 330 | 6,105,70,32,68,30.8,0.122,37,0 331 | 8,118,72,19,0,23.1,1.476,46,0 332 | 2,87,58,16,52,32.7,0.166,25,0 333 | 1,180,0,0,0,43.3,0.282,41,1 334 | 12,106,80,0,0,23.6,0.137,44,0 335 | 1,95,60,18,58,23.9,0.260,22,0 336 | 0,165,76,43,255,47.9,0.259,26,0 337 | 0,117,0,0,0,33.8,0.932,44,0 338 | 5,115,76,0,0,31.2,0.343,44,1 339 | 9,152,78,34,171,34.2,0.893,33,1 340 | 7,178,84,0,0,39.9,0.331,41,1 341 | 1,130,70,13,105,25.9,0.472,22,0 342 | 1,95,74,21,73,25.9,0.673,36,0 343 | 1,0,68,35,0,32.0,0.389,22,0 344 | 5,122,86,0,0,34.7,0.290,33,0 345 | 8,95,72,0,0,36.8,0.485,57,0 346 | 8,126,88,36,108,38.5,0.349,49,0 347 | 1,139,46,19,83,28.7,0.654,22,0 348 | 3,116,0,0,0,23.5,0.187,23,0 349 | 3,99,62,19,74,21.8,0.279,26,0 350 | 5,0,80,32,0,41.0,0.346,37,1 351 | 4,92,80,0,0,42.2,0.237,29,0 352 | 4,137,84,0,0,31.2,0.252,30,0 353 | 3,61,82,28,0,34.4,0.243,46,0 354 | 1,90,62,12,43,27.2,0.580,24,0 355 | 3,90,78,0,0,42.7,0.559,21,0 356 | 9,165,88,0,0,30.4,0.302,49,1 357 | 1,125,50,40,167,33.3,0.962,28,1 358 | 13,129,0,30,0,39.9,0.569,44,1 359 | 12,88,74,40,54,35.3,0.378,48,0 360 | 1,196,76,36,249,36.5,0.875,29,1 361 | 5,189,64,33,325,31.2,0.583,29,1 362 | 5,158,70,0,0,29.8,0.207,63,0 363 | 5,103,108,37,0,39.2,0.305,65,0 364 | 4,146,78,0,0,38.5,0.520,67,1 365 | 4,147,74,25,293,34.9,0.385,30,0 366 | 5,99,54,28,83,34.0,0.499,30,0 367 | 6,124,72,0,0,27.6,0.368,29,1 368 | 0,101,64,17,0,21.0,0.252,21,0 369 | 3,81,86,16,66,27.5,0.306,22,0 370 | 1,133,102,28,140,32.8,0.234,45,1 371 | 3,173,82,48,465,38.4,2.137,25,1 372 | 0,118,64,23,89,0.0,1.731,21,0 373 | 0,84,64,22,66,35.8,0.545,21,0 374 | 2,105,58,40,94,34.9,0.225,25,0 375 | 2,122,52,43,158,36.2,0.816,28,0 376 | 12,140,82,43,325,39.2,0.528,58,1 377 | 0,98,82,15,84,25.2,0.299,22,0 378 | 1,87,60,37,75,37.2,0.509,22,0 379 | 4,156,75,0,0,48.3,0.238,32,1 380 | 0,93,100,39,72,43.4,1.021,35,0 381 | 1,107,72,30,82,30.8,0.821,24,0 382 | 0,105,68,22,0,20.0,0.236,22,0 383 | 1,109,60,8,182,25.4,0.947,21,0 384 | 1,90,62,18,59,25.1,1.268,25,0 385 | 1,125,70,24,110,24.3,0.221,25,0 386 | 1,119,54,13,50,22.3,0.205,24,0 387 | 5,116,74,29,0,32.3,0.660,35,1 388 | 8,105,100,36,0,43.3,0.239,45,1 389 | 5,144,82,26,285,32.0,0.452,58,1 390 | 3,100,68,23,81,31.6,0.949,28,0 391 | 1,100,66,29,196,32.0,0.444,42,0 392 | 5,166,76,0,0,45.7,0.340,27,1 393 | 1,131,64,14,415,23.7,0.389,21,0 394 | 4,116,72,12,87,22.1,0.463,37,0 395 | 4,158,78,0,0,32.9,0.803,31,1 396 | 2,127,58,24,275,27.7,1.600,25,0 397 | 3,96,56,34,115,24.7,0.944,39,0 398 | 0,131,66,40,0,34.3,0.196,22,1 399 | 3,82,70,0,0,21.1,0.389,25,0 400 | 3,193,70,31,0,34.9,0.241,25,1 401 | 4,95,64,0,0,32.0,0.161,31,1 402 | 6,137,61,0,0,24.2,0.151,55,0 403 | 5,136,84,41,88,35.0,0.286,35,1 404 | 9,72,78,25,0,31.6,0.280,38,0 405 | 5,168,64,0,0,32.9,0.135,41,1 406 | 2,123,48,32,165,42.1,0.520,26,0 407 | 4,115,72,0,0,28.9,0.376,46,1 408 | 0,101,62,0,0,21.9,0.336,25,0 409 | 8,197,74,0,0,25.9,1.191,39,1 410 | 1,172,68,49,579,42.4,0.702,28,1 411 | 6,102,90,39,0,35.7,0.674,28,0 412 | 1,112,72,30,176,34.4,0.528,25,0 413 | 1,143,84,23,310,42.4,1.076,22,0 414 | 1,143,74,22,61,26.2,0.256,21,0 415 | 0,138,60,35,167,34.6,0.534,21,1 416 | 3,173,84,33,474,35.7,0.258,22,1 417 | 1,97,68,21,0,27.2,1.095,22,0 418 | 4,144,82,32,0,38.5,0.554,37,1 419 | 1,83,68,0,0,18.2,0.624,27,0 420 | 3,129,64,29,115,26.4,0.219,28,1 421 | 1,119,88,41,170,45.3,0.507,26,0 422 | 2,94,68,18,76,26.0,0.561,21,0 423 | 0,102,64,46,78,40.6,0.496,21,0 424 | 2,115,64,22,0,30.8,0.421,21,0 425 | 8,151,78,32,210,42.9,0.516,36,1 426 | 4,184,78,39,277,37.0,0.264,31,1 427 | 0,94,0,0,0,0.0,0.256,25,0 428 | 1,181,64,30,180,34.1,0.328,38,1 429 | 0,135,94,46,145,40.6,0.284,26,0 430 | 1,95,82,25,180,35.0,0.233,43,1 431 | 2,99,0,0,0,22.2,0.108,23,0 432 | 3,89,74,16,85,30.4,0.551,38,0 433 | 1,80,74,11,60,30.0,0.527,22,0 434 | 2,139,75,0,0,25.6,0.167,29,0 435 | 1,90,68,8,0,24.5,1.138,36,0 436 | 0,141,0,0,0,42.4,0.205,29,1 437 | 12,140,85,33,0,37.4,0.244,41,0 438 | 5,147,75,0,0,29.9,0.434,28,0 439 | 1,97,70,15,0,18.2,0.147,21,0 440 | 6,107,88,0,0,36.8,0.727,31,0 441 | 0,189,104,25,0,34.3,0.435,41,1 442 | 2,83,66,23,50,32.2,0.497,22,0 443 | 4,117,64,27,120,33.2,0.230,24,0 444 | 8,108,70,0,0,30.5,0.955,33,1 445 | 4,117,62,12,0,29.7,0.380,30,1 446 | 0,180,78,63,14,59.4,2.420,25,1 447 | 1,100,72,12,70,25.3,0.658,28,0 448 | 0,95,80,45,92,36.5,0.330,26,0 449 | 0,104,64,37,64,33.6,0.510,22,1 450 | 0,120,74,18,63,30.5,0.285,26,0 451 | 1,82,64,13,95,21.2,0.415,23,0 452 | 2,134,70,0,0,28.9,0.542,23,1 453 | 0,91,68,32,210,39.9,0.381,25,0 454 | 2,119,0,0,0,19.6,0.832,72,0 455 | 2,100,54,28,105,37.8,0.498,24,0 456 | 14,175,62,30,0,33.6,0.212,38,1 457 | 1,135,54,0,0,26.7,0.687,62,0 458 | 5,86,68,28,71,30.2,0.364,24,0 459 | 10,148,84,48,237,37.6,1.001,51,1 460 | 9,134,74,33,60,25.9,0.460,81,0 461 | 9,120,72,22,56,20.8,0.733,48,0 462 | 1,71,62,0,0,21.8,0.416,26,0 463 | 8,74,70,40,49,35.3,0.705,39,0 464 | 5,88,78,30,0,27.6,0.258,37,0 465 | 10,115,98,0,0,24.0,1.022,34,0 466 | 0,124,56,13,105,21.8,0.452,21,0 467 | 0,74,52,10,36,27.8,0.269,22,0 468 | 0,97,64,36,100,36.8,0.600,25,0 469 | 8,120,0,0,0,30.0,0.183,38,1 470 | 6,154,78,41,140,46.1,0.571,27,0 471 | 1,144,82,40,0,41.3,0.607,28,0 472 | 0,137,70,38,0,33.2,0.170,22,0 473 | 0,119,66,27,0,38.8,0.259,22,0 474 | 7,136,90,0,0,29.9,0.210,50,0 475 | 4,114,64,0,0,28.9,0.126,24,0 476 | 0,137,84,27,0,27.3,0.231,59,0 477 | 2,105,80,45,191,33.7,0.711,29,1 478 | 7,114,76,17,110,23.8,0.466,31,0 479 | 8,126,74,38,75,25.9,0.162,39,0 480 | 4,132,86,31,0,28.0,0.419,63,0 481 | 3,158,70,30,328,35.5,0.344,35,1 482 | 0,123,88,37,0,35.2,0.197,29,0 483 | 4,85,58,22,49,27.8,0.306,28,0 484 | 0,84,82,31,125,38.2,0.233,23,0 485 | 0,145,0,0,0,44.2,0.630,31,1 486 | 0,135,68,42,250,42.3,0.365,24,1 487 | 1,139,62,41,480,40.7,0.536,21,0 488 | 0,173,78,32,265,46.5,1.159,58,0 489 | 4,99,72,17,0,25.6,0.294,28,0 490 | 8,194,80,0,0,26.1,0.551,67,0 491 | 2,83,65,28,66,36.8,0.629,24,0 492 | 2,89,90,30,0,33.5,0.292,42,0 493 | 4,99,68,38,0,32.8,0.145,33,0 494 | 4,125,70,18,122,28.9,1.144,45,1 495 | 3,80,0,0,0,0.0,0.174,22,0 496 | 6,166,74,0,0,26.6,0.304,66,0 497 | 5,110,68,0,0,26.0,0.292,30,0 498 | 2,81,72,15,76,30.1,0.547,25,0 499 | 7,195,70,33,145,25.1,0.163,55,1 500 | 6,154,74,32,193,29.3,0.839,39,0 501 | 2,117,90,19,71,25.2,0.313,21,0 502 | 3,84,72,32,0,37.2,0.267,28,0 503 | 6,0,68,41,0,39.0,0.727,41,1 504 | 7,94,64,25,79,33.3,0.738,41,0 505 | 3,96,78,39,0,37.3,0.238,40,0 506 | 10,75,82,0,0,33.3,0.263,38,0 507 | 0,180,90,26,90,36.5,0.314,35,1 508 | 1,130,60,23,170,28.6,0.692,21,0 509 | 2,84,50,23,76,30.4,0.968,21,0 510 | 8,120,78,0,0,25.0,0.409,64,0 511 | 12,84,72,31,0,29.7,0.297,46,1 512 | 0,139,62,17,210,22.1,0.207,21,0 513 | 9,91,68,0,0,24.2,0.200,58,0 514 | 2,91,62,0,0,27.3,0.525,22,0 515 | 3,99,54,19,86,25.6,0.154,24,0 516 | 3,163,70,18,105,31.6,0.268,28,1 517 | 9,145,88,34,165,30.3,0.771,53,1 518 | 7,125,86,0,0,37.6,0.304,51,0 519 | 13,76,60,0,0,32.8,0.180,41,0 520 | 6,129,90,7,326,19.6,0.582,60,0 521 | 2,68,70,32,66,25.0,0.187,25,0 522 | 3,124,80,33,130,33.2,0.305,26,0 523 | 6,114,0,0,0,0.0,0.189,26,0 524 | 9,130,70,0,0,34.2,0.652,45,1 525 | 3,125,58,0,0,31.6,0.151,24,0 526 | 3,87,60,18,0,21.8,0.444,21,0 527 | 1,97,64,19,82,18.2,0.299,21,0 528 | 3,116,74,15,105,26.3,0.107,24,0 529 | 0,117,66,31,188,30.8,0.493,22,0 530 | 0,111,65,0,0,24.6,0.660,31,0 531 | 2,122,60,18,106,29.8,0.717,22,0 532 | 0,107,76,0,0,45.3,0.686,24,0 533 | 1,86,66,52,65,41.3,0.917,29,0 534 | 6,91,0,0,0,29.8,0.501,31,0 535 | 1,77,56,30,56,33.3,1.251,24,0 536 | 4,132,0,0,0,32.9,0.302,23,1 537 | 0,105,90,0,0,29.6,0.197,46,0 538 | 0,57,60,0,0,21.7,0.735,67,0 539 | 0,127,80,37,210,36.3,0.804,23,0 540 | 3,129,92,49,155,36.4,0.968,32,1 541 | 8,100,74,40,215,39.4,0.661,43,1 542 | 3,128,72,25,190,32.4,0.549,27,1 543 | 10,90,85,32,0,34.9,0.825,56,1 544 | 4,84,90,23,56,39.5,0.159,25,0 545 | 1,88,78,29,76,32.0,0.365,29,0 546 | 8,186,90,35,225,34.5,0.423,37,1 547 | 5,187,76,27,207,43.6,1.034,53,1 548 | 4,131,68,21,166,33.1,0.160,28,0 549 | 1,164,82,43,67,32.8,0.341,50,0 550 | 4,189,110,31,0,28.5,0.680,37,0 551 | 1,116,70,28,0,27.4,0.204,21,0 552 | 3,84,68,30,106,31.9,0.591,25,0 553 | 6,114,88,0,0,27.8,0.247,66,0 554 | 1,88,62,24,44,29.9,0.422,23,0 555 | 1,84,64,23,115,36.9,0.471,28,0 556 | 7,124,70,33,215,25.5,0.161,37,0 557 | 1,97,70,40,0,38.1,0.218,30,0 558 | 8,110,76,0,0,27.8,0.237,58,0 559 | 11,103,68,40,0,46.2,0.126,42,0 560 | 11,85,74,0,0,30.1,0.300,35,0 561 | 6,125,76,0,0,33.8,0.121,54,1 562 | 0,198,66,32,274,41.3,0.502,28,1 563 | 1,87,68,34,77,37.6,0.401,24,0 564 | 6,99,60,19,54,26.9,0.497,32,0 565 | 0,91,80,0,0,32.4,0.601,27,0 566 | 2,95,54,14,88,26.1,0.748,22,0 567 | 1,99,72,30,18,38.6,0.412,21,0 568 | 6,92,62,32,126,32.0,0.085,46,0 569 | 4,154,72,29,126,31.3,0.338,37,0 570 | 0,121,66,30,165,34.3,0.203,33,1 571 | 3,78,70,0,0,32.5,0.270,39,0 572 | 2,130,96,0,0,22.6,0.268,21,0 573 | 3,111,58,31,44,29.5,0.430,22,0 574 | 2,98,60,17,120,34.7,0.198,22,0 575 | 1,143,86,30,330,30.1,0.892,23,0 576 | 1,119,44,47,63,35.5,0.280,25,0 577 | 6,108,44,20,130,24.0,0.813,35,0 578 | 2,118,80,0,0,42.9,0.693,21,1 579 | 10,133,68,0,0,27.0,0.245,36,0 580 | 2,197,70,99,0,34.7,0.575,62,1 581 | 0,151,90,46,0,42.1,0.371,21,1 582 | 6,109,60,27,0,25.0,0.206,27,0 583 | 12,121,78,17,0,26.5,0.259,62,0 584 | 8,100,76,0,0,38.7,0.190,42,0 585 | 8,124,76,24,600,28.7,0.687,52,1 586 | 1,93,56,11,0,22.5,0.417,22,0 587 | 8,143,66,0,0,34.9,0.129,41,1 588 | 6,103,66,0,0,24.3,0.249,29,0 589 | 3,176,86,27,156,33.3,1.154,52,1 590 | 0,73,0,0,0,21.1,0.342,25,0 591 | 11,111,84,40,0,46.8,0.925,45,1 592 | 2,112,78,50,140,39.4,0.175,24,0 593 | 3,132,80,0,0,34.4,0.402,44,1 594 | 2,82,52,22,115,28.5,1.699,25,0 595 | 6,123,72,45,230,33.6,0.733,34,0 596 | 0,188,82,14,185,32.0,0.682,22,1 597 | 0,67,76,0,0,45.3,0.194,46,0 598 | 1,89,24,19,25,27.8,0.559,21,0 599 | 1,173,74,0,0,36.8,0.088,38,1 600 | 1,109,38,18,120,23.1,0.407,26,0 601 | 1,108,88,19,0,27.1,0.400,24,0 602 | 6,96,0,0,0,23.7,0.190,28,0 603 | 1,124,74,36,0,27.8,0.100,30,0 604 | 7,150,78,29,126,35.2,0.692,54,1 605 | 4,183,0,0,0,28.4,0.212,36,1 606 | 1,124,60,32,0,35.8,0.514,21,0 607 | 1,181,78,42,293,40.0,1.258,22,1 608 | 1,92,62,25,41,19.5,0.482,25,0 609 | 0,152,82,39,272,41.5,0.270,27,0 610 | 1,111,62,13,182,24.0,0.138,23,0 611 | 3,106,54,21,158,30.9,0.292,24,0 612 | 3,174,58,22,194,32.9,0.593,36,1 613 | 7,168,88,42,321,38.2,0.787,40,1 614 | 6,105,80,28,0,32.5,0.878,26,0 615 | 11,138,74,26,144,36.1,0.557,50,1 616 | 3,106,72,0,0,25.8,0.207,27,0 617 | 6,117,96,0,0,28.7,0.157,30,0 618 | 2,68,62,13,15,20.1,0.257,23,0 619 | 9,112,82,24,0,28.2,1.282,50,1 620 | 0,119,0,0,0,32.4,0.141,24,1 621 | 2,112,86,42,160,38.4,0.246,28,0 622 | 2,92,76,20,0,24.2,1.698,28,0 623 | 6,183,94,0,0,40.8,1.461,45,0 624 | 0,94,70,27,115,43.5,0.347,21,0 625 | 2,108,64,0,0,30.8,0.158,21,0 626 | 4,90,88,47,54,37.7,0.362,29,0 627 | 0,125,68,0,0,24.7,0.206,21,0 628 | 0,132,78,0,0,32.4,0.393,21,0 629 | 5,128,80,0,0,34.6,0.144,45,0 630 | 4,94,65,22,0,24.7,0.148,21,0 631 | 7,114,64,0,0,27.4,0.732,34,1 632 | 0,102,78,40,90,34.5,0.238,24,0 633 | 2,111,60,0,0,26.2,0.343,23,0 634 | 1,128,82,17,183,27.5,0.115,22,0 635 | 10,92,62,0,0,25.9,0.167,31,0 636 | 13,104,72,0,0,31.2,0.465,38,1 637 | 5,104,74,0,0,28.8,0.153,48,0 638 | 2,94,76,18,66,31.6,0.649,23,0 639 | 7,97,76,32,91,40.9,0.871,32,1 640 | 1,100,74,12,46,19.5,0.149,28,0 641 | 0,102,86,17,105,29.3,0.695,27,0 642 | 4,128,70,0,0,34.3,0.303,24,0 643 | 6,147,80,0,0,29.5,0.178,50,1 644 | 4,90,0,0,0,28.0,0.610,31,0 645 | 3,103,72,30,152,27.6,0.730,27,0 646 | 2,157,74,35,440,39.4,0.134,30,0 647 | 1,167,74,17,144,23.4,0.447,33,1 648 | 0,179,50,36,159,37.8,0.455,22,1 649 | 11,136,84,35,130,28.3,0.260,42,1 650 | 0,107,60,25,0,26.4,0.133,23,0 651 | 1,91,54,25,100,25.2,0.234,23,0 652 | 1,117,60,23,106,33.8,0.466,27,0 653 | 5,123,74,40,77,34.1,0.269,28,0 654 | 2,120,54,0,0,26.8,0.455,27,0 655 | 1,106,70,28,135,34.2,0.142,22,0 656 | 2,155,52,27,540,38.7,0.240,25,1 657 | 2,101,58,35,90,21.8,0.155,22,0 658 | 1,120,80,48,200,38.9,1.162,41,0 659 | 11,127,106,0,0,39.0,0.190,51,0 660 | 3,80,82,31,70,34.2,1.292,27,1 661 | 10,162,84,0,0,27.7,0.182,54,0 662 | 1,199,76,43,0,42.9,1.394,22,1 663 | 8,167,106,46,231,37.6,0.165,43,1 664 | 9,145,80,46,130,37.9,0.637,40,1 665 | 6,115,60,39,0,33.7,0.245,40,1 666 | 1,112,80,45,132,34.8,0.217,24,0 667 | 4,145,82,18,0,32.5,0.235,70,1 668 | 10,111,70,27,0,27.5,0.141,40,1 669 | 6,98,58,33,190,34.0,0.430,43,0 670 | 9,154,78,30,100,30.9,0.164,45,0 671 | 6,165,68,26,168,33.6,0.631,49,0 672 | 1,99,58,10,0,25.4,0.551,21,0 673 | 10,68,106,23,49,35.5,0.285,47,0 674 | 3,123,100,35,240,57.3,0.880,22,0 675 | 8,91,82,0,0,35.6,0.587,68,0 676 | 6,195,70,0,0,30.9,0.328,31,1 677 | 9,156,86,0,0,24.8,0.230,53,1 678 | 0,93,60,0,0,35.3,0.263,25,0 679 | 3,121,52,0,0,36.0,0.127,25,1 680 | 2,101,58,17,265,24.2,0.614,23,0 681 | 2,56,56,28,45,24.2,0.332,22,0 682 | 0,162,76,36,0,49.6,0.364,26,1 683 | 0,95,64,39,105,44.6,0.366,22,0 684 | 4,125,80,0,0,32.3,0.536,27,1 685 | 5,136,82,0,0,0.0,0.640,69,0 686 | 2,129,74,26,205,33.2,0.591,25,0 687 | 3,130,64,0,0,23.1,0.314,22,0 688 | 1,107,50,19,0,28.3,0.181,29,0 689 | 1,140,74,26,180,24.1,0.828,23,0 690 | 1,144,82,46,180,46.1,0.335,46,1 691 | 8,107,80,0,0,24.6,0.856,34,0 692 | 13,158,114,0,0,42.3,0.257,44,1 693 | 2,121,70,32,95,39.1,0.886,23,0 694 | 7,129,68,49,125,38.5,0.439,43,1 695 | 2,90,60,0,0,23.5,0.191,25,0 696 | 7,142,90,24,480,30.4,0.128,43,1 697 | 3,169,74,19,125,29.9,0.268,31,1 698 | 0,99,0,0,0,25.0,0.253,22,0 699 | 4,127,88,11,155,34.5,0.598,28,0 700 | 4,118,70,0,0,44.5,0.904,26,0 701 | 2,122,76,27,200,35.9,0.483,26,0 702 | 6,125,78,31,0,27.6,0.565,49,1 703 | 1,168,88,29,0,35.0,0.905,52,1 704 | 2,129,0,0,0,38.5,0.304,41,0 705 | 4,110,76,20,100,28.4,0.118,27,0 706 | 6,80,80,36,0,39.8,0.177,28,0 707 | 10,115,0,0,0,0.0,0.261,30,1 708 | 2,127,46,21,335,34.4,0.176,22,0 709 | 9,164,78,0,0,32.8,0.148,45,1 710 | 2,93,64,32,160,38.0,0.674,23,1 711 | 3,158,64,13,387,31.2,0.295,24,0 712 | 5,126,78,27,22,29.6,0.439,40,0 713 | 10,129,62,36,0,41.2,0.441,38,1 714 | 0,134,58,20,291,26.4,0.352,21,0 715 | 3,102,74,0,0,29.5,0.121,32,0 716 | 7,187,50,33,392,33.9,0.826,34,1 717 | 3,173,78,39,185,33.8,0.970,31,1 718 | 10,94,72,18,0,23.1,0.595,56,0 719 | 1,108,60,46,178,35.5,0.415,24,0 720 | 5,97,76,27,0,35.6,0.378,52,1 721 | 4,83,86,19,0,29.3,0.317,34,0 722 | 1,114,66,36,200,38.1,0.289,21,0 723 | 1,149,68,29,127,29.3,0.349,42,1 724 | 5,117,86,30,105,39.1,0.251,42,0 725 | 1,111,94,0,0,32.8,0.265,45,0 726 | 4,112,78,40,0,39.4,0.236,38,0 727 | 1,116,78,29,180,36.1,0.496,25,0 728 | 0,141,84,26,0,32.4,0.433,22,0 729 | 2,175,88,0,0,22.9,0.326,22,0 730 | 2,92,52,0,0,30.1,0.141,22,0 731 | 3,130,78,23,79,28.4,0.323,34,1 732 | 8,120,86,0,0,28.4,0.259,22,1 733 | 2,174,88,37,120,44.5,0.646,24,1 734 | 2,106,56,27,165,29.0,0.426,22,0 735 | 2,105,75,0,0,23.3,0.560,53,0 736 | 4,95,60,32,0,35.4,0.284,28,0 737 | 0,126,86,27,120,27.4,0.515,21,0 738 | 8,65,72,23,0,32.0,0.600,42,0 739 | 2,99,60,17,160,36.6,0.453,21,0 740 | 1,102,74,0,0,39.5,0.293,42,1 741 | 11,120,80,37,150,42.3,0.785,48,1 742 | 3,102,44,20,94,30.8,0.400,26,0 743 | 1,109,58,18,116,28.5,0.219,22,0 744 | 9,140,94,0,0,32.7,0.734,45,1 745 | 13,153,88,37,140,40.6,1.174,39,0 746 | 12,100,84,33,105,30.0,0.488,46,0 747 | 1,147,94,41,0,49.3,0.358,27,1 748 | 1,81,74,41,57,46.3,1.096,32,0 749 | 3,187,70,22,200,36.4,0.408,36,1 750 | 6,162,62,0,0,24.3,0.178,50,1 751 | 4,136,70,0,0,31.2,1.182,22,1 752 | 1,121,78,39,74,39.0,0.261,28,0 753 | 3,108,62,24,0,26.0,0.223,25,0 754 | 0,181,88,44,510,43.3,0.222,26,1 755 | 8,154,78,32,0,32.4,0.443,45,1 756 | 1,128,88,39,110,36.5,1.057,37,1 757 | 7,137,90,41,0,32.0,0.391,39,0 758 | 0,123,72,0,0,36.3,0.258,52,1 759 | 1,106,76,0,0,37.5,0.197,26,0 760 | 6,190,92,0,0,35.5,0.278,66,1 761 | 2,88,58,26,16,28.4,0.766,22,0 762 | 9,170,74,31,0,44.0,0.403,43,1 763 | 9,89,62,0,0,22.5,0.142,33,0 764 | 10,101,76,48,180,32.9,0.171,63,0 765 | 2,122,70,27,0,36.8,0.340,27,0 766 | 5,121,72,23,112,26.2,0.245,30,0 767 | 1,126,60,0,0,30.1,0.349,47,1 768 | 1,93,70,31,0,30.4,0.315,23,0 769 | -------------------------------------------------------------------------------- /entropy/entropy.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #参考:机器学习实践 5 | #以下计算中,数据集的特征是:(1)由列表元素构成,且所有列表元素长度一致;(2)列表的最后一个元素是该列表的类别标签; 6 | 7 | from math import log 8 | 9 | def cal_shannon_ent(dataset): 10 | """ 11 | 计算指定数据集的熵 12 | """ 13 | num_entries = len(dataset) 14 | label_counts = {} 15 | for featvec in dataset: 16 | current_label = featvec[-1] #数据集dataset的最后一项使该数据的特征,例如:[[1,1,'yes'], [1,0,'no']] 17 | if current_label not in label_counts.keys(): #以特征为键,建立字典,记录每个特征的出现次数 18 | label_counts[current_label] = 0 19 | label_counts[current_label] += 1 20 | 21 | shannon_ent = 0 #熵的默认值 22 | for key in label_counts: 23 | prob = float(label_counts[key]) / num_entries 24 | shannon_ent -= prob * log(prob, 2) #以2为底求对数 25 | 26 | return shannon_ent 27 | 28 | def split_data_set(dataset, index, value): 29 | """ 30 | 按照指定的数据特征,划分数据集。index使数据集中的数据位置,value使该数据值 31 | [1,0,'no'], index=0,即第一个,value=1,即要第一个使1的数据集。也就是以哪个数据为划分依据. 32 | """ 33 | ret_data_set = [] 34 | for featvec in dataset: 35 | if featvec[index] == value: 36 | reduced_featvec = featvec[:index] 37 | reduced_featvec.extend(featvec[index+1:]) 38 | ret_data_set.append(reduced_featvec) 39 | return ret_data_set 40 | 41 | def choose_best_feature_split(dataset): 42 | """ 43 | 选择最好的数据集划分方式。也就是找到以哪一个index划分,才能得到最好的分类结果。好的标准是符合熵最小。 44 | """ 45 | num_features = len(dataset[0]) - 1 #得到除了最后的类别标签之外的特征值个数 46 | base_entropy = cal_shannon_ent(dataset) #计算数据集的熵 47 | best_info_gain = 0 48 | best_feature = -1 49 | for i in range(num_features): 50 | feat_list = [example[i] for example in dataset] #将数据集的列的值取出来 51 | unique_values = set(feat_list) #得到不重复的值 52 | new_entropy = 0.0 53 | for value in unique_values: 54 | sub_dataset = split_data_set(dataset, i, value) 55 | prob = len(sub_dataset) / float(len(dataset)) 56 | new_entropy += prob * cal_shannon_ent(sub_dataset) 57 | info_gain = base_entropy - new_entropy #将原有的熵和新计算的熵对比,如果大于零,则新的熵减小了,熵小,则向有序方向发展 58 | if (info_gain > best_info_gain): 59 | best_info_gain = info_gain 60 | best_feature = i 61 | return best_feature 62 | 63 | 64 | dataset = [[2,1,1,'yes'],[2,1,1,'yes'],[3,1,0,'no'],[4,1,1,'yes'],[0,1,1,'yes'], [0,1,0,'no'],[1,1,1,'yes']] 65 | print dataset 66 | print cal_shannon_ent(dataset) 67 | 68 | print "----" 69 | 70 | print split_data_set(dataset, 1, 1) 71 | 72 | print "*" * 10 73 | print choose_best_feature_split(dataset) 74 | -------------------------------------------------------------------------------- /fibonacci/fib.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | """ 5 | Fibonacci数列中的每一项都是该项之前的两项和。如:1,1,2,3,5,8,13... 6 | 以下的计算方法采用了维基百科(https://zh.wikipedia.org/zh-sg/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97)中的“初等代数解法” 7 | """ 8 | 9 | import numpy 10 | 11 | #计算黄金比例 12 | 13 | phi = (1 + numpy.sqrt(5)) / 2 14 | print 'Phi', phi 15 | 16 | #当某项取值不大于2百万,则最大索引值,计算方法是将前述维基百科中计算某项值的公式,赋予该项值为200万,计算索引值n 17 | #因为需要把对数的底数进行转化,所以使用对数函数log 18 | #不需要对计算结果向下取整,因为在arange()中传入参数的时候自动完成取整操作 19 | 20 | maxn = numpy.log(2 * 10 ** 6 * numpy.sqrt(5) + 0.5) / numpy.log(phi) 21 | print maxn 22 | 23 | #得到最大值的项小于上述值(200万)的索引列表 24 | #maxn本来值不是整数,但在numpy.arange()中自动向下取整,例如: 25 | #>>> numpy.arange(1, 9.8) 26 | #array([ 1., 2., 3., 4., 5., 6., 7., 8., 9. ]) 27 | 28 | n = numpy.arange(1, maxn) 29 | print n 30 | 31 | #根据前述维基百科中给出的fibonacci数列公式,计算没一项的值 32 | #注意这里的n是array()对象,不是list。从而实现了循环 33 | 34 | fib = (phi ** n - (-1 / phi) ** n) / numpy.sqrt(5) 35 | print "First 9 Fibonacci Numbers", fib[:9] 36 | 37 | #将上述结果转化为整数。 38 | 39 | fib = fib.astype(int) 40 | print "Integers", fib 41 | 42 | 43 | -------------------------------------------------------------------------------- /fibonacci/fibonacci.py: -------------------------------------------------------------------------------- 1 | #! /usr/bin/env python 2 | #coding:utf-8 3 | 4 | """ 5 | Fibonacci数列定义: 6 | 7 | F0 = 0 (n=0) 8 | F1 = 1 (n=1) 9 | Fn = F[n-1]+ F[n-2](n=>2) 10 | 11 | """ 12 | 13 | #递归,根据定义直接写 14 | #这种方法不是一个好方法,因为它的开销太大,比如计算fib1(100),就需要耐心等待较长一段时间了。 15 | 16 | def fib1(n): 17 | if n==0: 18 | return 0 19 | elif n==1: 20 | return 1 21 | else: 22 | return fib1(n-1) + fib1(n-2) 23 | 24 | 25 | #递归,进行初始化 26 | #fib1的慢,就是因为每次都要计算前面已经算过的项目.这里将上述算法进行稍微改进。 27 | 28 | memo = {0:0, 1:1} 29 | def fib2(n): 30 | if not n in memo: 31 | memo[n] = fib2(n-1)+fib2(n-2) 32 | return memo[n] 33 | 34 | #迭代 35 | 36 | def fib3(n): 37 | a, b = 0, 1 38 | for i in range(n): 39 | a, b = b, a+b 40 | return a 41 | 42 | #除了上述方法之外,还可以直接用数学运算的结果 43 | #推荐参考:http://zh.wikipedia.org/wiki/%E6%96%90%E6%B3%A2%E9%82%A3%E5%A5%91%E6%95%B0%E5%88%97中的结论 44 | 45 | #这种方法来自:http://www.cprogramto.com/fibonacci-sequence-python-code/ 46 | 47 | print('!* Fibonacci Sequence python \n') 48 | def Fibonacci_Series(): 49 | x = input('Enter Series length to print fibonacci sequence') 50 | 51 | d,e=0,1 52 | a = [] 53 | a.append(d) 54 | a.append(e) 55 | while(x!=2): 56 | c = d + e 57 | d = e 58 | e = c 59 | a.append(c) 60 | x = x -1 61 | print(a) 62 | 63 | #Output: 64 | """ 65 | !* Fibonacci Sequence python 66 | 67 | >>> Fibonacci_Series() 68 | Enter Series length to print fibonacci sequence10 69 | [0, 1, 1, 2, 3, 5, 8, 13, 21, 34] 70 | >>> 71 | """ 72 | if __name__=="__main__": 73 | 74 | Fibonacci_Series() 75 | -------------------------------------------------------------------------------- /knn/appointment.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #应用k近邻算法改进约会网站配对效果 5 | #来自:《机器学习实践》 6 | 7 | import numpy 8 | import operator 9 | 10 | class Knn(object): 11 | def creat_dataset(self): 12 | group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) #作为已经训练的数组 13 | labels = ["A", 'A', 'B', 'B'] #上述数组坐标的标签 14 | return group, labels 15 | 16 | def knn_classify(self, testx, trainx, labels, k): 17 | trainx_size = trainx.shape[0] #得到训练数组的大小 18 | diff_mat = numpy.tile(testx, (trainx_size, 1)) - trainx #将归类对象数组矩阵扩展到和训练数组一致,然后做对应项的减法 19 | square_diff_mat = diff_mat ** 2 #计算每项的差的平方 20 | square_distances = square_diff_mat.sum(axis=1) #差的平方组成了矩阵,求矩阵行的各项和(axis=1),即对应项差的平方和 21 | distances = square_distances ** 0.5 #将平方和开放 22 | sorted_distance_index = distances.argsort() #将各点得到的距离进行排序,注意:argsort返回的使对象的索引,并且按照值从小到大 23 | #sorted_distance_index = numpy.argsort(distances) 24 | 25 | class_count = {} 26 | for i in range(k): #根据设定的k值,从距离的最小到最大选k个 27 | ith_label = labels[sorted_distance_index[i]] 28 | class_count[ith_label] = class_count.get(ith_label, 0) + 1 #记录labels中的标签的出现次数 29 | 30 | sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True) #对字典键值按照值排序,从大到小,选择出现频率最高的返回 31 | return sorted_class_count[0][0] 32 | 33 | def file2matrix(self, filename): 34 | """ 35 | 将文本记录转换为矩阵,并输出,还输出一个类标签向量 36 | """ 37 | fr = open(filename) 38 | array_lines = fr.readlines() 39 | number_lines = len(array_lines) 40 | return_mat = numpy.zeros((number_lines, 3)) 41 | class_label_vector = [] 42 | index = 0 43 | for line in array_lines: 44 | line = line.strip() 45 | list_from_line = line.split(',') 46 | return_mat[index,:] = list_from_line[0:3] 47 | class_label_vector.append(int(list_from_line[-1])) 48 | index += 1 49 | return return_mat, class_label_vector 50 | 51 | k = Knn() 52 | groups, labels = k.creat_dataset() 53 | result = k.knn_classify([0, 0], groups, labels, 3) 54 | print result 55 | mat, ls = k.file2matrix("test.txt") 56 | print mat 57 | print ls 58 | -------------------------------------------------------------------------------- /knn/knn.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #k nearest neighbors algorithm k近邻算法 5 | 6 | import numpy 7 | import operator 8 | 9 | class Knn(object): 10 | def creat_dataset(self): 11 | group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]]) #作为已经训练的数组 12 | labels = ["A", 'A', 'B', 'B'] #上述数组坐标的标签 13 | return group, labels 14 | 15 | def knn_classify(self, testx, trainx, labels, k): 16 | trainx_size = trainx.shape[0] #得到训练数组的大小 17 | diff_mat = numpy.tile(testx, (trainx_size, 1)) - trainx #将归类对象数组矩阵扩展到和训练数组一致,然后做对应项的减法 18 | square_diff_mat = diff_mat ** 2 #计算每项的差的平方 19 | square_distances = square_diff_mat.sum(axis=1) #差的平方组成了矩阵,求矩阵行的各项和(axis=1),即对应项差的平方和 20 | distances = square_distances ** 0.5 #将平方和开放 21 | sorted_distance_index = distances.argsort() #将各点得到的距离进行排序,注意:argsort返回的使对象的索引,并且按照值从小到大 22 | #sorted_distance_index = numpy.argsort(distances) 23 | 24 | class_count = {} 25 | for i in range(k): #根据设定的k值,从距离的最小到最大选k个 26 | ith_label = labels[sorted_distance_index[i]] 27 | class_count[ith_label] = class_count.get(ith_label, 0) + 1 #记录labels中的标签的出现次数 28 | 29 | sorted_class_count = sorted(class_count.iteritems(), key = operator.itemgetter(1), reverse = True) #对字典键值按照值排序,从大到小,选择出现频率最高的返回 30 | return sorted_class_count[0][0] 31 | 32 | k = Knn() 33 | groups, labels = k.creat_dataset() 34 | result = k.knn_classify([0, 0], groups, labels, 3) 35 | print result 36 | -------------------------------------------------------------------------------- /knn/test.txt: -------------------------------------------------------------------------------- 1 | 7.2,7.1,2 2 | 4.2,6.1,1 3 | -------------------------------------------------------------------------------- /logistic/logistic.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | """ 4 | logistic回归 5 | """ 6 | import numpy 7 | 8 | def loadDataSet(): 9 | dataMat = [] 10 | labelMat = [] 11 | fr = open('testSet.txt') 12 | for line in fr.readlines(): 13 | lineArr = line.strip().split() 14 | dataMat.append([1.0, float(lineArr[0]), float(lineArr[1])]) 15 | labelMat.append(int(lineArr[2])) 16 | return dataMat, labelMat 17 | 18 | def sigmoid(inX): 19 | return 1.0 / (1 + numpy.exp(-inX)) 20 | 21 | def gradAscent(dataMatIn, classLabels): 22 | """ 23 | 实现梯度上升算法 24 | """ 25 | dataMatrix = numpy.mat(dataMatIn) 26 | labelMat = numpy.mat(classLabels).transpose() 27 | m, n = numpy.shape(dataMatrix) #返回矩阵的行列,m是行,n是列 28 | alpha = 0.001 29 | maxCycles = 500 30 | weights = numpy.ones((n, 1)) 31 | for k in range(maxCycles): 32 | h = sigmoid(dataMatrix * weights) 33 | error = (labelMat - h) 34 | weights = weights + alpha * dataMatrix.transpose() * error 35 | return weights 36 | 37 | dataArr, labelMat = loadDataSet() 38 | w = gradAscent(dataArr, labelMat) 39 | print w 40 | -------------------------------------------------------------------------------- /logistic/testSet.txt: -------------------------------------------------------------------------------- 1 | -0.017612 14.053064 0 2 | -1.395634 4.662541 1 3 | -0.752157 6.538620 0 4 | -1.322371 7.152853 0 5 | 0.423363 11.054677 0 6 | 0.406704 7.067335 1 7 | 0.667394 12.741452 0 8 | -2.460150 6.866805 1 9 | 0.569411 9.548755 0 10 | -0.026632 10.427743 0 11 | 0.850433 6.920334 1 12 | 1.347183 13.175500 0 13 | 1.176813 3.167020 1 14 | -1.781871 9.097953 0 15 | -0.566606 5.749003 1 16 | 0.931635 1.589505 1 17 | -0.024205 6.151823 1 18 | -0.036453 2.690988 1 19 | -0.196949 0.444165 1 20 | 1.014459 5.754399 1 21 | 1.985298 3.230619 1 22 | -1.693453 -0.557540 1 23 | -0.576525 11.778922 0 24 | -0.346811 -1.678730 1 25 | -2.124484 2.672471 1 26 | 1.217916 9.597015 0 27 | -0.733928 9.098687 0 28 | -3.642001 -1.618087 1 29 | 0.315985 3.523953 1 30 | 1.416614 9.619232 0 31 | -0.386323 3.989286 1 32 | 0.556921 8.294984 1 33 | 1.224863 11.587360 0 34 | -1.347803 -2.406051 1 35 | 1.196604 4.951851 1 36 | 0.275221 9.543647 0 37 | 0.470575 9.332488 0 38 | -1.889567 9.542662 0 39 | -1.527893 12.150579 0 40 | -1.185247 11.309318 0 41 | -0.445678 3.297303 1 42 | 1.042222 6.105155 1 43 | -0.618787 10.320986 0 44 | 1.152083 0.548467 1 45 | 0.828534 2.676045 1 46 | -1.237728 10.549033 0 47 | -0.683565 -2.166125 1 48 | 0.229456 5.921938 1 49 | -0.959885 11.555336 0 50 | 0.492911 10.993324 0 51 | 0.184992 8.721488 0 52 | -0.355715 10.325976 0 53 | -0.397822 8.058397 0 54 | 0.824839 13.730343 0 55 | 1.507278 5.027866 1 56 | 0.099671 6.835839 1 57 | -0.344008 10.717485 0 58 | 1.785928 7.718645 1 59 | -0.918801 11.560217 0 60 | -0.364009 4.747300 1 61 | -0.841722 4.119083 1 62 | 0.490426 1.960539 1 63 | -0.007194 9.075792 0 64 | 0.356107 12.447863 0 65 | 0.342578 12.281162 0 66 | -0.810823 -1.466018 1 67 | 2.530777 6.476801 1 68 | 1.296683 11.607559 0 69 | 0.475487 12.040035 0 70 | -0.783277 11.009725 0 71 | 0.074798 11.023650 0 72 | -1.337472 0.468339 1 73 | -0.102781 13.763651 0 74 | -0.147324 2.874846 1 75 | 0.518389 9.887035 0 76 | 1.015399 7.571882 0 77 | -1.658086 -0.027255 1 78 | 1.319944 2.171228 1 79 | 2.056216 5.019981 1 80 | -0.851633 4.375691 1 81 | -1.510047 6.061992 0 82 | -1.076637 -3.181888 1 83 | 1.821096 10.283990 0 84 | 3.010150 8.401766 1 85 | -1.099458 1.688274 1 86 | -0.834872 -1.733869 1 87 | -0.846637 3.849075 1 88 | 1.400102 12.628781 0 89 | 1.752842 5.468166 1 90 | 0.078557 0.059736 1 91 | 0.089392 -0.715300 1 92 | 1.825662 12.693808 0 93 | 0.197445 9.744638 0 94 | 0.126117 0.922311 1 95 | -0.679797 1.220530 1 96 | 0.677983 2.556666 1 97 | 0.761349 10.693862 0 98 | -2.168791 0.143632 1 99 | 1.388610 9.341997 0 100 | 0.317029 14.739025 0 101 | -------------------------------------------------------------------------------- /masked/ingorespecilalnum.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #忽略负值和极大或者极小值 5 | #来源:NUMPY攻略 6 | 7 | import numpy 8 | import pandas.io.data 9 | import sys 10 | import matplotlib.pyplot 11 | 12 | def get_close(ticker): 13 | quotes = pandas.io.data.DataReader(ticker, "yahoo", start="2014/9/17") #从雅虎财经上获得某股票的数据 14 | return numpy.array([q for q in quotes['Close']]) #返回某数据(收盘价) 15 | 16 | close = get_close("BABA") #得到阿里巴巴的股价 17 | 18 | triples = numpy.arange(0, len(close), 3) #创建一个数组,数组的元素使从0到len(close)中能够被3整除的数 19 | print "Triples", triples[:10] #打印前十个看看 20 | 21 | signs = numpy.ones(len(close)) 22 | print "Signs", signs[:10] 23 | signs[triples] = -1 24 | print "Signs", signs[:10] 25 | 26 | ma_log = numpy.ma.log(close * signs) #close*signs 制造出数组中某些股价数据使负数(被3整除的项股价变成了负数),对该数组中每个数计算对数 27 | print "Masked logs", ma_log[:10] 28 | 29 | dev = close.std() #得到标准差 30 | avg = close.mean() #得到平均数 31 | inside = numpy.ma.masked_outside(close, avg - dev, avg + dev) #比平均数大或者小一个标准差的数,列为极值。只要在这个范围以内的数值 32 | print "Inside", inside[:10] 33 | 34 | matplotlib.pyplot.subplot(311) 35 | matplotlib.pyplot.title("Original") 36 | matplotlib.pyplot.plot(close) 37 | 38 | matplotlib.pyplot.subplot(312) 39 | matplotlib.pyplot.title("Log Masked") 40 | matplotlib.pyplot.plot(numpy.exp(ma_log)) 41 | 42 | matplotlib.pyplot.subplot(313) 43 | matplotlib.pyplot.title("Not Extreme") 44 | matplotlib.pyplot.plot(inside) 45 | 46 | matplotlib.pyplot.show() 47 | -------------------------------------------------------------------------------- /mergeimages/load_image_memory.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | """ 4 | 随机生成各种颜色的小方块 5 | """ 6 | import numpy 7 | import matplotlib.pyplot 8 | 9 | N = 512 10 | 11 | NSQUARES = 85 12 | 13 | #初始化 14 | img = numpy.zeros((N, N), numpy.uint8) 15 | centers = numpy.random.random_integers(0, N, size=(NSQUARES, 2)) 16 | radii = numpy.random.randint(0, N/9, size=NSQUARES) 17 | colors = numpy.random.randint(100, 255, size=NSQUARES) 18 | 19 | #生成小方块 20 | for i in xrange(NSQUARES): 21 | xindices = range(centers[i][0] - radii[i], centers[i][0] + radii[i]) 22 | xindices = numpy.clip(xindices, 0, N - 1) 23 | yindices = range(centers[i][1] - radii[i], centers[i][1] + radii[i]) 24 | yindices = numpy.clip(yindices, 0, N - 1) 25 | 26 | if len(xindices) == 0 or len(yindices) == 0: 27 | continue 28 | 29 | coordinates = numpy.meshgrid(xindices, yindices) 30 | img[coordinates] = colors[i] 31 | 32 | #加载到内存映射区 33 | img.tofile('random_squares.raw') 34 | img_memmap = numpy.memmap('random_squares.raw', shape = img.shape) 35 | 36 | #显示图像 37 | matplotlib.pyplot.imshow(img_memmap) 38 | matplotlib.pyplot.axis('off') 39 | matplotlib.pyplot.show() 40 | -------------------------------------------------------------------------------- /numpystr/numpystr.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | #numpy的chararray对象,专门存放字符串。优点:用索引获取数组元素时,字符串中多余的空格会自动删除;做比较运算时,字符串后端的空格会自动删除;支持向量化的字符串操作,不需要使用循环语句 5 | 6 | import urllib2 7 | import numpy 8 | import re 9 | 10 | response = urllib2.urlopen("http://www.itdiffer.com") 11 | html = response.read() 12 | html = re.sub(r'<.*?>', '', html) 13 | carray = numpy.array(html).view(numpy.chararray) 14 | carray = carray.expandtabs(1) #把tab字符替换为空格,参数为空格数 15 | carray = carray.splitlines() #按行分割字符串 16 | 17 | print carray 18 | -------------------------------------------------------------------------------- /primefactor.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | """ 4 | 来自《numpy功略》p45 5 | 寻找某个数字的最大质因数使多少. 6 | """ 7 | import numpy 8 | 9 | N = 600851475143 10 | LIM = 10 ** 6 11 | 12 | def factor(n): 13 | #创建尝试值数组 14 | a = numpy.ceil(numpy.sqrt(n)) 15 | lim = min(n, LIM) 16 | a = numpy.arange(a, a + lim) 17 | b2 = a ** 2 - n 18 | 19 | #检查数组b2中的元素是否使某个整数的平方 20 | fractions = numpy.modf(numpy.sqrt(b2))[0] 21 | 22 | #检查小数部分为0的数组元素 23 | indices = numpy.where(fractions == 0) 24 | 25 | #找到第一个小数部分为0的数组元素 26 | a = numpy.ravel(numpy.take(a, indices))[0] 27 | a = int(a) 28 | b = numpy.sqrt(a ** 2 - n) 29 | b = int(b) 30 | c = a + b 31 | d = a - b 32 | 33 | if c == 1 or d == 1: 34 | return 35 | 36 | print c, d 37 | factor(c) 38 | factor(d) 39 | 40 | factor(N) 41 | -------------------------------------------------------------------------------- /profiler/matmult.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | import numpy 5 | import time 6 | 7 | @profile 8 | def multiply(n): 9 | A = numpy.random.rand(n, n) 10 | time.sleep(numpy.random.randint(0, 2)) 11 | return numpy.matrix(A) ** 2 12 | 13 | for n in 2 ** numpy.arange(0, 10): 14 | multiply(n) 15 | 16 | -------------------------------------------------------------------------------- /pythagorean/pythagorean.py: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env python 2 | # coding=utf-8 3 | 4 | import numpy 5 | import numpy.testing 6 | 7 | #三个自然数a,b,c,(假设a